Commit 94f0f39fd55c755d56e9d9ccf96b01dd25dcc13e
1 parent
c9561fac
Exists in
master
Ajustes diversos para nova versao em bootstrap
Showing
34 changed files
with
1699 additions
and
29 deletions
Show diff stats
Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt
| ... | ... | @@ -51,7 +51,7 @@ |
| 51 | 51 | <span class="glyphicon glyphicon-warning-sign" aria-hidden="true"></span> <strong>[% Translate("The following maintenances are in progress") | html %]</strong> |
| 52 | 52 | </div> |
| 53 | 53 | <div class="panel-body"> |
| 54 | - <ol"> | |
| 54 | + <ol> | |
| 55 | 55 | [% RenderBlockStart("MaintenanceLine") %] |
| 56 | 56 | <li>[% Data.Message %] ([% Translate("Started at: ") | html %] [% Data.StartDate %])</li> |
| 57 | 57 | [% RenderBlockEnd("MaintenanceLine") %] | ... | ... |
Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt
| ... | ... | @@ -18,9 +18,7 @@ |
| 18 | 18 | <div class="panel-body"> |
| 19 | 19 | <h2>[% Translate("Your ticket has been registered with the number: ") | html %]<strong>[% Data.TicketNumber %]</strong></h2> |
| 20 | 20 | <div class="btn-group-vertical pull-right" style="margin-top: 50px"> |
| 21 | - <button type="button" class="btn btn-default"> | |
| 22 | - <a href="/otrs/[% Data.Module %].pl?Action=NewTicketWizard[% Data.PublicMode %]">[% Translate("Click here to open another ticket") | html %]</a> | |
| 23 | - </button> | |
| 21 | + <a class="btn btn-default" href="/otrs/[% Data.Module %].pl?Action=NewTicketWizard[% Data.PublicMode %]">[% Translate("Click here to open another ticket") | html %]</a> | |
| 24 | 22 | </div> |
| 25 | 23 | </div> |
| 26 | 24 | </div> | ... | ... |
Kernel/System/TicketWizard.pm
| ... | ... | @@ -201,6 +201,7 @@ sub BuildServices { |
| 201 | 201 | my $ConfigObject = $Kernel::OM->Get("Kernel::Config"); |
| 202 | 202 | my $ServiceObject = $Kernel::OM->Get("Kernel::System::Service"); |
| 203 | 203 | my $RestrictedObject = $Kernel::OM->Get("Kernel::System::RestrictedService"); |
| 204 | + my $Public = $Param{Public}; | |
| 204 | 205 | |
| 205 | 206 | # Build service chooser |
| 206 | 207 | my %Services = (); |
| ... | ... | @@ -218,7 +219,7 @@ sub BuildServices { |
| 218 | 219 | |
| 219 | 220 | for my $serviceID ( keys %Services ) { |
| 220 | 221 | if ( grep { index( $Services{$_}, $Services{$serviceID} . "::" ) >= 0 } ( keys %Services ) ) { |
| 221 | - if (! ( $serviceID ~~ @restrictedServices ) ) { | |
| 222 | + if ((! $Public) || (! ( $serviceID ~~ @restrictedServices ))) { | |
| 222 | 223 | my %serv = (); |
| 223 | 224 | $serv{Value} = $Services{$serviceID}; |
| 224 | 225 | $serv{Key} = $serviceID; |
| ... | ... | @@ -227,7 +228,7 @@ sub BuildServices { |
| 227 | 228 | } |
| 228 | 229 | } |
| 229 | 230 | else { |
| 230 | - if (! ( $serviceID ~~ @restrictedServices ) ) { | |
| 231 | + if ((! $Public) || (! ( $serviceID ~~ @restrictedServices ))) { | |
| 231 | 232 | my %serv = (); |
| 232 | 233 | $serv{Value} = $Services{$serviceID}; |
| 233 | 234 | $serv{Key} = $serviceID; |
| ... | ... | @@ -238,7 +239,16 @@ sub BuildServices { |
| 238 | 239 | |
| 239 | 240 | @ServicesCombo = sort { $a->{Value} . "::" cmp $b->{Value} . "::" } @ServicesCombo; |
| 240 | 241 | |
| 241 | - my $retorno = "<select id=\"ServiceID\" data-live-search-normalize=\"true\" class=\"selectpicker\" data-live-search=\"true\">\n<option value=\"\">-</option>"; | |
| 242 | + my $retorno = ""; | |
| 243 | + my $servicePreDefined = $ParamObject->GetParam( Param => "ServiceID" ); | |
| 244 | + $retorno = "<select data-width=\"auto\" id=\"ServiceID\" data-live-search-normalize=\"true\" class=\"selectpicker\" data-live-search=\"true\">\n<option value=\"\">-</option>"; | |
| 245 | + | |
| 246 | + if ($servicePreDefined) { | |
| 247 | + $Self->Debug("Service specified: $servicePreDefined"); | |
| 248 | + } else { | |
| 249 | + $Self->Debug("Service not specified"); | |
| 250 | + | |
| 251 | + } | |
| 242 | 252 | my $inOpt = 0; |
| 243 | 253 | |
| 244 | 254 | for my $service (@ServicesCombo) { |
| ... | ... | @@ -249,7 +259,11 @@ sub BuildServices { |
| 249 | 259 | $inOpt = 1; |
| 250 | 260 | $retorno = $retorno . "<optgroup label='" . $service->{Value} . "'>\n"; |
| 251 | 261 | } else { |
| 252 | - $retorno = $retorno . "<option value='" . $service->{Key} . "'>" . $Self->LastPart($service->{Value}) . "</option>\n"; | |
| 262 | + if ($servicePreDefined eq $service->{Key}) { | |
| 263 | + $retorno = $retorno . "<option selected value='" . $service->{Key} . "'>" . $Self->LastPart($service->{Value}) . "</option>\n"; | |
| 264 | + } else { | |
| 265 | + $retorno = $retorno . "<option value='" . $service->{Key} . "'>" . $Self->LastPart($service->{Value}) . "</option>\n"; | |
| 266 | + } | |
| 253 | 267 | } |
| 254 | 268 | } |
| 255 | 269 | |
| ... | ... | @@ -378,8 +392,12 @@ sub UploadFileReceive() { |
| 378 | 392 | ); |
| 379 | 393 | } |
| 380 | 394 | |
| 395 | + my $clearName = $tmpFile{Filename}; | |
| 396 | + $clearName =~ tr/0-9a-zA-Z\.\-/\_/c; | |
| 397 | + $tmpFile{Filename} = $clearName; | |
| 398 | + | |
| 381 | 399 | $Self->Debug("FileUpload: Adding file to cache. FormID: " . $formId . " \t Filename: " . $tmpFile{Filename} . " \t ContentType: " . $tmpFile{ContentType} ); |
| 382 | - | |
| 400 | + | |
| 383 | 401 | $WebUploadCacheObject->FormIDAddFile( |
| 384 | 402 | FormID => $formId, |
| 385 | 403 | Filename => $tmpFile{Filename}, |
| ... | ... | @@ -626,33 +644,33 @@ sub AdjustFixedFields { |
| 626 | 644 | |
| 627 | 645 | my $fieldKey = $data[0]; |
| 628 | 646 | my $fixedValue = $data[1]; |
| 647 | + | |
| 648 | + $Self->Debug("Adjusting fixed field { $fieldKey } with value [ $fixedValue ]"); | |
| 629 | 649 | |
| 630 | 650 | my $key = '("' . $fieldKey . '"[\ ]?:[\ ]?{[^}]+})'; |
| 631 | 651 | my $replace = '"' . $fieldKey . '"' . ': {"type": "string", "default": "' . $fixedValue . '"}'; |
| 652 | + | |
| 653 | + $Self->Debug("Adjusting fixed fields in schema: \n " . $schema); | |
| 632 | 654 | |
| 633 | 655 | $schema =~ s/$key/$replace/; |
| 634 | 656 | |
| 657 | + $Self->Debug("Adjusting fixed fields in form: \n " . $form); | |
| 658 | + | |
| 635 | 659 | $form = "{" . $form . "}"; |
| 636 | - #print STDERR "\n\n" . $form . "\n\n"; | |
| 637 | - my $formStruct = decode_json(encode_utf8($form)); | |
| 660 | + $form = encode_utf8($form); | |
| 661 | + my $formStruct = decode_json($form); | |
| 638 | 662 | my $hiddenStruct = {}; |
| 639 | 663 | $hiddenStruct->{"type"} = "hidden"; |
| 640 | 664 | $formStruct->{$fieldKey} = $hiddenStruct; |
| 641 | 665 | |
| 642 | - #print STDERR "\n\n" . Dumper($formStruct) . "\n\n"; | |
| 643 | - | |
| 644 | - $form = decode_utf8(encode_json($formStruct)); | |
| 645 | - #print STDERR "\n\n" . $form . "\n\n"; | |
| 666 | + print STDERR Dumper($formStruct); | |
| 667 | + | |
| 668 | + $form = encode_json($formStruct); | |
| 669 | + $form = decode_utf8($form); | |
| 646 | 670 | substr($form, 0, 1, ""); |
| 647 | - substr($form, -1, 1, ""); | |
| 648 | - print STDERR "\n\n" . $form . "\n\n"; | |
| 649 | - # | |
| 650 | - #$key = '("' . $fieldKey . '"[\ ]?:[\ ]?{[^}]+})'; | |
| 651 | - #$replace = '"' . $fieldKey . '": {"type": "hidden"' . "\n}"; | |
| 652 | - #$form =~ s/$key/$replace/; | |
| 671 | + substr($form, -1, 1, ""); | |
| 653 | 672 | } |
| 654 | 673 | |
| 655 | - #print STDERR "\n\n" . $form . "\n\n" . $schema . "\n\n"; | |
| 656 | 674 | return ($schema, $form); |
| 657 | 675 | } |
| 658 | 676 | |
| ... | ... | @@ -1032,7 +1050,7 @@ sub OpenForm { |
| 1032 | 1050 | |
| 1033 | 1051 | |
| 1034 | 1052 | # Build service chooser |
| 1035 | - $Data{ServiceStrg} = $TicketWizard->BuildServices(ServiceID => $ParamObject->GetParam( Param => "ServiceID" )); | |
| 1053 | + $Data{ServiceStrg} = $TicketWizard->BuildServices(ServiceID => $ParamObject->GetParam( Param => "ServiceID" ), Public => $Param{Public}); | |
| 1036 | 1054 | |
| 1037 | 1055 | # Build output |
| 1038 | 1056 | my $Output = $LayoutObject->CustomerHeader(Type => $idCustomTemplate, Title => $LayoutObject->{LanguageObject}->Translate("New ticket wizard") ); | ... | ... |
| ... | ... | @@ -0,0 +1,105 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.0</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.0">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-20 18:05:35</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2FscGFjYS5taW4uanM8L0phdmFTY3JpcHQ+CgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5qczwvSmF2YVNjcmlwdD4JCQkJCQkJCQkJCgkJCSAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmpzPC9KYXZhU2NyaXB0PgogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0Pk5ld1RpY2tldFdpemFyZC5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8Q1NTPmFscGFjYS9hbHBhY2EubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5jc3M8L0NTUz4KCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3M8L0NTUz4JCQkJCQkJCQkJCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAubWluLmNzczwvQ1NTPgoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAoJCQkJICAidHlwZSI6IHsKICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAiZW51bSI6IFsKICAgICAgT1RSU190eXBlX3ZhbHVlcwogICAgXSwKICAgICJyZXF1aXJlZCI6ICJ0cnVlIgogIH0KICBDRl9TQ0hFTUEKICAsCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKCSJhdHRhY2htZW50IjogewogICAgInR5cGUiOiAic3RyaW5nIiwKCSJmb3JtYXQiOiAidXJpIgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmQiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTG9jYWw6IgogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJOb21lOiIKICAgIAogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAiZW1haWwiLAogICAgImxhYmVsIjogIkUtbWFpbDoiLAoJImhlbHBlciI6ICJBYnJpbmRvIGNvbSBzZXUgZS1tYWlsIGluc3RpdHVjaW9uYWwsIHNldSBhdGVuZGltZW50byBzZXLDoSBtYWlzIHLDoXBpZG8iCiAgICAKICB9LAkJCQkJCQkJCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiVGVsZWZvbmU6IiwKICAgICJjb250cm9sX3dpZHRoIjogMTAwCiAgfSwKICAidHlwZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwKICAgICJsYWJlbCI6ICJNb3Rpdm86IiwKICAgICJvcHRpb25MYWJlbHMiOiBbCiAgICAgIE9UUlNfdHlwZV9sYWJlbHMKICAgIF0KICB9LAogICJzZXJ2aWNlIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KICBDRl9GT1JNLAogICJzdWJqZWN0IjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiQXNzdW50bzoiLAogICAgInNpemUiOiA4MAogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAiY2tlZGl0b3IiLAogICAgImxhYmVsIjogIkRlc2NyacOnw6NvOiIsCiAgICAiY29scyI6IDgwLAoJImNrZWRpdG9yIjogewoJCSJ0b29sYmFyIjogWwogICAgICAgICAgICBbIkZvbnQiLCAiRm9udFNpemUiLCAiLSIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiLSIsICJOdW1iZXJlZExpc3QiLCAiQnVsbGV0ZWRMaXN0IiwgIi0iLCAiUGFzdGUiXSwKICAgICAgICAJWyJJbWFnZSIsICJUYWJsZSIsICItIiwgIkxpbmsiXQogICAgCV0KCX0KICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2FscGFjYS5taW4uanM8L0phdmFTY3JpcHQ+CgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5qczwvSmF2YVNjcmlwdD4JCQkJCQkJCQkJCgkJCSAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmpzPC9KYXZhU2NyaXB0PgogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0Pk5ld1RpY2tldFdpemFyZC5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8Q1NTPmFscGFjYS9hbHBhY2EubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5jc3M8L0NTUz4KCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3M8L0NTUz4JCQkJCQkJCQkJCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAubWluLmNzczwvQ1NTPgoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWFQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAkJCQkJCQkKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAibnVtYmVyIiwKICAgICJlbnVtIjogWwogICAgICBPVFJTX3R5cGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0KICBDRl9TQ0hFTUEKICAsCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAoJImF0dGFjaG1lbnQiOiB7CiAgICAidHlwZSI6ICJhcnJheSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkUHVibGljIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm1QdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0KICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIKICB9LAogICJuYW1lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTm9tZToiCiAgICAKICB9LAogICJlbWFpbCI6IHsKICAgICJ0eXBlIjogImVtYWlsIiwKICAgICJsYWJlbCI6ICJFLW1haWw6IiwKCSJoZWxwZXIiOiAiQWJyaW5kbyBjb20gc2V1IGUtbWFpbCBpbnN0aXR1Y2lvbmFsLCBzZXUgYXRlbmRpbWVudG8gc2Vyw6EgbWFpcyByw6FwaWRvIgogICAgCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldCgl9CiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VzUGFuZWwiKSAlXQo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC13YXJuaW5nIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24td2FybmluZy1zaWduIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPiA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzIikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KICAJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPG9sIj4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQk8Zm9ybT4KCQkJPHNwYW4+CgkJICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOgogICAgICAgICAJPC9zcGFuPgoJCQk8c3BhbiBpZD0ic2VydmljZURJViI+CQogICAgICAgICAJCVslIERhdGEuU2VydmljZVN0cmcgJV0gICAgICAKICAgICAgICAgCTwvc3Bhbj4gICAgICAgICAgICAgIAoJCTwvZm9ybT4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9IiI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSIpIHwgaHRtbCAlXTwvQT4KWyUgUmVuZGVyQmxvY2tFbmQoIlVuYXV0aGVudGljYXRlZE1lc3NhZ2UiKSAlXQkJCQoJPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiIGlkPSJmb3JtUGFuZWwiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlBsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0IikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5IiBpZD0iZm9ybVRpY2tldCI+CgkKCTwvZGl2Pgo8L2Rpdj4KIAogPHNjcmlwdCBzcmM9IlslIENvbmZpZygiRnJvbnRlbmQ6OlJpY2hUZXh0UGF0aCIpICVdY2tlZGl0b3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkvLyBUbyB0dXJuIG9uIGRlYnVnZ2luZywgdW5jb21tZW50IHRoaXMgbGluZQoJLy9BbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuREVCVUc7CgkvL0FscGFjYS51cGxvYWRJbWFnZVVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJLy9BbHBhY2EuZmlsZWJyb3dzZXJJbWFnZVVwbG9hZFVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCglBbHBhY2Euc2V0RGVmYXVsdExvY2FsZSgicHRfQlIiKTsKCQkJCglBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkJIm5vbmVMYWJlbCI6ICItIiwKCX0pOwoJCgkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKCSAgIAkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOwogICAJCX0gZWxzZSB7CiAgIAkJCWRlc3RydWlyRm9ybSgpOwogICAJCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbCgiIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5oaWRlKCk7CiAgIAkJfSAgCQogIAl9KTsKICAJCiAgIAlpZiAoJCgiI1NlcnZpY2VJRCIpLmhhcygnW3NlbGVjdGVkXScpKSB7CiAgCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CiAgCQkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIpOwogIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7ICAJCQkgIAkJCQogIAkJfQogIAl9Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgZGF0YS13aWR0aD1cImF1dG9cIiBpZD1cIlNlcnZpY2VJRFwiIGNsYXNzPVwic2VsZWN0cGlja2VyXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIj5cbjxvcHRpb24gdmFsdWU9XCJcIj4tPC9vcHRpb24+IjsKCW15ICRpbk9wdCA9IDA7CgoJZm9yIG15ICRzZXJ2aWNlIChAU2VydmljZXNDb21ibykgewoJCWlmICgkc2VydmljZS0+e0Rpc2FibGVkfSkgewoJCQlpZiAoJGluT3B0KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJCQl9CgkJCSRpbk9wdCA9IDE7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGdyb3VwIGxhYmVsPSciIC4gJHNlcnZpY2UtPntWYWx1ZX0gLiAiJz5cbiI7CgkJfSBlbHNlIHsKCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8b3B0aW9uIHZhbHVlPSciIC4gJHNlcnZpY2UtPntLZXl9IC4gIic+IiAuICRTZWxmLT5MYXN0UGFydCgkc2VydmljZS0+e1ZhbHVlfSkgLiAiPC9vcHRpb24+XG4iOwoJCX0KCX0KCQoJaWYgKCRpbk9wdCkgewoJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9vcHRncm91cD5cbiI7Cgl9CgkKCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9zZWxlY3Q+XG4iOwoKCXJldHVybiAkcmV0b3JubzsKfQoKPWhlYWQKUmV0dXJucyBzZXJ2aWNlIG5hbWUgd2l0aG91dCB0aGUgcGFyZW50IHNlcnZpY2VzIG5hbWVzCj1jdXQKc3ViIExhc3RQYXJ0IHsKCW15ICRTZWxmICA9IHNoaWZ0OwoJbXkgJHF1ZXVlID0gc2hpZnQ7CglteSBAcGFydHMgPSBzcGxpdCggIjo6IiwgJHF1ZXVlICk7CglyZXR1cm4gJHBhcnRzWy0xXTsKfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgkKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIlVwbG9hZEZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJVcGxvYWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlUmVjZWl2ZSgpOwkJCgl9IGVsc2lmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIkRlbGV0ZUZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJEZWxldGUgdXBsb2FkZWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlRGVsZXRlKCk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJVbmtub3duIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAxOwoJfQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVcGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVEZWxldGUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkZmlsZU5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGaWxlbmFtZSIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZSBmaWxlICRmaWxlTmFtZSBmcm9tIGZvcm0gJGZvcm1JZCIpOwoJCglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJbXkgJGZpbGVEZWxldGVkID0gMDsKCQkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCWlmICgkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9IGVxICRmaWxlTmFtZSkgewoJCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZUlEfSk7CgkJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkZmlsZU5hbWUpOwoJCQkkZmlsZURlbGV0ZWQgPSAxOwoJCX0KCX0KCQoJaWYgKCRmaWxlRGVsZXRlZCkgewoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCQlDb250ZW50ICAgICA9PiAieyAkZmlsZU5hbWU6IHRydWV9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsJCQkKCX0gZWxzZSB7CgkJcmV0dXJuIDE7Cgl9CQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVUGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVSZWNlaXZlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoKCW15ICV0bXBGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoUGFyYW0gPT4gImF0dGFjaG1lbnRfZmlsZXMiKTsJCglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZvcm1JRCIgKTsKCglpZiAoISAkdG1wRmlsZXtGaWxlbmFtZX0gfHwgISAkZm9ybUlkKSB7CgkJbXkgJG1zZ0Vycm9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbnZhbGlkIGZpbGUhIik7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7IFwiZXJyb3JcIjogXCIkbXNnRXJyb3JcIiwgXCJmaWxlc1wiOiBbXSB9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsKCX0KCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IEFkZGluZyBmaWxlIHRvIGNhY2hlLiBGb3JtSUQ6ICIgLiAkZm9ybUlkIC4gIiBcdCBGaWxlbmFtZTogIiAuICR0bXBGaWxle0ZpbGVuYW1lfSAuICIgXHQgQ29udGVudFR5cGU6ICIgLiAkdG1wRmlsZXtDb250ZW50VHlwZX0gKTsKCQoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoKCW15ICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApID0gJFNlbGYtPkdldEZvcm0oIFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSwgU2VydmljZUZvcm0gPT4gXCVzZXJ2aWNlRm9ybSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCglyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+ICJbeyIgLiAkc2NoZW1hIC4gIn0sIHsiIC4gJGZpZWxkcyAuICJ9LCBcIiIgLiAkaW50cm9kdWN0aW9uIC4gIlwiXSIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkCkFsbG93cyB1c2luZyBhIGZpZWxkIGluIHRoZSBmb3JtIHRvIHNlbGVjdCBhIHRhcmdldCBxdWV1ZS4KSWYgYSBxdWV1ZSB3YXMgZGVmaW5lZCBpbiByZXF1ZXN0IHBhcmFtZXRlciwgdXNlcyBpdC4KSWYgdGhlcmUgaXMgYSBwcmVmaXggZGVmaW5lZCBmb3IgdGhlIHF1ZXVlcyB0byBhdXRvbWF0aWNhbGx5IGZvcndhcmQgdGlja2V0cywKYW5kIGFsc28gYSBmaWVsZCB3YXMgZGVmaW5lZCBhcyBoYW5kbGluZyB0aGUgdGFyZ2V0IHF1ZXVlLCB0cnkgdG8gbG9jYXRlIG9uZS4KCklmIG5vbmUgaXMgZm91bmQsIHVzZXMgdGhlIGRlZmF1bHQgcXVldWUuCgpGb3IgZXhhbXBsZToKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZVByZWZpeCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZUZpZWxkID0gVW5pZGFkZQoJCglBdmFpbGFibGVRdWV1ZXMgPSBQcmltZWlybyBOaXZlbCBDQ0IsIFByaW1laXJvIE5pdmVsIENDRSwgUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCgkKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NCLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NCCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDSiAobm8gcXVldWUgYnkgdGhhdCBzdWZmaXgpLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NFLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NFCj1jdXQKc3ViIEdldFF1ZXVlSUQoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CgkKCSMgQ2hlY2sgaWYgcXVldWVJRCB3YXMgc2VudAoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkKCWlmICgkUXVldWVJRCkgewoJCW15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFF1ZXVlSUQpOwoJCXJldHVybiAoJFF1ZXVleyJOYW1lIn0sICRRdWV1ZUlEKTsgCgl9CgoJIyBHZXRzIGRlZmF1bHQgUXVldWUKCW15ICRDb25maWdUaWNrZXQgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoJbXkgJENvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJCgoJbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWdUaWNrZXQtPnsiUXVldWVEZWZhdWx0In07CgoJIyBDaGVja3MgaWYgdGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHF1ZXVlCglteSAkUXVldWVQcmVmaXggPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlUHJlZml4In07CglteSAkUXVldWVGaWVsZCAgPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlRmllbGQifTsKCglteSAlUXVldWVMaXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgICAgICAgICA9PiAxICk7CglteSAlUXVldWVMaXN0ICAgPSByZXZlcnNlICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAxICk7CgkkUXVldWVJRCAgICAgPSAkUXVldWVMaXN0eyRRdWV1ZURlZmF1bHR9OwoJbXkgJFF1ZXVlICAgICAgID0gJFF1ZXVlTGlzdElEeyRRdWV1ZUlEfTsKCglpZiAoICRRdWV1ZVByZWZpeCAmJiAkUXVldWVGaWVsZCApIHsKCQlteSAkUXVldWVTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRRdWV1ZUZpZWxkICk7CgkJbXkgJFF1ZXVlTmFtZSA9ICIkUXVldWVQcmVmaXggJFF1ZXVlU2VsZWN0ZWQiOwoKCQlpZiAoICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX0gKSB7CgkJCSRRdWV1ZUlEID0gJFF1ZXVlTGlzdHskUXVldWVOYW1lfTsKCQkJJFF1ZXVlICAgPSAkUXVldWVOYW1lOwoJCX0KCX0KCQoJcmV0dXJuICggJFF1ZXVlLCAkUXVldWVJRCApOwp9Cgo9aGVhZApSZXR1cm5zIHRoZSBmb3JtIGNvZGUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkc2NoZW1hOwoJbXkgJGZpZWxkczsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBwdWJsaWMgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljKCk7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBhdXRoZW50aWNhdGVkIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9ucygpOwoJfQoJCglteSAkaW50cm9kdWN0aW9uOwoKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNWYWx1ZXMoCgkJU2NoZW1hICA9PiAkc2NoZW1hLAoJCU9wdGlvbnMgPT4gJGZpZWxkcywKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0KCSk7CgkKCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX0gKSB7CgkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQkkaW50cm9kdWN0aW9uID0gIiI7Cgl9CgllbHNlIHsKCQlteSAlc2VydmljZUZvcm0gPSAleyAkUGFyYW17U2VydmljZUZvcm19IH07CgkJJGludHJvZHVjdGlvbiA9ICRzZXJ2aWNlRm9ybXtJbnRyb2R1Y3Rpb259OwoKCQlpZiAoICEkUGFyYW17U2VydmljZUZvcm19e1NjaGVtYX0gKSB7CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCX0KCQllbHNlIHsKCQkJbXkgJHNjaGVtYUZvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJbXkgJGZpZWxkc0Zvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17Rm9ybX07CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvJHNjaGVtYUZvcm0vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vJGZpZWxkc0Zvcm0vZzsKCQl9CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQoJaWYgKCRQYXJhbXsiUXVldWVJRCJ9KSB7CQkJCgkJJHNjaGVtYSA9ICRzY2hlbWEgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcInN0cmluZ1wiLFxuXCJkZWZhdWx0XCI6IFwiIiAuICRQYXJhbXsiUXVldWVJRCJ9IC4gIlwifSI7CgkJJGZpZWxkcyA9ICRmaWVsZHMgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcImhpZGRlblwiXG59IjsKCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICk7Cn0KCj1oZWFkCklmIHNvbWUgZmllbGRzIGhhdmUgZml4ZWQgdmFsdWVzIGluIHNlcnZpY2UgZGVmaW5pdGlvbiwgc2V0cyB0aGVtCj1jdXQKc3ViIEFkanVzdEZpeGVkRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hID0gJFBhcmFte1NjaGVtYX07CglteSAkZm9ybSA9ICRQYXJhbXtGaWVsZHN9OwoJbXkgJGZpeGVkVmFsdWVzID0gJFBhcmFte0ZpeGVkVmFsdWVzfTsKCQoJbXkgQHZhbHVlcyA9IHNwbGl0KC9cbi8sICRmaXhlZFZhbHVlcyk7CgkKCWZvciBteSAkdmFsdWUgKEB2YWx1ZXMpIHsKCgkJJHZhbHVlID1+IHMvXHIvL2c7CgkJbXkgQGRhdGEgPSBzcGxpdCgnPScsICR2YWx1ZSk7CgkJCQkJCgkJbXkgJGZpZWxkS2V5ID0gJGRhdGFbMF07CgkJbXkgJGZpeGVkVmFsdWUgPSAkZGF0YVsxXTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoJCQoJCSRzY2hlbWEgPX4gcy8ka2V5LyRyZXBsYWNlLzsKCQkKCQkka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIjogeyJ0eXBlIjogImhpZGRlbiInIC4gIlxufSI7CgkJJGZvcm0gPX4gcy8ka2V5LyRyZXBsYWNlLzsKCX0JCQoJCglyZXR1cm4gKCRzY2hlbWEsICRmb3JtKTsJCn0KCj1oZWFkCkNyZWF0ZXMgYSBuZXcgdGlja2V0LCBnaXZlbiB0aGUgaW5wdXQgZGF0YSBhbmQgc2VudCBhdHRhY2htZW50cy9pbWFnZXMKPWN1dApzdWIgQ3JlYXRlVGlja2V0IHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJE1haW50ZW5hbmNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06Ok1haW50ZW5hbmNlIik7CglteSAkRGF0ZVV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkRhdGVVdGlscyIpOwoKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe0F1dGhlbnRpY2F0ZVVSTH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpDQVM6OkNBU1VybCcpCgkJCSAgLiAiL2xvZ2luP3NlcnZpY2U9IgoJCQkgIC4gImh0dHBzOi8vIgoJCQkgIC4gJEVOVntTRVJWRVJfTkFNRX0KCQkJICAuICRFTlZ7U0NSSVBUX05BTUV9CgkJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiOwoJfQoJCgkjIENoZWNrIGlmIHF1ZXVlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIikpIHsJCQoJCSREYXRhe1F1ZXVlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCSRTZWxmLT5EZWJ1ZygiU3BlY2lmaWMgcXVldWUgZGVmaW5lZCA9PiAiIC4gJERhdGF7UXVldWVJRH0pOwoJfSBlbHNlIHsKCQkgIyBDaGVjayBpZiBtdXN0IHNob3cgcXVldWUgLSBpZiBzbywgcmVkaXJlY3QgdXNlcgogICAgICAgIG15ICRfQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CiAgICAgICAgbXkgJF9TaG93UXVldWUgICAgICAgICAgPSAkX0NvbmZpZ1RpY2tldFdpemFyZC0+eyJTaG93UXVldWUifTsKICAgICAgICBpZiAoISAkX1Nob3dRdWV1ZSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIlF1ZXVlIHNlbGVjdGlvbiBtdXN0IGJlIHNob3duIC0gcmVkaXJlY3Rpb24gdG8gUXVldWVQYW5lbFB1YmxpYyBhY3Rpb24iKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPVF1ZXVlc1BhbmVsUHVibGljIiApOwogICAgICAgIH0JCQoJfQoJCglteSAoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPkdldEZvcm0oUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCQoJJERhdGF7U2NoZW1hRm9ybX0gPSAkc2NoZW1hOwoJJERhdGF7RmllbGRzRm9ybX0gPSAkZmllbGRzOwoKCSMgQ29tbW9uIGluZm8KCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJbXkgJG1zZ0Nob29zZVNlcnZpY2U7CQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMifTsKCX0gZWxzZSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2UifTsKCX0KCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSApIHsKCQlteSAlcXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSk7CgkJbXkgJHF1ZXVlTmFtZSA9ICRxdWV1ZURhdGF7TmFtZX07CQkKCQkkbXNnQ2hvb3NlU2VydmljZSA9fiBzL1BMQUNFXF9OQU1FLyRxdWV1ZU5hbWUvZzsKCX0KCSREYXRhe01zZ0Nob29zZVNlcnZpY2V9ID0gJG1zZ0Nob29zZVNlcnZpY2U7CQoJCgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCQoKCSMgQnVpbGQgc2VydmljZSBjaG9vc2VyCgkkRGF0YXtTZXJ2aWNlU3RyZ30gPSAkVGlja2V0V2l6YXJkLT5CdWlsZFNlcnZpY2VzKFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApKTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnVxaXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwogICAgCSQoIltuYW1lPSdzdWJtaXQnXSIpLmNzcygiZm9udC1zaXplIiwgIjE4cHgiKTsKICAgIAkJCQoJCWZvcm0uZm9ybS5yZWdpc3RlclN1Ym1pdEhhbmRsZXIoZnVuY3Rpb24oZSwgZm9ybSkgewogICAgICAgIAkvLyB2YWxpZGF0ZSB0aGUgZW50aXJlIGZvcm0gKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnZhbGlkYXRlKHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZHJhdyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0ucmVuZGVyVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyBub3cgZGlzcGxheSBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGZvcm0uaXNGb3JtVmFsaWQoKSkgewogICAgICAgICAgICAJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7CgkJCQlhbGVydCgiRGFkb3MgaW52w6FsaWRvcyEiKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAJfSk7CgkJCgkJCgkJLy8gRml4IENLRWRpdG9yCgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJZm9yKHZhciBpIGluIENLRURJVE9SLmluc3RhbmNlcykgewoJCQkJdmFyIGVkaXRvciA9IENLRURJVE9SLmluc3RhbmNlc1tpXTsKCQkgICAgICAgIGlmIChlZGl0b3IpIHsKCQkgICAgICAgICAgICAvLyBDYWxsIHNob3dUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgZ2V0IHRoZSBmb2N1cwoJCSAgICAgICAgICAgIGVkaXRvci5vbignZm9jdXMnLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgc2hvd1Rvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoKCQkgICAgICAgICAgICAvLyBDYWxsIGhpZGVUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgbG9zZXMgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGV2ZW50KSB7CgkJICAgICAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KGV2ZW50KTsKCQkgICAgICAgICAgICB9KTsKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAvL1doZW5ldmVyIENLRWRpdG9yIGdldCBmb2N1cy4gV2Ugd2lsbCBzaG93IHRoZSB0b29sYmFyIHNwYW4uCgkJICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1Rvb2xCYXJEaXYoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5zaG93KCk7CgkJICAgICAgICAgICAgfQoKCQkgICAgICAgICAgICBmdW5jdGlvbiBoaWRlVG9vbEJhckRpdihldmVudCkgeyAgICAgICAgICAgICAgICAgICAgCgkJICAgICAgICAgICAgICAgIC8vJ2V2ZW50LmVkaXRvci5pZCcgcmV0dXJucyB0aGUgaWQgb2YgdGhlIHNwYW5zIHVzZWQgaW4gY2tlZGl0ci4KCQkgICAgICAgICAgICAgICAgJCgnIycrZXZlbnQuZWRpdG9yLmlkKydfdG9wJykuaGlkZSgpCgkJICAgICAgICAgICAgfQoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KHsgZWRpdG9yOiBlZGl0b3J9KTsKCgkJICAgICAgICAgICAKCQkgICAgICAgIH0KCQkJfQkJCQoJCX0sIDIwMDApOwoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHMoYWN0aXZlUXVldWUpOwp9OwoKCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2tQdWJsaWMgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwkJCiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCSAgICAgICAgaWYgKGVkaXRvcikgewoJCSAgICAgICAgICAgIC8vIENhbGwgc2hvd1Rvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBnZXQgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdmb2N1cycsIGZ1bmN0aW9uIChldmVudCkgewoJCSAgICAgICAgICAgICAgICBzaG93VG9vbEJhckRpdihldmVudCk7CgkJICAgICAgICAgICAgfSk7CgoJCSAgICAgICAgICAgIC8vIENhbGwgaGlkZVRvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBsb3NlcyB0aGUgZm9jdXMKCQkgICAgICAgICAgICBlZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIC8vV2hlbmV2ZXIgQ0tFZGl0b3IgZ2V0IGZvY3VzLiBXZSB3aWxsIHNob3cgdGhlIHRvb2xiYXIgc3Bhbi4KCQkgICAgICAgICAgICBmdW5jdGlvbiBzaG93VG9vbEJhckRpdihldmVudCkgewoJCSAgICAgICAgICAgICAgICAvLydldmVudC5lZGl0b3IuaWQnIHJldHVybnMgdGhlIGlkIG9mIHRoZSBzcGFucyB1c2VkIGluIGNrZWRpdHIuCgkJICAgICAgICAgICAgICAgICQoJyMnK2V2ZW50LmVkaXRvci5pZCsnX3RvcCcpLnNob3coKTsKCQkgICAgICAgICAgICB9CgoJCSAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVUb29sQmFyRGl2KGV2ZW50KSB7ICAgICAgICAgICAgICAgICAgICAKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5oaWRlKCkKCQkgICAgICAgICAgICB9CgkJICAgICAgICAgICAgCgkJICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoeyBlZGl0b3I6IGVkaXRvcn0pOwkJICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgIH0KCQkgICAgICAgIAoJCSAgICAgICAgZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CgkJCgkJfSwgMjAwMCk7CQkKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzUHVibGljKGFjdGl2ZVF1ZXVlKTsKfTsKCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wc1B1YmxpYyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQoJCgl2YXIgdXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljO1N1YmFjdGlvbj1HZXRGb3JtQ3VzdG9tUHJvcHMiICsgcXVldWU7CgkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldFNjcmlwdCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIGFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhQ3VzdG9tUHJvcHMocXVldWUpIHsKCWlmICghIHF1ZXVlKSB7CgkJcXVldWUgPSAiIjsKCX0JCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KICAgIApmdW5jdGlvbiBjYXJyZWdhRm9ybShkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsJCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9IAoJCglhY3RpdmVRdWV1ZSA9IHF1ZXVlOwkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9CgkKCWFjdGl2ZVF1ZXVlID0gcXVldWU7CQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0SlNPTih1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKGRhdGFbMl0pOwoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5zaG93KCk7CgkJCgkJdmFyIGZvcm0gPSAkKCIjZm9ybVRpY2tldCIpLmFscGFjYSh7CiAgICAgICAJCSJkYXRhIjogZGF0YUZvcm0sCiAgICAgICAgCSJzY2hlbWEiOiBidWlsZFNjaGVtYShkYXRhWzBdKSwKICAgICAgICAJIm9wdGlvbnMiOiBidWlsZE9wdGlvbnMoZGF0YVsxXSwgc2VuZFRleHQsIGFjdGlvbiksCQkJCiAgICAgICAgCSJwb3N0UmVuZGVyIjogcG9zdFJlbmRlckNhbGxiYWNrUHVibGljLAoJCQkidmlldyI6ICJib290c3RyYXAtY3JlYXRlIiwKCQkJInVpIjogImJvb3RzdHJhcC11aSIKICAgIAl9KTsgCgkJCgkJCiAgICAJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KCJFcnJvIGFvIHJlY3VwZXJhcjogIiArIHVybCArICIgPT4gIiArIHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBkZXN0cnVpckZvcm0oKSB7CgkkKCIjZm9ybVRpY2tldCIpLmFscGFjYSgpLmRlc3Ryb3koKTsKfQoK</File> | |
| 64 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 75 | + </Filelist> | |
| 76 | + <DatabaseInstall> | |
| 77 | + <TableCreate Type="post" Name="service_form"> | |
| 78 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 79 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 80 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 83 | + <ForeignKey ForeignTable="service"> | |
| 84 | + <Reference Foreign="id" Local="service_id"> | |
| 85 | + </Reference> | |
| 86 | + </ForeignKey> | |
| 87 | + <ForeignKey ForeignTable="queue"> | |
| 88 | + <Reference Foreign="id" Local="queue_id"> | |
| 89 | + </Reference> | |
| 90 | + </ForeignKey> | |
| 91 | + </TableCreate> | |
| 92 | + </DatabaseInstall> | |
| 93 | + <DatabaseUpgrade Version="1.6.2"> | |
| 94 | + <TableCreate Type="post" Name="service_form"> | |
| 95 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 96 | + <ForeignKey ForeignTable="queue"> | |
| 97 | + <Reference Foreign="id" Local="queue_id"> | |
| 98 | + </Reference> | |
| 99 | + </ForeignKey> | |
| 100 | + </TableCreate> | |
| 101 | + <TableCreate Type="post" Name="restricted_service"> | |
| 102 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 103 | + </TableCreate> | |
| 104 | + </DatabaseUpgrade> | |
| 105 | +</otrs_package> | |
| 0 | 106 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,105 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.1</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.1">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-20 18:06:42</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2FscGFjYS5taW4uanM8L0phdmFTY3JpcHQ+CgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5qczwvSmF2YVNjcmlwdD4JCQkJCQkJCQkJCgkJCSAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmpzPC9KYXZhU2NyaXB0PgogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0Pk5ld1RpY2tldFdpemFyZC5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8Q1NTPmFscGFjYS9hbHBhY2EubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5jc3M8L0NTUz4KCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3M8L0NTUz4JCQkJCQkJCQkJCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAubWluLmNzczwvQ1NTPgoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAoJCQkJICAidHlwZSI6IHsKICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAiZW51bSI6IFsKICAgICAgT1RSU190eXBlX3ZhbHVlcwogICAgXSwKICAgICJyZXF1aXJlZCI6ICJ0cnVlIgogIH0KICBDRl9TQ0hFTUEKICAsCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKCSJhdHRhY2htZW50IjogewogICAgInR5cGUiOiAic3RyaW5nIiwKCSJmb3JtYXQiOiAidXJpIgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmQiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTG9jYWw6IgogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJOb21lOiIKICAgIAogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAiZW1haWwiLAogICAgImxhYmVsIjogIkUtbWFpbDoiLAoJImhlbHBlciI6ICJBYnJpbmRvIGNvbSBzZXUgZS1tYWlsIGluc3RpdHVjaW9uYWwsIHNldSBhdGVuZGltZW50byBzZXLDoSBtYWlzIHLDoXBpZG8iCiAgICAKICB9LAkJCQkJCQkJCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiVGVsZWZvbmU6IiwKICAgICJjb250cm9sX3dpZHRoIjogMTAwCiAgfSwKICAidHlwZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwKICAgICJsYWJlbCI6ICJNb3Rpdm86IiwKICAgICJvcHRpb25MYWJlbHMiOiBbCiAgICAgIE9UUlNfdHlwZV9sYWJlbHMKICAgIF0KICB9LAogICJzZXJ2aWNlIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KICBDRl9GT1JNLAogICJzdWJqZWN0IjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiQXNzdW50bzoiLAogICAgInNpemUiOiA4MAogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAiY2tlZGl0b3IiLAogICAgImxhYmVsIjogIkRlc2NyacOnw6NvOiIsCiAgICAiY29scyI6IDgwLAoJImNrZWRpdG9yIjogewoJCSJ0b29sYmFyIjogWwogICAgICAgICAgICBbIkZvbnQiLCAiRm9udFNpemUiLCAiLSIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiLSIsICJOdW1iZXJlZExpc3QiLCAiQnVsbGV0ZWRMaXN0IiwgIi0iLCAiUGFzdGUiXSwKICAgICAgICAJWyJJbWFnZSIsICJUYWJsZSIsICItIiwgIkxpbmsiXQogICAgCV0KCX0KICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2FscGFjYS5taW4uanM8L0phdmFTY3JpcHQ+CgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC1wcm9jZXNzLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5qczwvSmF2YVNjcmlwdD4JCQkJCQkJCQkJCgkJCSAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmpzPC9KYXZhU2NyaXB0PgogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0Pk5ld1RpY2tldFdpemFyZC5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8Q1NTPmFscGFjYS9hbHBhY2EubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5jc3M8L0NTUz4KCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3M8L0NTUz4JCQkJCQkJCQkJCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAubWluLmNzczwvQ1NTPgoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uanM8L0phdmFTY3JpcHQ+CgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWFQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAkJCQkJCQkKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAibnVtYmVyIiwKICAgICJlbnVtIjogWwogICAgICBPVFJTX3R5cGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0KICBDRl9TQ0hFTUEKICAsCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAoJImF0dGFjaG1lbnQiOiB7CiAgICAidHlwZSI6ICJhcnJheSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkUHVibGljIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm1QdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0KICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIKICB9LAogICJuYW1lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTm9tZToiCiAgICAKICB9LAogICJlbWFpbCI6IHsKICAgICJ0eXBlIjogImVtYWlsIiwKICAgICJsYWJlbCI6ICJFLW1haWw6IiwKCSJoZWxwZXIiOiAiQWJyaW5kbyBjb20gc2V1IGUtbWFpbCBpbnN0aXR1Y2lvbmFsLCBzZXUgYXRlbmRpbWVudG8gc2Vyw6EgbWFpcyByw6FwaWRvIgogICAgCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldCgl9CiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VzUGFuZWwiKSAlXQo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC13YXJuaW5nIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24td2FybmluZy1zaWduIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPiA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzIikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KICAJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPG9sIj4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQk8Zm9ybT4KCQkJPHNwYW4+CgkJICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOgogICAgICAgICAJPC9zcGFuPgoJCQk8c3BhbiBpZD0ic2VydmljZURJViI+CQogICAgICAgICAJCVslIERhdGEuU2VydmljZVN0cmcgJV0gICAgICAKICAgICAgICAgCTwvc3Bhbj4gICAgICAgICAgICAgIAoJCTwvZm9ybT4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9IiI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSIpIHwgaHRtbCAlXTwvQT4KWyUgUmVuZGVyQmxvY2tFbmQoIlVuYXV0aGVudGljYXRlZE1lc3NhZ2UiKSAlXQkJCQoJPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiIGlkPSJmb3JtUGFuZWwiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlBsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0IikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5IiBpZD0iZm9ybVRpY2tldCI+CgkKCTwvZGl2Pgo8L2Rpdj4KIAogPHNjcmlwdCBzcmM9IlslIENvbmZpZygiRnJvbnRlbmQ6OlJpY2hUZXh0UGF0aCIpICVdY2tlZGl0b3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkvLyBUbyB0dXJuIG9uIGRlYnVnZ2luZywgdW5jb21tZW50IHRoaXMgbGluZQoJLy9BbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuREVCVUc7CgkvL0FscGFjYS51cGxvYWRJbWFnZVVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJLy9BbHBhY2EuZmlsZWJyb3dzZXJJbWFnZVVwbG9hZFVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCglBbHBhY2Euc2V0RGVmYXVsdExvY2FsZSgicHRfQlIiKTsKCQkJCglBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkJIm5vbmVMYWJlbCI6ICItIiwKCX0pOwoJCgkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKCSAgIAkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOwogICAJCX0gZWxzZSB7CiAgIAkJCWRlc3RydWlyRm9ybSgpOwogICAJCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbCgiIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5oaWRlKCk7CiAgIAkJfSAgCQogIAl9KTsKICAJCiAgIAlpZiAoJCgiI1NlcnZpY2VJRCIpLmhhcygnW3NlbGVjdGVkXScpKSB7CiAgCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CiAgCQkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIpOwogIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7ICAJCQkgIAkJCQogIAkJfQogIAl9Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgZGF0YS13aWR0aD1cImF1dG9cIiBpZD1cIlNlcnZpY2VJRFwiIGNsYXNzPVwic2VsZWN0cGlja2VyXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIj5cbjxvcHRpb24gdmFsdWU9XCJcIj4tPC9vcHRpb24+IjsKCW15ICRpbk9wdCA9IDA7CgoJZm9yIG15ICRzZXJ2aWNlIChAU2VydmljZXNDb21ibykgewoJCWlmICgkc2VydmljZS0+e0Rpc2FibGVkfSkgewoJCQlpZiAoJGluT3B0KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJCQl9CgkJCSRpbk9wdCA9IDE7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGdyb3VwIGxhYmVsPSciIC4gJHNlcnZpY2UtPntWYWx1ZX0gLiAiJz5cbiI7CgkJfSBlbHNlIHsKCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8b3B0aW9uIHZhbHVlPSciIC4gJHNlcnZpY2UtPntLZXl9IC4gIic+IiAuICRTZWxmLT5MYXN0UGFydCgkc2VydmljZS0+e1ZhbHVlfSkgLiAiPC9vcHRpb24+XG4iOwoJCX0KCX0KCQoJaWYgKCRpbk9wdCkgewoJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9vcHRncm91cD5cbiI7Cgl9CgkKCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9zZWxlY3Q+XG4iOwoKCXJldHVybiAkcmV0b3JubzsKfQoKPWhlYWQKUmV0dXJucyBzZXJ2aWNlIG5hbWUgd2l0aG91dCB0aGUgcGFyZW50IHNlcnZpY2VzIG5hbWVzCj1jdXQKc3ViIExhc3RQYXJ0IHsKCW15ICRTZWxmICA9IHNoaWZ0OwoJbXkgJHF1ZXVlID0gc2hpZnQ7CglteSBAcGFydHMgPSBzcGxpdCggIjo6IiwgJHF1ZXVlICk7CglyZXR1cm4gJHBhcnRzWy0xXTsKfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgkKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIlVwbG9hZEZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJVcGxvYWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlUmVjZWl2ZSgpOwkJCgl9IGVsc2lmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIkRlbGV0ZUZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJEZWxldGUgdXBsb2FkZWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlRGVsZXRlKCk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJVbmtub3duIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAxOwoJfQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVcGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVEZWxldGUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkZmlsZU5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGaWxlbmFtZSIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZSBmaWxlICRmaWxlTmFtZSBmcm9tIGZvcm0gJGZvcm1JZCIpOwoJCglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJbXkgJGZpbGVEZWxldGVkID0gMDsKCQkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCWlmICgkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9IGVxICRmaWxlTmFtZSkgewoJCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZUlEfSk7CgkJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkZmlsZU5hbWUpOwoJCQkkZmlsZURlbGV0ZWQgPSAxOwoJCX0KCX0KCQoJaWYgKCRmaWxlRGVsZXRlZCkgewoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCQlDb250ZW50ICAgICA9PiAieyAkZmlsZU5hbWU6IHRydWV9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsJCQkKCX0gZWxzZSB7CgkJcmV0dXJuIDE7Cgl9CQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVUGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVSZWNlaXZlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoKCW15ICV0bXBGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoUGFyYW0gPT4gImF0dGFjaG1lbnRfZmlsZXMiKTsJCglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZvcm1JRCIgKTsKCglpZiAoISAkdG1wRmlsZXtGaWxlbmFtZX0gfHwgISAkZm9ybUlkKSB7CgkJbXkgJG1zZ0Vycm9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbnZhbGlkIGZpbGUhIik7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7IFwiZXJyb3JcIjogXCIkbXNnRXJyb3JcIiwgXCJmaWxlc1wiOiBbXSB9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsKCX0KCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IEFkZGluZyBmaWxlIHRvIGNhY2hlLiBGb3JtSUQ6ICIgLiAkZm9ybUlkIC4gIiBcdCBGaWxlbmFtZTogIiAuICR0bXBGaWxle0ZpbGVuYW1lfSAuICIgXHQgQ29udGVudFR5cGU6ICIgLiAkdG1wRmlsZXtDb250ZW50VHlwZX0gKTsKCQoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoKCW15ICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApID0gJFNlbGYtPkdldEZvcm0oIFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSwgU2VydmljZUZvcm0gPT4gXCVzZXJ2aWNlRm9ybSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCglyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+ICJbeyIgLiAkc2NoZW1hIC4gIn0sIHsiIC4gJGZpZWxkcyAuICJ9LCBcIiIgLiAkaW50cm9kdWN0aW9uIC4gIlwiXSIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkCkFsbG93cyB1c2luZyBhIGZpZWxkIGluIHRoZSBmb3JtIHRvIHNlbGVjdCBhIHRhcmdldCBxdWV1ZS4KSWYgYSBxdWV1ZSB3YXMgZGVmaW5lZCBpbiByZXF1ZXN0IHBhcmFtZXRlciwgdXNlcyBpdC4KSWYgdGhlcmUgaXMgYSBwcmVmaXggZGVmaW5lZCBmb3IgdGhlIHF1ZXVlcyB0byBhdXRvbWF0aWNhbGx5IGZvcndhcmQgdGlja2V0cywKYW5kIGFsc28gYSBmaWVsZCB3YXMgZGVmaW5lZCBhcyBoYW5kbGluZyB0aGUgdGFyZ2V0IHF1ZXVlLCB0cnkgdG8gbG9jYXRlIG9uZS4KCklmIG5vbmUgaXMgZm91bmQsIHVzZXMgdGhlIGRlZmF1bHQgcXVldWUuCgpGb3IgZXhhbXBsZToKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZVByZWZpeCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZUZpZWxkID0gVW5pZGFkZQoJCglBdmFpbGFibGVRdWV1ZXMgPSBQcmltZWlybyBOaXZlbCBDQ0IsIFByaW1laXJvIE5pdmVsIENDRSwgUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCgkKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NCLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NCCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDSiAobm8gcXVldWUgYnkgdGhhdCBzdWZmaXgpLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NFLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NFCj1jdXQKc3ViIEdldFF1ZXVlSUQoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CgkKCSMgQ2hlY2sgaWYgcXVldWVJRCB3YXMgc2VudAoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkKCWlmICgkUXVldWVJRCkgewoJCW15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFF1ZXVlSUQpOwoJCXJldHVybiAoJFF1ZXVleyJOYW1lIn0sICRRdWV1ZUlEKTsgCgl9CgoJIyBHZXRzIGRlZmF1bHQgUXVldWUKCW15ICRDb25maWdUaWNrZXQgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoJbXkgJENvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJCgoJbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWdUaWNrZXQtPnsiUXVldWVEZWZhdWx0In07CgoJIyBDaGVja3MgaWYgdGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHF1ZXVlCglteSAkUXVldWVQcmVmaXggPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlUHJlZml4In07CglteSAkUXVldWVGaWVsZCAgPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlRmllbGQifTsKCglteSAlUXVldWVMaXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgICAgICAgICA9PiAxICk7CglteSAlUXVldWVMaXN0ICAgPSByZXZlcnNlICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAxICk7CgkkUXVldWVJRCAgICAgPSAkUXVldWVMaXN0eyRRdWV1ZURlZmF1bHR9OwoJbXkgJFF1ZXVlICAgICAgID0gJFF1ZXVlTGlzdElEeyRRdWV1ZUlEfTsKCglpZiAoICRRdWV1ZVByZWZpeCAmJiAkUXVldWVGaWVsZCApIHsKCQlteSAkUXVldWVTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRRdWV1ZUZpZWxkICk7CgkJbXkgJFF1ZXVlTmFtZSA9ICIkUXVldWVQcmVmaXggJFF1ZXVlU2VsZWN0ZWQiOwoKCQlpZiAoICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX0gKSB7CgkJCSRRdWV1ZUlEID0gJFF1ZXVlTGlzdHskUXVldWVOYW1lfTsKCQkJJFF1ZXVlICAgPSAkUXVldWVOYW1lOwoJCX0KCX0KCQoJcmV0dXJuICggJFF1ZXVlLCAkUXVldWVJRCApOwp9Cgo9aGVhZApSZXR1cm5zIHRoZSBmb3JtIGNvZGUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkc2NoZW1hOwoJbXkgJGZpZWxkczsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBwdWJsaWMgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljKCk7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBhdXRoZW50aWNhdGVkIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9ucygpOwoJfQoJCglteSAkaW50cm9kdWN0aW9uOwoKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNWYWx1ZXMoCgkJU2NoZW1hICA9PiAkc2NoZW1hLAoJCU9wdGlvbnMgPT4gJGZpZWxkcywKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0KCSk7CgkKCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX0gKSB7CgkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQkkaW50cm9kdWN0aW9uID0gIiI7Cgl9CgllbHNlIHsKCQlteSAlc2VydmljZUZvcm0gPSAleyAkUGFyYW17U2VydmljZUZvcm19IH07CgkJJGludHJvZHVjdGlvbiA9ICRzZXJ2aWNlRm9ybXtJbnRyb2R1Y3Rpb259OwoKCQlpZiAoICEkUGFyYW17U2VydmljZUZvcm19e1NjaGVtYX0gKSB7CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCX0KCQllbHNlIHsKCQkJbXkgJHNjaGVtYUZvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJbXkgJGZpZWxkc0Zvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17Rm9ybX07CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvJHNjaGVtYUZvcm0vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vJGZpZWxkc0Zvcm0vZzsKCQl9CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQoJaWYgKCRQYXJhbXsiUXVldWVJRCJ9KSB7CQkJCgkJJHNjaGVtYSA9ICRzY2hlbWEgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcInN0cmluZ1wiLFxuXCJkZWZhdWx0XCI6IFwiIiAuICRQYXJhbXsiUXVldWVJRCJ9IC4gIlwifSI7CgkJJGZpZWxkcyA9ICRmaWVsZHMgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcImhpZGRlblwiXG59IjsKCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICk7Cn0KCj1oZWFkCklmIHNvbWUgZmllbGRzIGhhdmUgZml4ZWQgdmFsdWVzIGluIHNlcnZpY2UgZGVmaW5pdGlvbiwgc2V0cyB0aGVtCj1jdXQKc3ViIEFkanVzdEZpeGVkRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hID0gJFBhcmFte1NjaGVtYX07CglteSAkZm9ybSA9ICRQYXJhbXtGaWVsZHN9OwoJbXkgJGZpeGVkVmFsdWVzID0gJFBhcmFte0ZpeGVkVmFsdWVzfTsKCQoJbXkgQHZhbHVlcyA9IHNwbGl0KC9cbi8sICRmaXhlZFZhbHVlcyk7CgkKCWZvciBteSAkdmFsdWUgKEB2YWx1ZXMpIHsKCgkJJHZhbHVlID1+IHMvXHIvL2c7CgkJbXkgQGRhdGEgPSBzcGxpdCgnPScsICR2YWx1ZSk7CgkJCQkJCgkJbXkgJGZpZWxkS2V5ID0gJGRhdGFbMF07CgkJbXkgJGZpeGVkVmFsdWUgPSAkZGF0YVsxXTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoJCQoJCSRzY2hlbWEgPX4gcy8ka2V5LyRyZXBsYWNlLzsKCQkKCQkka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIjogeyJ0eXBlIjogImhpZGRlbiInIC4gIlxufSI7CgkJJGZvcm0gPX4gcy8ka2V5LyRyZXBsYWNlLzsKCX0JCQoJCglyZXR1cm4gKCRzY2hlbWEsICRmb3JtKTsJCn0KCj1oZWFkCkNyZWF0ZXMgYSBuZXcgdGlja2V0LCBnaXZlbiB0aGUgaW5wdXQgZGF0YSBhbmQgc2VudCBhdHRhY2htZW50cy9pbWFnZXMKPWN1dApzdWIgQ3JlYXRlVGlja2V0IHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJE1haW50ZW5hbmNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06Ok1haW50ZW5hbmNlIik7CglteSAkRGF0ZVV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkRhdGVVdGlscyIpOwoKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe0F1dGhlbnRpY2F0ZVVSTH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpDQVM6OkNBU1VybCcpCgkJCSAgLiAiL2xvZ2luP3NlcnZpY2U9IgoJCQkgIC4gImh0dHBzOi8vIgoJCQkgIC4gJEVOVntTRVJWRVJfTkFNRX0KCQkJICAuICRFTlZ7U0NSSVBUX05BTUV9CgkJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiOwoJfQoJCgkjIENoZWNrIGlmIHF1ZXVlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIikpIHsJCQoJCSREYXRhe1F1ZXVlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCSRTZWxmLT5EZWJ1ZygiU3BlY2lmaWMgcXVldWUgZGVmaW5lZCA9PiAiIC4gJERhdGF7UXVldWVJRH0pOwoJfSBlbHNlIHsKCQkgIyBDaGVjayBpZiBtdXN0IHNob3cgcXVldWUgLSBpZiBzbywgcmVkaXJlY3QgdXNlcgogICAgICAgIG15ICRfQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CiAgICAgICAgbXkgJF9TaG93UXVldWUgICAgICAgICAgPSAkX0NvbmZpZ1RpY2tldFdpemFyZC0+eyJTaG93UXVldWUifTsKICAgICAgICBpZiAoISAkX1Nob3dRdWV1ZSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIlF1ZXVlIHNlbGVjdGlvbiBtdXN0IGJlIHNob3duIC0gcmVkaXJlY3Rpb24gdG8gUXVldWVQYW5lbFB1YmxpYyBhY3Rpb24iKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPVF1ZXVlc1BhbmVsUHVibGljIiApOwogICAgICAgIH0JCQoJfQoJCglteSAoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPkdldEZvcm0oUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCQoJJERhdGF7U2NoZW1hRm9ybX0gPSAkc2NoZW1hOwoJJERhdGF7RmllbGRzRm9ybX0gPSAkZmllbGRzOwoKCSMgQ29tbW9uIGluZm8KCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJbXkgJG1zZ0Nob29zZVNlcnZpY2U7CQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMifTsKCX0gZWxzZSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2UifTsKCX0KCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSApIHsKCQlteSAlcXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSk7CgkJbXkgJHF1ZXVlTmFtZSA9ICRxdWV1ZURhdGF7TmFtZX07CQkKCQkkbXNnQ2hvb3NlU2VydmljZSA9fiBzL1BMQUNFXF9OQU1FLyRxdWV1ZU5hbWUvZzsKCX0KCSREYXRhe01zZ0Nob29zZVNlcnZpY2V9ID0gJG1zZ0Nob29zZVNlcnZpY2U7CQoJCgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCQoKCSMgQnVpbGQgc2VydmljZSBjaG9vc2VyCgkkRGF0YXtTZXJ2aWNlU3RyZ30gPSAkVGlja2V0V2l6YXJkLT5CdWlsZFNlcnZpY2VzKFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApKTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnVxaXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwogICAgCSQoIltuYW1lPSdzdWJtaXQnXSIpLmNzcygiZm9udC1zaXplIiwgIjE4cHgiKTsKICAgIAkJCQoJCWZvcm0uZm9ybS5yZWdpc3RlclN1Ym1pdEhhbmRsZXIoZnVuY3Rpb24oZSwgZm9ybSkgewogICAgICAgIAkvLyB2YWxpZGF0ZSB0aGUgZW50aXJlIGZvcm0gKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnZhbGlkYXRlKHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZHJhdyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0ucmVuZGVyVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyBub3cgZGlzcGxheSBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGZvcm0uaXNGb3JtVmFsaWQoKSkgewogICAgICAgICAgICAJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7CgkJCQlhbGVydCgiRGFkb3MgaW52w6FsaWRvcyEiKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAJfSk7CgkJCgkJCgkJLy8gRml4IENLRWRpdG9yCgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJZm9yKHZhciBpIGluIENLRURJVE9SLmluc3RhbmNlcykgewoJCQkJdmFyIGVkaXRvciA9IENLRURJVE9SLmluc3RhbmNlc1tpXTsKCQkgICAgICAgIGlmIChlZGl0b3IpIHsKCQkgICAgICAgICAgICAvLyBDYWxsIHNob3dUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgZ2V0IHRoZSBmb2N1cwoJCSAgICAgICAgICAgIGVkaXRvci5vbignZm9jdXMnLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgc2hvd1Rvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoKCQkgICAgICAgICAgICAvLyBDYWxsIGhpZGVUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgbG9zZXMgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGV2ZW50KSB7CgkJICAgICAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KGV2ZW50KTsKCQkgICAgICAgICAgICB9KTsKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAvL1doZW5ldmVyIENLRWRpdG9yIGdldCBmb2N1cy4gV2Ugd2lsbCBzaG93IHRoZSB0b29sYmFyIHNwYW4uCgkJICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1Rvb2xCYXJEaXYoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5zaG93KCk7CgkJICAgICAgICAgICAgfQoKCQkgICAgICAgICAgICBmdW5jdGlvbiBoaWRlVG9vbEJhckRpdihldmVudCkgeyAgICAgICAgICAgICAgICAgICAgCgkJICAgICAgICAgICAgICAgIC8vJ2V2ZW50LmVkaXRvci5pZCcgcmV0dXJucyB0aGUgaWQgb2YgdGhlIHNwYW5zIHVzZWQgaW4gY2tlZGl0ci4KCQkgICAgICAgICAgICAgICAgJCgnIycrZXZlbnQuZWRpdG9yLmlkKydfdG9wJykuaGlkZSgpCgkJICAgICAgICAgICAgfQoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KHsgZWRpdG9yOiBlZGl0b3J9KTsKCgkJICAgICAgICAgICAKCQkgICAgICAgIH0KCQkJfQkJCQoJCX0sIDIwMDApOwoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHMoYWN0aXZlUXVldWUpOwp9OwoKCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2tQdWJsaWMgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwkJCiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCSAgICAgICAgaWYgKGVkaXRvcikgewoJCSAgICAgICAgICAgIC8vIENhbGwgc2hvd1Rvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBnZXQgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdmb2N1cycsIGZ1bmN0aW9uIChldmVudCkgewoJCSAgICAgICAgICAgICAgICBzaG93VG9vbEJhckRpdihldmVudCk7CgkJICAgICAgICAgICAgfSk7CgoJCSAgICAgICAgICAgIC8vIENhbGwgaGlkZVRvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBsb3NlcyB0aGUgZm9jdXMKCQkgICAgICAgICAgICBlZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIC8vV2hlbmV2ZXIgQ0tFZGl0b3IgZ2V0IGZvY3VzLiBXZSB3aWxsIHNob3cgdGhlIHRvb2xiYXIgc3Bhbi4KCQkgICAgICAgICAgICBmdW5jdGlvbiBzaG93VG9vbEJhckRpdihldmVudCkgewoJCSAgICAgICAgICAgICAgICAvLydldmVudC5lZGl0b3IuaWQnIHJldHVybnMgdGhlIGlkIG9mIHRoZSBzcGFucyB1c2VkIGluIGNrZWRpdHIuCgkJICAgICAgICAgICAgICAgICQoJyMnK2V2ZW50LmVkaXRvci5pZCsnX3RvcCcpLnNob3coKTsKCQkgICAgICAgICAgICB9CgoJCSAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVUb29sQmFyRGl2KGV2ZW50KSB7ICAgICAgICAgICAgICAgICAgICAKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5oaWRlKCkKCQkgICAgICAgICAgICB9CgkJICAgICAgICAgICAgCgkJICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoeyBlZGl0b3I6IGVkaXRvcn0pOwkJICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgIH0KCQkgICAgICAgIAoJCSAgICAgICAgZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CgkJCgkJfSwgMjAwMCk7CQkKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzUHVibGljKGFjdGl2ZVF1ZXVlKTsKfTsKCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wc1B1YmxpYyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQoJCgl2YXIgdXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljO1N1YmFjdGlvbj1HZXRGb3JtQ3VzdG9tUHJvcHMiICsgcXVldWU7CgkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldFNjcmlwdCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIGFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhQ3VzdG9tUHJvcHMocXVldWUpIHsKCWlmICghIHF1ZXVlKSB7CgkJcXVldWUgPSAiIjsKCX0JCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KICAgIApmdW5jdGlvbiBjYXJyZWdhRm9ybShkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsJCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9IAoJCglhY3RpdmVRdWV1ZSA9IHF1ZXVlOwkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9CgkKCWFjdGl2ZVF1ZXVlID0gcXVldWU7CQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0SlNPTih1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKGRhdGFbMl0pOwoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5zaG93KCk7CgkJCgkJdmFyIGZvcm0gPSAkKCIjZm9ybVRpY2tldCIpLmFscGFjYSh7CiAgICAgICAJCSJkYXRhIjogZGF0YUZvcm0sCiAgICAgICAgCSJzY2hlbWEiOiBidWlsZFNjaGVtYShkYXRhWzBdKSwKICAgICAgICAJIm9wdGlvbnMiOiBidWlsZE9wdGlvbnMoZGF0YVsxXSwgc2VuZFRleHQsIGFjdGlvbiksCQkJCiAgICAgICAgCSJwb3N0UmVuZGVyIjogcG9zdFJlbmRlckNhbGxiYWNrUHVibGljLAoJCQkidmlldyI6ICJib290c3RyYXAtY3JlYXRlIiwKCQkJInVpIjogImJvb3RzdHJhcC11aSIKICAgIAl9KTsgCgkJCgkJCiAgICAJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KCJFcnJvIGFvIHJlY3VwZXJhcjogIiArIHVybCArICIgPT4gIiArIHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBkZXN0cnVpckZvcm0oKSB7CgkkKCIjZm9ybVRpY2tldCIpLmFscGFjYSgpLmRlc3Ryb3koKTsKfQoK</File> | |
| 64 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 75 | + </Filelist> | |
| 76 | + <DatabaseInstall> | |
| 77 | + <TableCreate Type="post" Name="service_form"> | |
| 78 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 79 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 80 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 83 | + <ForeignKey ForeignTable="service"> | |
| 84 | + <Reference Foreign="id" Local="service_id"> | |
| 85 | + </Reference> | |
| 86 | + </ForeignKey> | |
| 87 | + <ForeignKey ForeignTable="queue"> | |
| 88 | + <Reference Foreign="id" Local="queue_id"> | |
| 89 | + </Reference> | |
| 90 | + </ForeignKey> | |
| 91 | + </TableCreate> | |
| 92 | + </DatabaseInstall> | |
| 93 | + <DatabaseUpgrade Version="1.6.2"> | |
| 94 | + <TableCreate Type="post" Name="service_form"> | |
| 95 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 96 | + <ForeignKey ForeignTable="queue"> | |
| 97 | + <Reference Foreign="id" Local="queue_id"> | |
| 98 | + </Reference> | |
| 99 | + </ForeignKey> | |
| 100 | + </TableCreate> | |
| 101 | + <TableCreate Type="post" Name="restricted_service"> | |
| 102 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 103 | + </TableCreate> | |
| 104 | + </DatabaseUpgrade> | |
| 105 | +</otrs_package> | |
| 0 | 106 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.10</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.10">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-07-07 18:13:22</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbCI+CgkJCVslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJCTxsaT5bJSBEYXRhLk1lc3NhZ2UgJV0gKFslIFRyYW5zbGF0ZSgiU3RhcnRlZCBhdDogIikgfCBodG1sICVdIFslIERhdGEuU3RhcnREYXRlICVdKTwvbGk+CgkJCVslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZUxpbmUiKSAlXQoJCTwvb2w+CiAgCTwvZGl2PgogIAkKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZXNQYW5lbCIpICVdCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5Ij4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgRGF0YS5Nc2dDaG9vc2VTZXJ2aWNlICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJCTxsYWJlbCBmb3I9IlNlcnZpY2VJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CgkJCTxzcGFuIGlkPSJzZXJ2aWNlRElWIj4JCiAgICAgICAgIAkJWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXSAgICAgIAogICAgICAgICAJPC9zcGFuPiAgICAgICAgICAgICAgCgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtZm9vdGVyIiBpZD0ic2VydmljZURlc2NyaXB0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQoJCQlbJSBUcmFuc2xhdGUoIkRpZCB5b3Uga25vdyB0aGF0LCBpZiB5b3UgaGF2ZSBhIGxvZ2luLCB5b3UgY2FuIGF1dGhlbnRpY2F0ZSBmaXJzdCBhbmQgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG5hbWUgYW5kIGUtbWFpbC4gQWxzbywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBtb25pdG9yIHlvdXIgdGlja2V0IGxhdGVyLiIpIHwgaHRtbCAlXToKCQkJPEEgdGFyZ2V0PSJfbmV3IiBIUkVGPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gYXV0aGVudGljYXRlIikgfCBodG1sICVdPC9BPgpbJSBSZW5kZXJCbG9ja0VuZCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQkJCgk8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImZvcm1QYW5lbCI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiIGlkPSJmb3JtVGlja2V0Ij4KCQoJPC9kaXY+CjwvZGl2PgogCiA8c2NyaXB0IHNyYz0iWyUgQ29uZmlnKCJGcm9udGVuZDo6UmljaFRleHRQYXRoIikgJV1ja2VkaXRvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIApbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCUNLRURJVE9SLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmcmVzcG9uc2VUeXBlPWpzb24mRm9ybUlEPVslIERhdGEuRm9ybUlEICVdIjsKCQoJJC5hbHBhY2Euc2V0RGVmYXVsdExvY2FsZSgobmF2aWdhdG9yLmxhbmd1YWdlcyA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiAobmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpKS5yZXBsYWNlKCItIiwiXyIpKTsKCQkJCgkkLmFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKCQkibm9uZUxhYmVsIjogIi0iLAoJfSk7CgkKCSQoIiNTZXJ2aWNlSUQiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewoJICAgCQljYXJyZWdhRm9ybVslIERhdGEuUHVibGljTW9kZSAlXSh7IkZvcm1JRCI6ICJbJSBEYXRhLkZvcm1JRCAlXSJ9LCAiWyUgVHJhbnNsYXRlKCJTZW5kIikgfCBodG1sICVdIiwgIlslIEVudigiQ0dJSGFuZGxlIikgJV0iLCAiO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEICVdIiwgIlslIERhdGEuRm9ybUlEICVdIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7CiAgIAkJfSBlbHNlIHsKICAgCQkJZGVzdHJ1aXJGb3JtKCk7CiAgIAkJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKCIiKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLmhpZGUoKTsKICAgCQl9ICAJCiAgCX0pOwogIAkKICAgCWlmICgkKCIjU2VydmljZUlEIikuaGFzKCdbc2VsZWN0ZWRdJykpIHsKICAJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKICAJCQljYXJyZWdhRm9ybVslIERhdGEuUHVibGljTW9kZSAlXSh7IkZvcm1JRCI6ICJbJSBEYXRhLkZvcm1JRCAlXSJ9LCAiWyUgVHJhbnNsYXRlKCJTZW5kIikgfCBodG1sICVdIiwgIlslIEVudigiQ0dJSGFuZGxlIikgJV0iLCAiO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEICVdIiwgIlslIERhdGEuRm9ybUlEICVdIik7CiAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsgIAkJCSAgCQkJCiAgCQl9CiAgCX0KICAJCiAgCSQoIiNSZXNwb25zaXZlRm9vdGVyIikucmVtb3ZlKCk7Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgRW5jb2RlIHF3KCBlbmNvZGVfdXRmOCBkZWNvZGVfdXRmOCApOwp1c2UgSlNPTiBxdyhlbmNvZGVfanNvbiBkZWNvZGVfanNvbik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lTDo6U3lzdGVtOjpMb2ciLAoiS2VybmVMOjpTeXN0ZW06OlRpY2tldCIsCiJLZXJuZUw6OlN5c3RlbTo6VHlwZSIsCiJLZXJuZWw6OlN5c3RlbTo6WUFNIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9ucyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWF9Owp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIHN5c3RlbSBmaWVsZCB2YWx1ZXMgKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIFJlcGxhY2VPVFJTVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApID0gJFNlbGYtPkdldE9UUlNTZXJ2aWNlc0RhdGEoKTsKCSRzY2hlbWEgID1+IHMvT1RSU19zZXJ2aWNlX3ZhbHVlcy8kc2VydmljZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3NlcnZpY2VfbGFiZWxzLyRzZXJ2aWNlTmFtZXMvZzsKCglteSAoICR0eXBlTmFtZXMsICR0eXBlSURzICkgPSAkU2VsZi0+R2V0T1RSU1R5cGVzRGF0YShVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0pOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3R5cGVfdmFsdWVzLyR0eXBlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfdHlwZV9sYWJlbHMvJHR5cGVOYW1lcy9nOwoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIHNlcnZpY2VzIGluZm8gKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIEdldE9UUlNTZXJ2aWNlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzZXJ2aWNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJbXkgJXNlcnZpY2VMaXN0ID0gJHNlcnZpY2VzLT5TZXJ2aWNlTGlzdCggVmFsaWQgPT4gMSwgVXNlcklEID0+ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpICk7CglteSAkc2VydmljZU5hbWVzID0gIiI7CglteSAkc2VydmljZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICRzZXJ2aWNlTGlzdHskYX0gY21wICRzZXJ2aWNlTGlzdHskYn0gKSB9IGtleXMgJXNlcnZpY2VMaXN0ICkgewoJCSRzZXJ2aWNlTmFtZXMgLj0gIlwiJHNlcnZpY2VMaXN0eyRffVwiLCI7CgkJJHNlcnZpY2VJRHMgICAuPSAiJF8sIjsKCX0KCSRzZXJ2aWNlTmFtZXMgPSBzdWJzdHIoJHNlcnZpY2VOYW1lcywgMCwgLTEpOwoJJHNlcnZpY2VJRHMgPSBzdWJzdHIoJHNlcnZpY2VJRHMsIDAsIC0xKTsKCXJldHVybiAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICk7Cn0KCj1oZWFkCkdldCBPVFJTIHRpY2tldCB0eXBlcyAKPWN1dApzdWIgR2V0T1RSU1R5cGVzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCglteSAldHlwZUxpc3QgID0gJHRpY2tldE9iamVjdC0+VGlja2V0VHlwZUxpc3QoIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwoJbXkgJHR5cGVOYW1lcyA9ICIiOwoJbXkgJHR5cGVJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdHlwZUxpc3R7JGF9IGNtcCAkdHlwZUxpc3R7JGJ9ICkgfSBrZXlzICV0eXBlTGlzdCApIHsKCQlpZiAoaW5kZXgoJHR5cGVMaXN0eyRffSwgJzo6JykgPT0gLTEpIHsKCQkJJHR5cGVOYW1lcyAuPSAiXCIkdHlwZUxpc3R7JF99XCIsIjsKCQkJJHR5cGVJRHMgICAuPSAiJF8sIjsKCQl9Cgl9CgkKCSR0eXBlTmFtZXMgPSBzdWJzdHIoJHR5cGVOYW1lcywgMCwgLTEpOwoJJHR5cGVJRHMgPSBzdWJzdHIoJHR5cGVJRHMsIDAsIC0xKTsKCQoJcmV0dXJuICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBkeW5hbWljIGZpZWxkcwo9Y3V0CnN1YiBSZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAkZGZpZWxkcyAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15IEBkZmllbGRMaXN0ID0gQHsgJGRmaWVsZHMtPkR5bmFtaWNGaWVsZExpc3RHZXQoIFZhbGlkID0+IDEgKSB9OwoKCWZvcmVhY2ggKEBkZmllbGRMaXN0KSB7CgkJbXkgJGNhbXBvID0gJF87CgoJCW15ICRuYW1lICAgICAgICAgID0gJGNhbXBvLT57TmFtZX07CgkJbXkgJGNvbmZpZyAgICAgICAgPSAkY2FtcG8tPntDb25maWd9OwoJCW15ICR0eXBlICAgICAgICAgID0gJGNhbXBvLT57RmllbGRUeXBlfTsKCQlteSAkaWRGaWVsZFZhbHVlcyA9ICJERl8iIC4gJG5hbWUgLiAiX3ZhbHVlcyI7CgkJbXkgJGlkRmllbGRMYWJlbHMgPSAiREZfIiAuICRuYW1lIC4gIl9sYWJlbHMiOwoJCWlmICggJHR5cGUgZXEgIkRyb3Bkb3duIiApIHsKCQkJbXkgKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApID0gJFNlbGYtPkdldER5bmFtaWNGaWVsZFZhbHVlcyggQ29uZmlnREYgPT4gJGNvbmZpZyApOwoJCQkkc2NoZW1hICA9fiBzLyRpZEZpZWxkVmFsdWVzLyRkZlZhbHVlcy9nOwoJCQkkb3B0aW9ucyA9fiBzLyRpZEZpZWxkTGFiZWxzLyRkZkxhYmVscy9nOwoJCX0KCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBkeWFubWljIGZpZWxkIHZhbHVlcwo9Y3V0CnN1YiBHZXREeW5hbWljRmllbGRWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRjb25maWcgPSAkUGFyYW17Q29uZmlnREZ9OwoJbXkgJHZhbHVlcyA9ICRjb25maWctPntQb3NzaWJsZVZhbHVlc307CgoJbXkgJGRmVmFsdWVzID0gIiI7CglteSAkZGZMYWJlbHMgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHZhbHVlcy0+eyRhfSBjbXAgJHZhbHVlcy0+eyRifSApIH0ga2V5cyAleyR2YWx1ZXN9ICkgewoJCSRkZlZhbHVlcyAuPSAiXCIkX1wiLCI7CgkJJGRmTGFiZWxzIC49ICJcIiR2YWx1ZXMtPnskX31cIiwiOwoJfQoKCSRkZlZhbHVlcyA9IHN1YnN0cigkZGZWYWx1ZXMsIDAsIC0xKTsKCSRkZkxhYmVscyA9IHN1YnN0cigkZGZMYWJlbHMsIDAsIC0xKTsKCXJldHVybiAoICRkZlZhbHVlcywgJGRmTGFiZWxzICk7Cgp9Cgo9aGVhZApCdWlsZHMgc2VydmljZSBjaG9vc2luZyBjb21ibwo9Y3V0CnN1YiBCdWlsZFNlcnZpY2VzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJFJlc3RyaWN0ZWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2UiKTsKCQoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCW15ICVTZXJ2aWNlcyA9ICgpOwoKCWlmICggISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCSVTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCggVXNlcklEID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLCApOwoJfQoJZWxzZSB7CgkJJVNlcnZpY2VzID0KCQkgICRRdWV1ZVNlcnZpY2VPYmplY3QtPkdldFNlcnZpY2VMaXN0KCBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLCApOwoJfQoJbXkgQFNlcnZpY2VzQ29tYm8gPSAoKTsKCQoJbXkgQHJlc3RyaWN0ZWRTZXJ2aWNlcyA9ICRSZXN0cmljdGVkT2JqZWN0LT5HZXRSZXN0cmljdGVkU2VydmljZXMoKTsKCQoJZm9yIG15ICRzZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlcyApIHsKCQlpZiAoIGdyZXAgeyBpbmRleCggJFNlcnZpY2VzeyRffSwgJFNlcnZpY2VzeyRzZXJ2aWNlSUR9IC4gIjo6IiApID49IDAgfSAoIGtleXMgJVNlcnZpY2VzICkgKSB7CQkJCgkJCWlmICghICggJHNlcnZpY2VJRCB+fiBAcmVzdHJpY3RlZFNlcnZpY2VzICkgKSB7CgkJCQlteSAlc2VydiA9ICgpOwoJCQkJJHNlcnZ7VmFsdWV9ICAgID0gJFNlcnZpY2VzeyRzZXJ2aWNlSUR9OwoJCQkJJHNlcnZ7S2V5fSAgICAgID0gJHNlcnZpY2VJRDsKCQkJCSRzZXJ2e0Rpc2FibGVkfSA9IDE7CgkJCQlwdXNoIEBTZXJ2aWNlc0NvbWJvLCBcJXNlcnY7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCWlmICghICggJHNlcnZpY2VJRCB+fiBAcmVzdHJpY3RlZFNlcnZpY2VzICkgKSB7CgkJCQlteSAlc2VydiA9ICgpOwoJCQkJJHNlcnZ7VmFsdWV9ID0gJFNlcnZpY2VzeyRzZXJ2aWNlSUR9OwoJCQkJJHNlcnZ7S2V5fSAgID0gJHNlcnZpY2VJRDsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCX0KCglAU2VydmljZXNDb21ibyA9IHNvcnQgeyAkYS0+e1ZhbHVlfSAuICI6OiIgY21wICRiLT57VmFsdWV9IC4gIjo6IiB9IEBTZXJ2aWNlc0NvbWJvOwoJCglteSAkcmV0b3JubyA9ICI8c2VsZWN0IGlkPVwiU2VydmljZUlEXCIgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgY2xhc3M9XCJzZWxlY3RwaWNrZXJcIiBkYXRhLWxpdmUtc2VhcmNoPVwidHJ1ZVwiPlxuPG9wdGlvbiB2YWx1ZT1cIlwiPi08L29wdGlvbj4iOwoJbXkgJGluT3B0ID0gMDsKCglmb3IgbXkgJHNlcnZpY2UgKEBTZXJ2aWNlc0NvbWJvKSB7CgkJaWYgKCRzZXJ2aWNlLT57RGlzYWJsZWR9KSB7CgkJCWlmICgkaW5PcHQpIHsKCQkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9vcHRncm91cD5cbiI7CgkJCX0KCQkJJGluT3B0ID0gMTsKCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8b3B0Z3JvdXAgbGFiZWw9JyIgLiAkc2VydmljZS0+e1ZhbHVlfSAuICInPlxuIjsKCQl9IGVsc2UgewoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJfQoJfQoJCglpZiAoJGluT3B0KSB7CgkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCX0KCQoJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L3NlbGVjdD5cbiI7CgoJcmV0dXJuICRyZXRvcm5vOwp9Cgo9aGVhZApSZXR1cm5zIHNlcnZpY2UgbmFtZSB3aXRob3V0IHRoZSBwYXJlbnQgc2VydmljZXMgbmFtZXMKPWN1dApzdWIgTGFzdFBhcnQgewoJbXkgJFNlbGYgID0gc2hpZnQ7CglteSAkcXVldWUgPSBzaGlmdDsKCW15IEBwYXJ0cyA9IHNwbGl0KCAiOjoiLCAkcXVldWUgKTsKCXJldHVybiAkcGFydHNbLTFdOwp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVcGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGUgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCQoJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlVwbG9hZEZpbGVDbWQiKSBlcSAiVXBsb2FkRmlsZSIpIHsKCQkkU2VsZi0+RGVidWcoIlVwbG9hZCBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFNlbGYtPlVwbG9hZEZpbGVSZWNlaXZlKCk7CQkKCX0gZWxzaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlVwbG9hZEZpbGVDbWQiKSBlcSAiRGVsZXRlRmlsZSIpIHsKCQkkU2VsZi0+RGVidWcoIkRlbGV0ZSB1cGxvYWRlZCBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFNlbGYtPlVwbG9hZEZpbGVEZWxldGUoKTsJCQoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIlVua25vd24gZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuIDE7Cgl9Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZURlbGV0ZSgpIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRmaWxlTmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZpbGVuYW1lIik7CglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgkKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlIGZpbGUgJGZpbGVOYW1lIGZyb20gZm9ybSAkZm9ybUlkIik7CgkKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglteSAkZmlsZURlbGV0ZWQgPSAwOwoJCQoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJaWYgKCR1cGxvYWRlZEZpbGUtPntGaWxlbmFtZX0gZXEgJGZpbGVOYW1lKSB7CgkJCSRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlRmlsZShGb3JtSUQgPT4gJGZvcm1JZCwgRmlsZUlEID0+ICR1cGxvYWRlZEZpbGUtPntGaWxlSUR9KTsKCQkJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGVkIGZpbGUgIiAuICRmaWxlTmFtZSk7CgkJCSRmaWxlRGVsZXRlZCA9IDE7CgkJfQoJfQoJCglpZiAoJGZpbGVEZWxldGVkKSB7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7ICRmaWxlTmFtZTogdHJ1ZX0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwkJCQoJfSBlbHNlIHsKCQlyZXR1cm4gMTsKCX0JCn0KCj1oZWFkCkRlbGV0ZXMgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIGZvcm0KPWN1dApzdWIgQ2xlYXJDYWNoZSgpIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW17Rm9ybUlEfTsKCQoJJFNlbGYtPkRlYnVnKCJDbGVhcmluZyBjYWNoZSBmb3IgZm9ybSAiIC4gJGZvcm1JZCk7CgkKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglteSAkZmlsZURlbGV0ZWQgPSAwOwoJCQoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gMSk7CQkKCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSk7Cgl9CQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVUGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVSZWNlaXZlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoKCW15ICV0bXBGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoUGFyYW0gPT4gImF0dGFjaG1lbnRfZmlsZXMiKTsJCglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZvcm1JRCIgKTsKCglpZiAoISAkdG1wRmlsZXtGaWxlbmFtZX0gfHwgISAkZm9ybUlkKSB7CgkJbXkgJG1zZ0Vycm9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbnZhbGlkIGZpbGUhIik7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7IFwiZXJyb3JcIjogXCIkbXNnRXJyb3JcIiwgXCJmaWxlc1wiOiBbXSB9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsKCX0KCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IEFkZGluZyBmaWxlIHRvIGNhY2hlLiBGb3JtSUQ6ICIgLiAkZm9ybUlkIC4gIiBcdCBGaWxlbmFtZTogIiAuICR0bXBGaWxle0ZpbGVuYW1lfSAuICIgXHQgQ29udGVudFR5cGU6ICIgLiAkdG1wRmlsZXtDb250ZW50VHlwZX0gKTsKCQoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJbXkgJEZvcm1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoJCgkkU2VsZi0+Q2xlYXJDYWNoZShGb3JtSUQgPT4gJEZvcm1JRCk7CgoJbXkgKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICkgPSAkU2VsZi0+R2V0Rm9ybSggUHVibGljID0+ICRQYXJhbXtQdWJsaWN9LCBTZXJ2aWNlRm9ybSA9PiBcJXNlcnZpY2VGb3JtLCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gIlt7IiAuICRzY2hlbWEgLiAifSwgeyIgLiAkZmllbGRzIC4gIn0sIFwiIiAuICRpbnRyb2R1Y3Rpb24gLiAiXCJdIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKQWxsb3dzIHVzaW5nIGEgZmllbGQgaW4gdGhlIGZvcm0gdG8gc2VsZWN0IGEgdGFyZ2V0IHF1ZXVlLgpJZiBhIHF1ZXVlIHdhcyBkZWZpbmVkIGluIHJlcXVlc3QgcGFyYW1ldGVyLCB1c2VzIGl0LgpJZiB0aGVyZSBpcyBhIHByZWZpeCBkZWZpbmVkIGZvciB0aGUgcXVldWVzIHRvIGF1dG9tYXRpY2FsbHkgZm9yd2FyZCB0aWNrZXRzLAphbmQgYWxzbyBhIGZpZWxkIHdhcyBkZWZpbmVkIGFzIGhhbmRsaW5nIHRoZSB0YXJnZXQgcXVldWUsIHRyeSB0byBsb2NhdGUgb25lLgoKSWYgbm9uZSBpcyBmb3VuZCwgdXNlcyB0aGUgZGVmYXVsdCBxdWV1ZS4KCkZvciBleGFtcGxlOgoJUXVldWVEZWZhdWx0ID0gUHJpbWVpcm8gTml2ZWwKCVF1ZXVlUHJlZml4ID0gUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRmllbGQgPSBVbmlkYWRlCgkKCUF2YWlsYWJsZVF1ZXVlcyA9IFByaW1laXJvIE5pdmVsIENDQiwgUHJpbWVpcm8gTml2ZWwgQ0NFLCBQcmltZWlybyBOaXZlbAoJUXVldWVEZWZhdWx0ID0gUHJpbWVpcm8gTml2ZWwKCQoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0IsIHRoZW4gc2VsZWN0cyBxdWV1ZSBQcmltZWlybyBOaXZlbCBDQ0IKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NKIChubyBxdWV1ZSBieSB0aGF0IHN1ZmZpeCksIHRoZW4gc2VsZWN0cyBxdWV1ZSBQcmltZWlybyBOaXZlbAoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0UsIHRoZW4gc2VsZWN0cyBxdWV1ZSBQcmltZWlybyBOaXZlbCBDQ0UKPWN1dApzdWIgR2V0UXVldWVJRCgpIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCQoJIyBDaGVjayBpZiBxdWV1ZUlEIHdhcyBzZW50CglteSAkUXVldWVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQoJaWYgKCRRdWV1ZUlEKSB7CgkJbXkgJVF1ZXVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUXVldWVJRCk7CgkJcmV0dXJuICgkUXVldWV7Ik5hbWUifSwgJFF1ZXVlSUQpOyAKCX0KCgkjIEdldHMgZGVmYXVsdCBRdWV1ZQoJbXkgJENvbmZpZ1RpY2tldCAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIik7CglteSAkQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkKCglteSAkUXVldWVEZWZhdWx0ID0gJENvbmZpZ1RpY2tldC0+eyJRdWV1ZURlZmF1bHQifTsKCgkjIENoZWNrcyBpZiB0aGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcXVldWUKCW15ICRRdWV1ZVByZWZpeCA9ICRDb25maWdUaWNrZXRXaXphcmQtPnsiUXVldWVQcmVmaXgifTsKCW15ICRRdWV1ZUZpZWxkICA9ICRDb25maWdUaWNrZXRXaXphcmQtPnsiUXVldWVGaWVsZCJ9OwoKCW15ICVRdWV1ZUxpc3RJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCAgICAgICAgID0+IDEgKTsKCW15ICVRdWV1ZUxpc3QgICA9IHJldmVyc2UgJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkID0+IDEgKTsKCSRRdWV1ZUlEICAgICA9ICRRdWV1ZUxpc3R7JFF1ZXVlRGVmYXVsdH07CglteSAkUXVldWUgICAgICAgPSAkUXVldWVMaXN0SUR7JFF1ZXVlSUR9OwoKCWlmICggJFF1ZXVlUHJlZml4ICYmICRRdWV1ZUZpZWxkICkgewoJCW15ICRRdWV1ZVNlbGVjdGVkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFF1ZXVlRmllbGQgKTsKCQlteSAkUXVldWVOYW1lID0gIiRRdWV1ZVByZWZpeCAkUXVldWVTZWxlY3RlZCI7CgoJCWlmICggJFF1ZXVlTGlzdHskUXVldWVOYW1lfSApIHsKCQkJJFF1ZXVlSUQgPSAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9OwoJCQkkUXVldWUgICA9ICRRdWV1ZU5hbWU7CgkJfQoJfQoJCglyZXR1cm4gKCAkUXVldWUsICRRdWV1ZUlEICk7Cn0KCj1oZWFkClJldHVybnMgdGhlIGZvcm0gY29kZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRzY2hlbWE7CglteSAkZmllbGRzOwoJCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJHZXR0aW5nIHB1YmxpYyBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYVB1YmxpYygpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMoKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJHZXR0aW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWEoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zKCk7Cgl9CgkKCW15ICRpbnRyb2R1Y3Rpb247CgoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU1ZhbHVlcygKCQlTY2hlbWEgID0+ICRzY2hlbWEsCgkJT3B0aW9ucyA9PiAkZmllbGRzLAoJCVVzZXJJRCAgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfQoJKTsKCQoJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfSApIHsKCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCSRpbnRyb2R1Y3Rpb24gPSAiIjsKCQkjIEluY2x1ZGUgZHluYW1pYyBmaWVsZHMgaW4gcmVwbGFjZSBjb21tYW5kCgkJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCX0KCWVsc2UgewoJCW15ICVzZXJ2aWNlRm9ybSA9ICV7ICRQYXJhbXtTZXJ2aWNlRm9ybX0gfTsKCQkkaW50cm9kdWN0aW9uID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgoJCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX17U2NoZW1hfSApIHsKCQkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJfQoJCWVsc2UgewoJCQlteSAkc2NoZW1hRm9ybSA9ICIsIiAuICRzZXJ2aWNlRm9ybXtTY2hlbWF9OwoJCQlteSAkZmllbGRzRm9ybSA9ICIsIiAuICRzZXJ2aWNlRm9ybXtGb3JtfTsKCQkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8kc2NoZW1hRm9ybS9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8kZmllbGRzRm9ybS9nOwoJCX0KCgkJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNEeW5hbWljRmllbGRzKCBTY2hlbWEgPT4gJHNjaGVtYSwgT3B0aW9ucyA9PiAkZmllbGRzICk7CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJCglpZiAoJFBhcmFteyJRdWV1ZUlEIn0pIHsJCQkKCQkkc2NoZW1hID0gJHNjaGVtYSAuICIsXG5cIlF1ZXVlSURcIjoge1xuXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cImRlZmF1bHRcIjogXCIiIC4gJFBhcmFteyJRdWV1ZUlEIn0gLiAiXCJ9IjsKCQkkZmllbGRzID0gJGZpZWxkcyAuICIsXG5cIlF1ZXVlSURcIjoge1xuXCJ0eXBlXCI6IFwiaGlkZGVuXCJcbn0iOwoJfQoKCXJldHVybiAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKTsKfQoKPWhlYWQKSWYgc29tZSBmaWVsZHMgaGF2ZSBmaXhlZCB2YWx1ZXMgaW4gc2VydmljZSBkZWZpbml0aW9uLCBzZXRzIHRoZW0KPWN1dApzdWIgQWRqdXN0Rml4ZWRGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRmb3JtID0gJFBhcmFte0ZpZWxkc307CglteSAkZml4ZWRWYWx1ZXMgPSAkUGFyYW17Rml4ZWRWYWx1ZXN9OwoJCglteSBAdmFsdWVzID0gc3BsaXQoL1xuLywgJGZpeGVkVmFsdWVzKTsKCQoJZm9yIG15ICR2YWx1ZSAoQHZhbHVlcykgewoKCQkkdmFsdWUgPX4gcy9cci8vZzsKCQlteSBAZGF0YSA9IHNwbGl0KCc9JywgJHZhbHVlKTsKCQkJCQkKCQlteSAkZmllbGRLZXkgPSAkZGF0YVswXTsKCQlteSAkZml4ZWRWYWx1ZSA9ICRkYXRhWzFdOwoJCQkJCQkJCQkJCgkJbXkgJGtleSA9ICcoIicgLiAkZmllbGRLZXkgLiAnIltcIF0/OltcIF0/e1tefV0rfSknOwoJCW15ICRyZXBsYWNlID0gJyInIC4gJGZpZWxkS2V5IC4gJyInIC4gJzogeyJ0eXBlIjogInN0cmluZyIsICJkZWZhdWx0IjogIicgLiAkZml4ZWRWYWx1ZSAuICcifSc7CgkJCgkJJHNjaGVtYSA9fiBzLyRrZXkvJHJlcGxhY2UvOwoJCQoJCSRmb3JtID0gInsiIC4gJGZvcm0gLiAifSI7CgkJI3ByaW50IFNUREVSUiAiXG5cbiIgLiAkZm9ybSAuICJcblxuIjsKCQlteSAkZm9ybVN0cnVjdCA9IGRlY29kZV9qc29uKGVuY29kZV91dGY4KCRmb3JtKSk7CgkJbXkgJGhpZGRlblN0cnVjdCA9IHt9OwkJCgkJJGhpZGRlblN0cnVjdC0+eyJ0eXBlIn0gPSAiaGlkZGVuIjsKCQkkZm9ybVN0cnVjdC0+eyRmaWVsZEtleX0gPSAkaGlkZGVuU3RydWN0OwoJCQoJCSNwcmludCBTVERFUlIgIlxuXG4iIC4gRHVtcGVyKCRmb3JtU3RydWN0KSAuICJcblxuIjsKCQkKCQkkZm9ybSA9IGRlY29kZV91dGY4KGVuY29kZV9qc29uKCRmb3JtU3RydWN0KSk7CgkJI3ByaW50IFNUREVSUiAiXG5cbiIgLiAkZm9ybSAuICJcblxuIjsKCQlzdWJzdHIoJGZvcm0sIDAsIDEsICIiKTsKCQlzdWJzdHIoJGZvcm0sIC0xLCAxLCAiIik7CgkJcHJpbnQgU1RERVJSICJcblxuIiAuICRmb3JtIC4gIlxuXG4iOwoJCSMKCQkjJGtleSA9ICcoIicgLiAkZmllbGRLZXkgLiAnIltcIF0/OltcIF0/e1tefV0rfSknOwoJCSMkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciOiB7InR5cGUiOiAiaGlkZGVuIicgLiAiXG59IjsKCQkjJGZvcm0gPX4gcy8ka2V5LyRyZXBsYWNlLzsKCX0JCQoJCgkjcHJpbnQgU1RERVJSICJcblxuIiAuICRmb3JtIC4gIlxuXG4iIC4gJHNjaGVtYSAuICJcblxuIjsKCXJldHVybiAoJHNjaGVtYSwgJGZvcm0pOwkKfQoKPWhlYWQKQ3JlYXRlcyBhIG5ldyB0aWNrZXQsIGdpdmVuIHRoZSBpbnB1dCBkYXRhIGFuZCBzZW50IGF0dGFjaG1lbnRzL2ltYWdlcwo9Y3V0CnN1YiBDcmVhdGVUaWNrZXQgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgoJbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kIik7CglteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIpOwoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCQogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIAoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkTWFpbnRlbmFuY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TWFpbnRlbmFuY2UiKTsKCW15ICREYXRlVXRpbHNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RGF0ZVV0aWxzIik7CgoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7QXV0aGVudGljYXRlVVJMfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGU6OkNBUzo6Q0FTVXJsJykKCQkJICAuICIvbG9naW4/c2VydmljZT0iCgkJCSAgLiAiaHR0cHM6Ly8iCgkJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCQkgIC4gJEVOVntTQ1JJUFRfTkFNRX0KCQkJICAuICI/QWN0aW9uPU5ld1RpY2tldFdpemFyZCI7Cgl9CgkKCSMgQ2hlY2sgaWYgcXVldWUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZAoJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKSkgewkJCgkJJERhdGF7UXVldWVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkJJFNlbGYtPkRlYnVnKCJTcGVjaWZpYyBxdWV1ZSBkZWZpbmVkID0+ICIgLiAkRGF0YXtRdWV1ZUlEfSk7Cgl9IGVsc2UgewoJCSAjIENoZWNrIGlmIG11c3Qgc2hvdyBxdWV1ZSAtIGlmIHNvLCByZWRpcmVjdCB1c2VyCiAgICAgICAgbXkgJF9Db25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKICAgICAgICBteSAkX1Nob3dRdWV1ZSAgICAgICAgICA9ICRfQ29uZmlnVGlja2V0V2l6YXJkLT57IlNob3dRdWV1ZSJ9OwogICAgICAgIGlmICghICRfU2hvd1F1ZXVlKSB7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiUXVldWUgc2VsZWN0aW9uIG11c3QgYmUgc2hvd24gLSByZWRpcmVjdGlvbiB0byBRdWV1ZVBhbmVsUHVibGljIGFjdGlvbiIpOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249UXVldWVzUGFuZWxQdWJsaWMiICk7CiAgICAgICAgfQkJCgl9CgkKCW15ICggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+R2V0Rm9ybShQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30pOwoJCgkkRGF0YXtTY2hlbWFGb3JtfSA9ICRzY2hlbWE7CgkkRGF0YXtGaWVsZHNGb3JtfSA9ICRmaWVsZHM7CgoJIyBDb21tb24gaW5mbwoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CglteSAkaWRDdXN0b21UZW1wbGF0ZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJDdXN0b21UZW1wbGF0ZSJ9OwoJCglteSAkbXNnQ2hvb3NlU2VydmljZTsJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkbXNnQ2hvb3NlU2VydmljZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJNZXNzYWdlQ2hvb3NlU2VydmljZVB1YmxpYyJ9OwoJfSBlbHNlIHsKCQkkbXNnQ2hvb3NlU2VydmljZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJNZXNzYWdlQ2hvb3NlU2VydmljZSJ9OwoJfQoJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCW15ICVxdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKTsKCQlteSAkcXVldWVOYW1lID0gJHF1ZXVlRGF0YXtOYW1lfTsJCQoJCSRtc2dDaG9vc2VTZXJ2aWNlID1+IHMvUExBQ0VcX05BTUUvJHF1ZXVlTmFtZS9nOwoJfQoJJERhdGF7TXNnQ2hvb3NlU2VydmljZX0gPSAkbXNnQ2hvb3NlU2VydmljZTsJCgkKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCQoJCgoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCSREYXRhe1NlcnZpY2VTdHJnfSA9ICRUaWNrZXRXaXphcmQtPkJ1aWxkU2VydmljZXMoU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkpOwoKCSMgQnVpbGQgb3V0cHV0CglteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSwgIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiTmV3IHRpY2tldCB3aXphcmQiKSApOwoJCSAgCgkjIExvYWQgY3VycmVudCBtYWludGVuYW5jZXMgIAoJbXkgQG1haW50ZW5hbmNlcyA9ICRNYWludGVuYW5jZU9iamVjdC0+TGlzdEN1cnJlbnRNYWludGVuYW5jZXMoKTsKCQkKCWlmIChAbWFpbnRlbmFuY2VzKSB7CgkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCU5hbWUgPT4gJ01haW50ZW5hbmNlc1BhbmVsJywKCQkpOwkJCgkJCQoJCWZvciBteSAkbWFpbnRlbmFuY2VIYXNoIChAbWFpbnRlbmFuY2VzKSB7CgkJCW15ICVtYWludGVuYW5jZSA9ICV7JG1haW50ZW5hbmNlSGFzaH07CgkJCQkJCQkKCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQlOYW1lID0+ICdNYWludGVuYW5jZUxpbmUnLAoJCQkJRGF0YSA9PiB7CgkJCQkJTWVzc2FnZSAgID0+ICRtYWludGVuYW5jZXsnRGVzY3JpcHRpb24nfSwJCQkJCQkKCQkJCQlTdGFydERhdGUgPT4gJERhdGVVdGlsc09iamVjdC0+QnJhemlsaWFuRGF0ZShUaW1lc3RhbXAgPT4gJERhdGVVdGlsc09iamVjdC0+RnJvbVNRTChTdHJpbmdEYXRlID0+ICRtYWludGVuYW5jZXtTdGFydERhdGV9KSksCgkJCQl9KTsJCQkJCQkJCgkJfQkKCX0JCQoJCgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiUHVibGljIHZpZXcgLSB1bmF1dGhlbnRpY2F0ZWQgbWVzc2FnZSBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCU5hbWUgPT4gJ1VuYXV0aGVudGljYXRlZE1lc3NhZ2UnLAoJCSk7CgkJJFNlbGYtPkRlYnVnKCJQdWJsaWMgdmlldyAtIHB1YmxpYyB0b29sYmFyIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnVG9vbEJhclB1YmxpYycsCgkJKTsJCQoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkN1c3RvbWVyIHZpZXcgLSBjdXN0b21lciB0b29sYmFyIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygJCQoJCQlOYW1lID0+ICdUb29sQmFyQ3VzdG9tZXInLAoJCSk7Cgl9CgoJIyBQcmVwYXJlIGNhY2hlIGZvciBpbWFnZW5zIGFuZCBhdHRhY2htZW50cwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCSREYXRhe0Zvcm1JRH0gPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRENyZWF0ZSgpOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7UHVibGljTW9kZX0gPSAiUHVibGljIjsKCX0KCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKCQlEYXRhICAgICAgICAgPT4gXCVEYXRhLAoJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkJywKCSk7CgkJCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cn0KCj1oZWFkClNlcGFyYXRlIHNlcnZpY2UtZmllbGQgbGFiZWwgbmFtZXMsIHRvIG1ha2UgaXQgaHVtYW4tcmVhZGFibGUgKENhcGl0YWxMaWtlTGFiZWxzIC0+IENhcGl0YWwgbGlrZSBsYWJlbHMpCj1jdXQKc3ViIGJyZWFrV29yZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQkKCW15ICRyZXR1cm4gPSAkUGFyYW17VGV4dH07CQoJCgkkcmV0dXJuID1+IHMvKC4pKFtBLVpdW15BLVpdKS8kMSAkMi9nOwoJJHJldHVybiA9fiBzLyhbXHcnXSspL1x1XEwkMS9nOwoJCglyZXR1cm4gJHJldHVybjsKfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCgoxOwo=</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgiW25hbWU9J3NlcnZpY2UnXSIpLnZhbCgkKCIjU2VydmljZUlEIikudmFsKCkpOwoJCSQoIltuYW1lPSdGb3JtSUQnXSIpLnZhbChmb3JtLmRhdGEuRm9ybUlEKTsKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJCQllZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0JCQkKCQl9LCAyMDAwKTsKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzKGFjdGl2ZVF1ZXVlKTsKfTsKCgp2YXIgcG9zdFJlbmRlckNhbGxiYWNrUHVibGljID0gZnVuY3Rpb24oZm9ybSkgewoJZm9ybU9wdGlvbnMgPSBmb3JtLm9wdGlvbnMuZmllbGRzOwoJZm9ybUFscGFjYSA9IGZvcm07CgkKCWlmIChmb3JtKSB7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigpOwoJCSQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.11</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.11">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-07-24 05:33:31</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbD4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQkJPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9Ii9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBhdXRoZW50aWNhdGUiKSB8IGh0bWwgJV08L0E+ClslIFJlbmRlckJsb2NrRW5kKCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCQkKCTwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD0iZm9ybVBhbmVsIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgVHJhbnNsYXRlKCJQbGVhc2UgZmlsbCB0aGUgZm9sbG93aW5nIGZvcm0gdG8gb3BlbiB5b3VyIHRpY2tldCIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSIgaWQ9ImZvcm1UaWNrZXQiPgoJCgk8L2Rpdj4KPC9kaXY+CiAKIDxzY3JpcHQgc3JjPSJbJSBDb25maWcoIkZyb250ZW5kOjpSaWNoVGV4dFBhdGgiKSAlXWNrZWRpdG9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCgkkLmFscGFjYS5zZXREZWZhdWx0TG9jYWxlKChuYXZpZ2F0b3IubGFuZ3VhZ2VzID8gbmF2aWdhdG9yLmxhbmd1YWdlc1swXSA6IChuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkpLnJlcGxhY2UoIi0iLCJfIikpOwoJCQkKCSQuYWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewoJCSJub25lTGFiZWwiOiAiLSIsCgl9KTsKCQoJJCgiI1NlcnZpY2VJRCIpLmNoYW5nZShmdW5jdGlvbigpIHsKCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CgkgICAJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsKICAgCQl9IGVsc2UgewogICAJCQlkZXN0cnVpckZvcm0oKTsKICAgCQkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoIiIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuaGlkZSgpOwogICAJCX0gIAkKICAJfSk7CiAgCQogICAJaWYgKCQoIiNTZXJ2aWNlSUQiKS5oYXMoJ1tzZWxlY3RlZF0nKSkgewogIAkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewogIAkJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOyAgCQkJICAJCQkKICAJCX0KICAJfQogIAkKICAJJCgiI1Jlc3BvbnNpdmVGb290ZXIiKS5yZW1vdmUoKTsKPC9zY3JpcHQ+ICAgIApbJSBFTkQgJV0=</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgRW5jb2RlIHF3KCBlbmNvZGVfdXRmOCBkZWNvZGVfdXRmOCApOwp1c2UgSlNPTiBxdyhlbmNvZGVfanNvbiBkZWNvZGVfanNvbik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lTDo6U3lzdGVtOjpMb2ciLAoiS2VybmVMOjpTeXN0ZW06OlRpY2tldCIsCiJLZXJuZUw6OlN5c3RlbTo6VHlwZSIsCiJLZXJuZWw6OlN5c3RlbTo6WUFNIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9ucyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWF9Owp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIHN5c3RlbSBmaWVsZCB2YWx1ZXMgKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIFJlcGxhY2VPVFJTVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApID0gJFNlbGYtPkdldE9UUlNTZXJ2aWNlc0RhdGEoKTsKCSRzY2hlbWEgID1+IHMvT1RSU19zZXJ2aWNlX3ZhbHVlcy8kc2VydmljZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3NlcnZpY2VfbGFiZWxzLyRzZXJ2aWNlTmFtZXMvZzsKCglteSAoICR0eXBlTmFtZXMsICR0eXBlSURzICkgPSAkU2VsZi0+R2V0T1RSU1R5cGVzRGF0YShVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0pOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3R5cGVfdmFsdWVzLyR0eXBlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfdHlwZV9sYWJlbHMvJHR5cGVOYW1lcy9nOwoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIHNlcnZpY2VzIGluZm8gKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIEdldE9UUlNTZXJ2aWNlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzZXJ2aWNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJbXkgJXNlcnZpY2VMaXN0ID0gJHNlcnZpY2VzLT5TZXJ2aWNlTGlzdCggVmFsaWQgPT4gMSwgVXNlcklEID0+ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpICk7CglteSAkc2VydmljZU5hbWVzID0gIiI7CglteSAkc2VydmljZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICRzZXJ2aWNlTGlzdHskYX0gY21wICRzZXJ2aWNlTGlzdHskYn0gKSB9IGtleXMgJXNlcnZpY2VMaXN0ICkgewoJCSRzZXJ2aWNlTmFtZXMgLj0gIlwiJHNlcnZpY2VMaXN0eyRffVwiLCI7CgkJJHNlcnZpY2VJRHMgICAuPSAiJF8sIjsKCX0KCSRzZXJ2aWNlTmFtZXMgPSBzdWJzdHIoJHNlcnZpY2VOYW1lcywgMCwgLTEpOwoJJHNlcnZpY2VJRHMgPSBzdWJzdHIoJHNlcnZpY2VJRHMsIDAsIC0xKTsKCXJldHVybiAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICk7Cn0KCj1oZWFkCkdldCBPVFJTIHRpY2tldCB0eXBlcyAKPWN1dApzdWIgR2V0T1RSU1R5cGVzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCglteSAldHlwZUxpc3QgID0gJHRpY2tldE9iamVjdC0+VGlja2V0VHlwZUxpc3QoIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwoJbXkgJHR5cGVOYW1lcyA9ICIiOwoJbXkgJHR5cGVJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdHlwZUxpc3R7JGF9IGNtcCAkdHlwZUxpc3R7JGJ9ICkgfSBrZXlzICV0eXBlTGlzdCApIHsKCQlpZiAoaW5kZXgoJHR5cGVMaXN0eyRffSwgJzo6JykgPT0gLTEpIHsKCQkJJHR5cGVOYW1lcyAuPSAiXCIkdHlwZUxpc3R7JF99XCIsIjsKCQkJJHR5cGVJRHMgICAuPSAiJF8sIjsKCQl9Cgl9CgkKCSR0eXBlTmFtZXMgPSBzdWJzdHIoJHR5cGVOYW1lcywgMCwgLTEpOwoJJHR5cGVJRHMgPSBzdWJzdHIoJHR5cGVJRHMsIDAsIC0xKTsKCQoJcmV0dXJuICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBkeW5hbWljIGZpZWxkcwo9Y3V0CnN1YiBSZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAkZGZpZWxkcyAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15IEBkZmllbGRMaXN0ID0gQHsgJGRmaWVsZHMtPkR5bmFtaWNGaWVsZExpc3RHZXQoIFZhbGlkID0+IDEgKSB9OwoKCWZvcmVhY2ggKEBkZmllbGRMaXN0KSB7CgkJbXkgJGNhbXBvID0gJF87CgoJCW15ICRuYW1lICAgICAgICAgID0gJGNhbXBvLT57TmFtZX07CgkJbXkgJGNvbmZpZyAgICAgICAgPSAkY2FtcG8tPntDb25maWd9OwoJCW15ICR0eXBlICAgICAgICAgID0gJGNhbXBvLT57RmllbGRUeXBlfTsKCQlteSAkaWRGaWVsZFZhbHVlcyA9ICJERl8iIC4gJG5hbWUgLiAiX3ZhbHVlcyI7CgkJbXkgJGlkRmllbGRMYWJlbHMgPSAiREZfIiAuICRuYW1lIC4gIl9sYWJlbHMiOwoJCWlmICggJHR5cGUgZXEgIkRyb3Bkb3duIiApIHsKCQkJbXkgKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApID0gJFNlbGYtPkdldER5bmFtaWNGaWVsZFZhbHVlcyggQ29uZmlnREYgPT4gJGNvbmZpZyApOwoJCQkkc2NoZW1hICA9fiBzLyRpZEZpZWxkVmFsdWVzLyRkZlZhbHVlcy9nOwoJCQkkb3B0aW9ucyA9fiBzLyRpZEZpZWxkTGFiZWxzLyRkZkxhYmVscy9nOwoJCX0KCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBkeWFubWljIGZpZWxkIHZhbHVlcwo9Y3V0CnN1YiBHZXREeW5hbWljRmllbGRWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRjb25maWcgPSAkUGFyYW17Q29uZmlnREZ9OwoJbXkgJHZhbHVlcyA9ICRjb25maWctPntQb3NzaWJsZVZhbHVlc307CgoJbXkgJGRmVmFsdWVzID0gIiI7CglteSAkZGZMYWJlbHMgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHZhbHVlcy0+eyRhfSBjbXAgJHZhbHVlcy0+eyRifSApIH0ga2V5cyAleyR2YWx1ZXN9ICkgewoJCSRkZlZhbHVlcyAuPSAiXCIkX1wiLCI7CgkJJGRmTGFiZWxzIC49ICJcIiR2YWx1ZXMtPnskX31cIiwiOwoJfQoKCSRkZlZhbHVlcyA9IHN1YnN0cigkZGZWYWx1ZXMsIDAsIC0xKTsKCSRkZkxhYmVscyA9IHN1YnN0cigkZGZMYWJlbHMsIDAsIC0xKTsKCXJldHVybiAoICRkZlZhbHVlcywgJGRmTGFiZWxzICk7Cgp9Cgo9aGVhZApCdWlsZHMgc2VydmljZSBjaG9vc2luZyBjb21ibwo9Y3V0CnN1YiBCdWlsZFNlcnZpY2VzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJFJlc3RyaWN0ZWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2UiKTsKCW15ICRQdWJsaWMgPSAkUGFyYW17UHVibGljfTsKCQoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCW15ICVTZXJ2aWNlcyA9ICgpOwoKCWlmICggISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCSVTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCggVXNlcklEID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLCApOwoJfQoJZWxzZSB7CgkJJVNlcnZpY2VzID0KCQkgICRRdWV1ZVNlcnZpY2VPYmplY3QtPkdldFNlcnZpY2VMaXN0KCBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLCApOwoJfQoJbXkgQFNlcnZpY2VzQ29tYm8gPSAoKTsKCQoJbXkgQHJlc3RyaWN0ZWRTZXJ2aWNlcyA9ICRSZXN0cmljdGVkT2JqZWN0LT5HZXRSZXN0cmljdGVkU2VydmljZXMoKTsKCQoJZm9yIG15ICRzZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlcyApIHsKCQlpZiAoIGdyZXAgeyBpbmRleCggJFNlcnZpY2VzeyRffSwgJFNlcnZpY2VzeyRzZXJ2aWNlSUR9IC4gIjo6IiApID49IDAgfSAoIGtleXMgJVNlcnZpY2VzICkgKSB7CQkJCgkJCWlmICgoISAkUHVibGljKSB8fCAoISAoICRzZXJ2aWNlSUQgfn4gQHJlc3RyaWN0ZWRTZXJ2aWNlcyApKSkgewoJCQkJbXkgJXNlcnYgPSAoKTsKCQkJCSRzZXJ2e1ZhbHVlfSAgICA9ICRTZXJ2aWNlc3skc2VydmljZUlEfTsKCQkJCSRzZXJ2e0tleX0gICAgICA9ICRzZXJ2aWNlSUQ7CgkJCQkkc2VydntEaXNhYmxlZH0gPSAxOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJCWVsc2UgewoJCQlpZiAoKCEgJFB1YmxpYykgfHwgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSkpIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIiI7CglteSAkc2VydmljZVByZURlZmluZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApOwoJJHJldG9ybm8gPSAiPHNlbGVjdCBkYXRhLXdpZHRoPVwiYXV0b1wiIGlkPVwiU2VydmljZUlEXCIgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgY2xhc3M9XCJzZWxlY3RwaWNrZXJcIiBkYXRhLWxpdmUtc2VhcmNoPVwidHJ1ZVwiPlxuPG9wdGlvbiB2YWx1ZT1cIlwiPi08L29wdGlvbj4iOwkKCglpZiAoJHNlcnZpY2VQcmVEZWZpbmVkKSB7CgkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIHNwZWNpZmllZDogJHNlcnZpY2VQcmVEZWZpbmVkIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiU2VydmljZSBub3Qgc3BlY2lmaWVkIik7CgkJCgl9CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCWlmICgkc2VydmljZVByZURlZmluZWQgZXEgJHNlcnZpY2UtPntLZXl9KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0gZWxzZSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0KCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCQkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTRHluYW1pY0ZpZWxkcyggU2NoZW1hID0+ICRzY2hlbWEsIE9wdGlvbnMgPT4gJGZpZWxkcyApOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoKCQkjIEluY2x1ZGUgZHluYW1pYyBmaWVsZHMgaW4gcmVwbGFjZSBjb21tYW5kCgkJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQkKCQkjIFNldCBmaXhlZCBmaWVsZCB2YWx1ZXMsIGlmIGRlZmluZWQKCQlpZiAoJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSkgewoJCQkoJHNjaGVtYSwgJGZpZWxkcykgPSAkU2VsZi0+QWRqdXN0Rml4ZWRGaWVsZHMoU2NoZW1hID0+ICRzY2hlbWEsIEZpZWxkcyA9PiAkZmllbGRzLCBGaXhlZFZhbHVlcyA9PiAkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KTsKCQl9CQoJfQoJCgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgoJCSRTZWxmLT5EZWJ1ZygiQWRqdXN0aW5nIGZpeGVkIGZpZWxkIHsgJGZpZWxkS2V5IH0gd2l0aCB2YWx1ZSBbICRmaXhlZFZhbHVlIF0iKTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoKCQkkU2VsZi0+RGVidWcoIkFkanVzdGluZyBmaXhlZCBmaWVsZHMgaW4gc2NoZW1hOiBcbiAiIC4gJHNjaGVtYSk7CgkJCgkJJHNjaGVtYSA9fiBzLyRrZXkvJHJlcGxhY2UvOwoJCQoJCSRTZWxmLT5EZWJ1ZygiQWRqdXN0aW5nIGZpeGVkIGZpZWxkcyBpbiBmb3JtOiBcbiAiIC4gJGZvcm0pOwoKCQkkZm9ybSA9ICJ7IiAuICRmb3JtIC4gIn0iOwoJCSRmb3JtID0gZW5jb2RlX3V0ZjgoJGZvcm0pOwoJCW15ICRmb3JtU3RydWN0ID0gZGVjb2RlX2pzb24oJGZvcm0pOwoJCW15ICRoaWRkZW5TdHJ1Y3QgPSB7fTsJCQoJCSRoaWRkZW5TdHJ1Y3QtPnsidHlwZSJ9ID0gImhpZGRlbiI7CgkJJGZvcm1TdHJ1Y3QtPnskZmllbGRLZXl9ID0gJGhpZGRlblN0cnVjdDsKCQkKCQlwcmludCBTVERFUlIgRHVtcGVyKCRmb3JtU3RydWN0KTsKCgkJJGZvcm0gPSBlbmNvZGVfanNvbigkZm9ybVN0cnVjdCk7CgkJJGZvcm0gPSBkZWNvZGVfdXRmOCgkZm9ybSk7CgkJc3Vic3RyKCRmb3JtLCAwLCAxLCAiIik7CgkJc3Vic3RyKCRmb3JtLCAtMSwgMSwgIiIpOwkJCgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCSMgQ2hlY2sgaWYgcXVldWUgd2FzIHByZS1kZWZpbmVkCglteSAkcXVldWVGaXhlZCA9IDA7CglpZiAoJERhdGF7UXVldWVJRH0pIHsKCQkkcXVldWVGaXhlZCA9IDE7Cgl9CQoJCgkjIEdldCBxdWV1ZSBuYW1lIGFuZCBpZCB1c2luZyBydWxlcywgaWYgbm8gcXVldWUgd2FzIHByZWRlZmluZWQKCW15ICggJFF1ZXVlLCAkUXVldWVJRCApID0gJFRpY2tldFdpemFyZC0+R2V0UXVldWVJRCglUGFyYW0pOwoJJERhdGF7UXVldWVJRH0gPSAkUXVldWVJRDsKCgkjIE1vZHVsZSBjb25maWcKCSRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIik7CgoJIyBUaWNrZXQgY3JlYXRpb24KCW15ICRjdXN0b21lcklEOwoJbXkgJGN1c3RvbWVyVXNlcjsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJGN1c3RvbWVySUQgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCQkkY3VzdG9tZXJVc2VyID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7Cgl9IGVsc2UgewoJCSRjdXN0b21lcklEID0gJFBhcmFte0N1c3RvbWVySUR9OwoJCSRjdXN0b21lclVzZXIgPSAkUGFyYW17Q3VzdG9tZXJVc2VyfTsKCX0KCQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyB0aWNrZXQiKTsKCW15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKCQlUaXRsZSAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCVF1ZXVlSUQgICAgPT4gJFF1ZXVlSUQsCgkJUHJpb3JpdHkgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9LAoJCUxvY2sgICAgICAgPT4gJ3VubG9jaycsCgkJU3RhdGUgICAgICA9PiAnbmV3JywKCQlTZXJ2aWNlSUQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzZXJ2aWNlIiApLAoJCVR5cGVJRCAgICAgPT4kUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAidHlwZSIgKSwKCQlDdXN0b21lcklEID0+ICRjdXN0b21lcklELAoJCUN1c3RvbWVyVXNlciA9PiAkY3VzdG9tZXJVc2VyLAoJCU93bmVySUQgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkpOwoJJFNlbGYtPkRlYnVnKCJDcmVhdGVkIHRpY2tldCBJRCAkVGlja2V0SUQiKTsKCglteSAkTWltZVR5cGUgICAgICA9ICd0ZXh0L2h0bWwnOwoJbXkgJXNlcnZpY2VGaWVsZHNWYWx1ZXMgPSAoKTsKCW15ICRzZXJ2aWNlRmllbGRzID0gIiI7CglteSBAc2VydmljZUZpZWxkc0tleXMgPSAoKTsKCgkjIFNlcnZpY2UgRmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmb3JtIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCggc3Vic3RyKCAkXywgMCwgMyApIGVxICJTRl8iICkgJiYgKCBzdWJzdHIoICRfLCAwLCA1ICkgbmUgIlNGX1RfIiApKSB7CgkJCWlmICgkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApKSB7CgkJCQlteSBAcGFyYW1WYWxzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKTsJCQkJCgkJCQlmb3IgbXkgJHBhcmFtVmFsdWUgKEBwYXJhbVZhbHMpIHsKCQkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0JCQkJCgkJCX0gZWxzZSB7CgkJCQlteSAkcGFyYW1WYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7IAoJCQkJCgkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJfQkJCQkJCQoJCQkJfQoJCQl9CgkJfQoJfQoJCglmb3IgKEBzZXJ2aWNlRmllbGRzS2V5cykgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiBzdWJzdHIoICRfLCAzICkpIC4gIjogPC9CPiIgLiAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLiAiPEJSLz4iOwoJfQkKCQoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPklQOiA8L0I+IiAuICAkRU5WeydSRU1PVEVfQUREUid9IC4gIjxCUi8+IjsKCSRzZXJ2aWNlRmllbGRzIC49ICI8QlIvPjxCUi8+IjsKCgkjIER5bmFtaWMgRmllbGRzCglteSAkdXNlcklEREY7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkdXNlcklEREYgPSAkU2VsZi0+e0RlZmF1bHRVc2VySUR9OwoJfSBlbHNlIHsKCQkkdXNlcklEREYgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKTsKCX0KCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBkeW5hbWljIGZpZWxkcyB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgMyApIGVxICJERl8iICkgewoJCQlteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKCQkJCUR5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoIE5hbWUgPT4gc3Vic3RyKCAkXywgMyApICksCgkJCQlPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAoJCQkJVmFsdWUgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICksCgkJCQlVc2VySUQgPT4gJHVzZXJJRERGLAoJCQkpOwoJCX0KCX0KCgkjIFNlcnZpY2UgRmllbGRzIC0gVGFibGUgZmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmaWVsZHMgLSB0YWJsZSBmaWVsZHMiKTsKCW15ICRsYXN0VGFiID0gIiI7CglteSAla2V5c0ZvdW5kID0gKCk7CglteSAkbmV3VGFiID0gMTsKCQoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCA1ICkgZXEgIlNGX1RfIiApIHsKCQkJbXkgJHBhcmFtTmFtZSA9ICRfOwoJCQlteSBAcGFydHMgPSBzcGxpdCgnXycsICRfKTsKCQkJbXkgJGN1cnJUYWIgPSAkcGFydHNbMl07CgkJCW15ICRjdXJyS2V5ID0gJHBhcnRzWzRdOwoJCQkKCQkJaWYgKCRjdXJyVGFiIG5lICRsYXN0VGFiKSB7CgkJCQlpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkJCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCQkJCX0KCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VEFCTEUgc3R5bGU9J2JvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA3MDBweDsnIGJvcmRlcj0nMXB4Jz4iOwoJCQkJJGxhc3RUYWIgPSAkY3VyclRhYjsKCQkJCSRuZXdUYWIgPSAxOwoJCQl9IGVsc2UgewoJCQkJJG5ld1RhYiA9IDA7CgkJCX0KCQkJCgkJCSMjIG5ldyBsaW5lIGR1ZSB0byByZXBldGl0aW9uIG9yIG5ldyB0YWJsZQoJCQlpZiAoJGtleXNGb3VuZHskY3VycktleX0gfHwgKCRuZXdUYWIpICkgewoJCQkJJWtleXNGb3VuZCA9ICgpOwkJCQkKCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIENPTFNQQU49JzInIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogbGFyZ2UnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyVGFiKSAuICI8L0I+PC9URD48L1RSPiI7IAoJCQl9CgkJCSRrZXlzRm91bmR7JGN1cnJLZXl9ID0gMTsKCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgc3R5bGU9J3dpZHRoOiAxMDBweDsnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyS2V5KSAuICI8L0I+PC9URD48VEQ+IiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRwYXJhbU5hbWUgKSAuICI8L1REPjwvVFI+IjsJCQkKCQl9Cgl9CgkKCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJfQoJCglteSAkYm9keSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJkZXNjcmlwdGlvbiIgKTsKCgkjIEltYWdlcwoJJFNlbGYtPkRlYnVnKCJMb2FkaW5nIGltYWdlcyBmcm9tIGNhY2hlIik7CglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCW15ICRDb250ZW50SUQgPSAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfTsKICAgICAgICBpZiAoJENvbnRlbnRJRCAmJiAoICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSAmJiAoICR1cGxvYWRlZEZpbGUtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogcmVwbGFjaW5nIGltYWdlIFVSTCBpbiBib2R5IHdpdGggYXR0YWNobWVudCIpOwogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogQm9keTogJGJvZHkiKTsKICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoVGV4dCA9PiAkQ29udGVudElELCk7CgkJCSMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgJGJvZHkgPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKICAgICAgICAgICAgJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IG5ldyBib2R5OiAkYm9keSIpOwogICAgICAgIH0KCX0KCQoJIyBDcmVhdGUgYXJ0aWNsZQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyBhcnRpY2xlIik7CglteSAkRnVsbE5hbWU7CglteSAkRW1haWw7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRGdWxsTmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJuYW1lIiApOwoJCSRFbWFpbCAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKTsJCQoJfSBlbHNlIHsKCQkkRnVsbE5hbWUgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSk7CgkJJEVtYWlsICAgID0gJFBhcmFte1VzZXJFbWFpbH07Cgl9CgkJCglteSAkRnJvbSAgICAgPSAiXCIkRnVsbE5hbWVcIiA8JEVtYWlsPiI7CglteSAkQXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKCQlUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKCQlBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKCQlTZW5kZXJUeXBlICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAoJCUZyb20gICAgICAgICAgICAgPT4gJEZyb20sCgkJVG8gICAgICAgICAgICAgICA9PiAkUXVldWUsCgkJU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlCb2R5ICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksCgkJTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCgkJQ2hhcnNldCAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAoJCVVzZXJJRCAgICAgICAgICAgPT4gJHVzZXJJRERGLAoJCUhpc3RvcnlUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAoJCUhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCgkJQXV0b1Jlc3BvbnNlVHlwZSA9PiAoICRDb25maWdPYmplY3QtPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkKCQk/ICdhdXRvIHJlcGx5JwoJCTogJycsCgkJT3JpZ0hlYWRlciA9PiB7CgkJCUZyb20gICAgPT4gJEZyb20sCgkJCVRvICAgICAgPT4gJFF1ZXVlLAoJCQlTdWJqZWN0ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCQlCb2R5ICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksLAoJCX0sCgkJUXVldWUgPT4gJFF1ZXVlLAoJKTsKCQoJIyBBdHRhY2htZW50cwoJJFNlbGYtPkRlYnVnKCJJbmNsdWRpbmcgYXR0YWNobWVudHMiKTsKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCSRUaWNrZXRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCgkJCUZpbGVuYW1lID0+ICR1cGxvYWRlZEZpbGUtPntGaWxlbmFtZX0sCgkJCUNvbnRlbnQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnR9LAoJCQlDb250ZW50VHlwZSA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9LAoJCQlBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKCQkJQ29udGVudElEID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9LAoJCQlVc2VySUQgICAgPT4gJHVzZXJJRERGLAoJCSk7Cgl9CgkKCSREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CglteSAkaWRDdXN0b21UZW1wbGF0ZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJDdXN0b21UZW1wbGF0ZSJ9OwoJCgkjIGJ1aWxkIG91dHB1dAoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7UHVibGljTW9kZX0gPSAiUHVibGljIjsKCQkkRGF0YXtNb2R1bGV9ID0gInB1YmxpYyI7Cgl9IGVsc2UgewoJCSREYXRhe01vZHVsZX0gPSAiY3VzdG9tZXIiOwoJfQoJaWYgKCEgJHF1ZXVlRml4ZWQpIHsKCQlkZWxldGUgJERhdGF7UXVldWVJRH0gCgl9CglteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSwgVGl0bGUgPT4gIlRpY2tldCBjcmVhdGVkIiApOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZFRpY2tldENyZWF0ZWQnLAoJKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKCn0KCj1oZWFkCklmIHB1YmxpYyBpbnRlcmZhY2Ugd2FzIHVzZWQsIHRyeSB0byBndWVzcyB0aGUgdXNlciBmcm9tIHRoZSBpbmZvcm1lZCBlLW1haWwKPWN1dApzdWIgR2V0VXNlcklERnJvbUVtYWlsIHsKCW15ICRTZWxmICAgICAgID0gc2hpZnQ7CglteSAkZW1haWwgICAgICA9IHNoaWZ0OwoJbXkgJHJlc3VsdCAgICAgPSAkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfTsKCW15ICRkb21haW5MaXN0ID0gJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn07CgkKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CgoJaWYgKCRkb21haW5MaXN0KSB7CgkJbXkgQGRvbWFpbnMgPSBzcGxpdCggIiwiLCAkZG9tYWluTGlzdCApOwoJCQoJCWZvciBteSAkZG9tYWluIChAZG9tYWlucykgewoJCQlteSBAcGFydHMgPSBzcGxpdCggIkAiLCAkZW1haWwgKTsKCQkJaWYgKCAkcGFydHNbMV0gZXEgJGRvbWFpbiApIHsKCQkJCW15ICRpZCAgID0gJHBhcnRzWzBdOwoJCQkJbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKCQkJCQlVc2VyTG9naW4gPT4gJGlkLAoJCQkJCVZhbGlkICAgICA9PiAxLCAgICAgICAgICAgICAgIyBub3QgcmVxdWlyZWQsIGRlZmF1bHQgMQoJCQkJKTsKCQkJCWlmICgga2V5cyAlTGlzdCApIHsKCQkJCQkkcmVzdWx0ID0gJGlkOwoJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiAkcmVzdWx0Owp9Cgo9aGVhZApEZWZhdWx0IGFjdGlvbiB0byBvcGVuIGEgbmV3IGZvcm0gKGZyb250ZW5kIG1ldGhvZCBzaGFyZSBieSBwdWJsaWMgYW5kIGN1c3RvbWVyIGZyb250ZW5kIG1vZHVsZXMpCj1jdXQKc3ViIE9wZW5Gb3JtIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CQkKCW15ICVEYXRhID0gKCk7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBwdWJsaWMgZm9ybSIpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgYXV0aGVudGljYXRlZCBmb3JtIik7Cgl9CgkKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgkKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSwgUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gdW5hdXRoZW50aWNhdGVkIG1lc3NhZ2UgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJCSRTZWxmLT5EZWJ1ZygiUHVibGljIHZpZXcgLSBwdWJsaWMgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCU5hbWUgPT4gJ1Rvb2xCYXJQdWJsaWMnLAoJCSk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJDdXN0b21lciB2aWV3IC0gY3VzdG9tZXIgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCQkKCQkJTmFtZSA9PiAnVG9vbEJhckN1c3RvbWVyJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigndmFsJywgJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCQkJZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CQkJCgkJfSwgMjAwMCk7Cgl9CgkKCWNhcnJlZ2FDdXN0b21Qcm9wcyhhY3RpdmVRdWV1ZSk7Cn07CgoKdmFyIHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYyA9IGZ1bmN0aW9uKGZvcm0pIHsKCWZvcm1PcHRpb25zID0gZm9ybS5vcHRpb25zLmZpZWxkczsKCWZvcm1BbHBhY2EgPSBmb3JtOwoJCglpZiAoZm9ybSkgewoJCSQoJy5zZWxlY3RwaWNrZXInKS5zZWxlY3RwaWNrZXIoKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.13</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.13">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-07-24 07:33:18</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbD4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQkJPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9Ii9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBhdXRoZW50aWNhdGUiKSB8IGh0bWwgJV08L0E+ClslIFJlbmRlckJsb2NrRW5kKCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCQkKCTwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD0iZm9ybVBhbmVsIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgVHJhbnNsYXRlKCJQbGVhc2UgZmlsbCB0aGUgZm9sbG93aW5nIGZvcm0gdG8gb3BlbiB5b3VyIHRpY2tldCIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSIgaWQ9ImZvcm1UaWNrZXQiPgoJCgk8L2Rpdj4KPC9kaXY+CiAKIDxzY3JpcHQgc3JjPSJbJSBDb25maWcoIkZyb250ZW5kOjpSaWNoVGV4dFBhdGgiKSAlXWNrZWRpdG9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCgkkLmFscGFjYS5zZXREZWZhdWx0TG9jYWxlKChuYXZpZ2F0b3IubGFuZ3VhZ2VzID8gbmF2aWdhdG9yLmxhbmd1YWdlc1swXSA6IChuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkpLnJlcGxhY2UoIi0iLCJfIikpOwoJCQkKCSQuYWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewoJCSJub25lTGFiZWwiOiAiLSIsCgl9KTsKCQoJJCgiI1NlcnZpY2VJRCIpLmNoYW5nZShmdW5jdGlvbigpIHsKCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CgkgICAJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsKICAgCQl9IGVsc2UgewogICAJCQlkZXN0cnVpckZvcm0oKTsKICAgCQkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoIiIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuaGlkZSgpOwogICAJCX0gIAkKICAJfSk7CiAgCQogICAJaWYgKCQoIiNTZXJ2aWNlSUQiKS5oYXMoJ1tzZWxlY3RlZF0nKSkgewogIAkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewogIAkJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOyAgCQkJICAJCQkKICAJCX0KICAJfQogIAkKICAJJCgiI1Jlc3BvbnNpdmVGb290ZXIiKS5yZW1vdmUoKTsKPC9zY3JpcHQ+ICAgIApbJSBFTkQgJV0=</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgRW5jb2RlIHF3KCBlbmNvZGVfdXRmOCBkZWNvZGVfdXRmOCApOwp1c2UgSlNPTiBxdyhlbmNvZGVfanNvbiBkZWNvZGVfanNvbik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lTDo6U3lzdGVtOjpMb2ciLAoiS2VybmVMOjpTeXN0ZW06OlRpY2tldCIsCiJLZXJuZUw6OlN5c3RlbTo6VHlwZSIsCiJLZXJuZWw6OlN5c3RlbTo6WUFNIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9ucyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWF9Owp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIHN5c3RlbSBmaWVsZCB2YWx1ZXMgKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIFJlcGxhY2VPVFJTVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApID0gJFNlbGYtPkdldE9UUlNTZXJ2aWNlc0RhdGEoKTsKCSRzY2hlbWEgID1+IHMvT1RSU19zZXJ2aWNlX3ZhbHVlcy8kc2VydmljZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3NlcnZpY2VfbGFiZWxzLyRzZXJ2aWNlTmFtZXMvZzsKCglteSAoICR0eXBlTmFtZXMsICR0eXBlSURzICkgPSAkU2VsZi0+R2V0T1RSU1R5cGVzRGF0YShVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0pOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3R5cGVfdmFsdWVzLyR0eXBlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfdHlwZV9sYWJlbHMvJHR5cGVOYW1lcy9nOwoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIHNlcnZpY2VzIGluZm8gKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIEdldE9UUlNTZXJ2aWNlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzZXJ2aWNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJbXkgJXNlcnZpY2VMaXN0ID0gJHNlcnZpY2VzLT5TZXJ2aWNlTGlzdCggVmFsaWQgPT4gMSwgVXNlcklEID0+ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpICk7CglteSAkc2VydmljZU5hbWVzID0gIiI7CglteSAkc2VydmljZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICRzZXJ2aWNlTGlzdHskYX0gY21wICRzZXJ2aWNlTGlzdHskYn0gKSB9IGtleXMgJXNlcnZpY2VMaXN0ICkgewoJCSRzZXJ2aWNlTmFtZXMgLj0gIlwiJHNlcnZpY2VMaXN0eyRffVwiLCI7CgkJJHNlcnZpY2VJRHMgICAuPSAiJF8sIjsKCX0KCSRzZXJ2aWNlTmFtZXMgPSBzdWJzdHIoJHNlcnZpY2VOYW1lcywgMCwgLTEpOwoJJHNlcnZpY2VJRHMgPSBzdWJzdHIoJHNlcnZpY2VJRHMsIDAsIC0xKTsKCXJldHVybiAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICk7Cn0KCj1oZWFkCkdldCBPVFJTIHRpY2tldCB0eXBlcyAKPWN1dApzdWIgR2V0T1RSU1R5cGVzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCglteSAldHlwZUxpc3QgID0gJHRpY2tldE9iamVjdC0+VGlja2V0VHlwZUxpc3QoIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwoJbXkgJHR5cGVOYW1lcyA9ICIiOwoJbXkgJHR5cGVJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdHlwZUxpc3R7JGF9IGNtcCAkdHlwZUxpc3R7JGJ9ICkgfSBrZXlzICV0eXBlTGlzdCApIHsKCQlpZiAoaW5kZXgoJHR5cGVMaXN0eyRffSwgJzo6JykgPT0gLTEpIHsKCQkJJHR5cGVOYW1lcyAuPSAiXCIkdHlwZUxpc3R7JF99XCIsIjsKCQkJJHR5cGVJRHMgICAuPSAiJF8sIjsKCQl9Cgl9CgkKCSR0eXBlTmFtZXMgPSBzdWJzdHIoJHR5cGVOYW1lcywgMCwgLTEpOwoJJHR5cGVJRHMgPSBzdWJzdHIoJHR5cGVJRHMsIDAsIC0xKTsKCQoJcmV0dXJuICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBkeW5hbWljIGZpZWxkcwo9Y3V0CnN1YiBSZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAkZGZpZWxkcyAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15IEBkZmllbGRMaXN0ID0gQHsgJGRmaWVsZHMtPkR5bmFtaWNGaWVsZExpc3RHZXQoIFZhbGlkID0+IDEgKSB9OwoKCWZvcmVhY2ggKEBkZmllbGRMaXN0KSB7CgkJbXkgJGNhbXBvID0gJF87CgoJCW15ICRuYW1lICAgICAgICAgID0gJGNhbXBvLT57TmFtZX07CgkJbXkgJGNvbmZpZyAgICAgICAgPSAkY2FtcG8tPntDb25maWd9OwoJCW15ICR0eXBlICAgICAgICAgID0gJGNhbXBvLT57RmllbGRUeXBlfTsKCQlteSAkaWRGaWVsZFZhbHVlcyA9ICJERl8iIC4gJG5hbWUgLiAiX3ZhbHVlcyI7CgkJbXkgJGlkRmllbGRMYWJlbHMgPSAiREZfIiAuICRuYW1lIC4gIl9sYWJlbHMiOwoJCWlmICggJHR5cGUgZXEgIkRyb3Bkb3duIiApIHsKCQkJbXkgKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApID0gJFNlbGYtPkdldER5bmFtaWNGaWVsZFZhbHVlcyggQ29uZmlnREYgPT4gJGNvbmZpZyApOwoJCQkkc2NoZW1hICA9fiBzLyRpZEZpZWxkVmFsdWVzLyRkZlZhbHVlcy9nOwoJCQkkb3B0aW9ucyA9fiBzLyRpZEZpZWxkTGFiZWxzLyRkZkxhYmVscy9nOwoJCX0KCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBkeWFubWljIGZpZWxkIHZhbHVlcwo9Y3V0CnN1YiBHZXREeW5hbWljRmllbGRWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRjb25maWcgPSAkUGFyYW17Q29uZmlnREZ9OwoJbXkgJHZhbHVlcyA9ICRjb25maWctPntQb3NzaWJsZVZhbHVlc307CgoJbXkgJGRmVmFsdWVzID0gIiI7CglteSAkZGZMYWJlbHMgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHZhbHVlcy0+eyRhfSBjbXAgJHZhbHVlcy0+eyRifSApIH0ga2V5cyAleyR2YWx1ZXN9ICkgewoJCSRkZlZhbHVlcyAuPSAiXCIkX1wiLCI7CgkJJGRmTGFiZWxzIC49ICJcIiR2YWx1ZXMtPnskX31cIiwiOwoJfQoKCSRkZlZhbHVlcyA9IHN1YnN0cigkZGZWYWx1ZXMsIDAsIC0xKTsKCSRkZkxhYmVscyA9IHN1YnN0cigkZGZMYWJlbHMsIDAsIC0xKTsKCXJldHVybiAoICRkZlZhbHVlcywgJGRmTGFiZWxzICk7Cgp9Cgo9aGVhZApCdWlsZHMgc2VydmljZSBjaG9vc2luZyBjb21ibwo9Y3V0CnN1YiBCdWlsZFNlcnZpY2VzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJFJlc3RyaWN0ZWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2UiKTsKCW15ICRQdWJsaWMgPSAkUGFyYW17UHVibGljfTsKCQoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCW15ICVTZXJ2aWNlcyA9ICgpOwoKCWlmICggISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCSVTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCggVXNlcklEID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLCApOwoJfQoJZWxzZSB7CgkJJVNlcnZpY2VzID0KCQkgICRRdWV1ZVNlcnZpY2VPYmplY3QtPkdldFNlcnZpY2VMaXN0KCBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLCApOwoJfQoJbXkgQFNlcnZpY2VzQ29tYm8gPSAoKTsKCQoJbXkgQHJlc3RyaWN0ZWRTZXJ2aWNlcyA9ICRSZXN0cmljdGVkT2JqZWN0LT5HZXRSZXN0cmljdGVkU2VydmljZXMoKTsKCQoJZm9yIG15ICRzZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlcyApIHsKCQlpZiAoIGdyZXAgeyBpbmRleCggJFNlcnZpY2VzeyRffSwgJFNlcnZpY2VzeyRzZXJ2aWNlSUR9IC4gIjo6IiApID49IDAgfSAoIGtleXMgJVNlcnZpY2VzICkgKSB7CQkJCgkJCWlmICgoISAkUHVibGljKSB8fCAoISAoICRzZXJ2aWNlSUQgfn4gQHJlc3RyaWN0ZWRTZXJ2aWNlcyApKSkgewoJCQkJbXkgJXNlcnYgPSAoKTsKCQkJCSRzZXJ2e1ZhbHVlfSAgICA9ICRTZXJ2aWNlc3skc2VydmljZUlEfTsKCQkJCSRzZXJ2e0tleX0gICAgICA9ICRzZXJ2aWNlSUQ7CgkJCQkkc2VydntEaXNhYmxlZH0gPSAxOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJCWVsc2UgewoJCQlpZiAoKCEgJFB1YmxpYykgfHwgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSkpIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIiI7CglteSAkc2VydmljZVByZURlZmluZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApOwoJJHJldG9ybm8gPSAiPHNlbGVjdCBkYXRhLXdpZHRoPVwiYXV0b1wiIGlkPVwiU2VydmljZUlEXCIgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgY2xhc3M9XCJzZWxlY3RwaWNrZXJcIiBkYXRhLWxpdmUtc2VhcmNoPVwidHJ1ZVwiPlxuPG9wdGlvbiB2YWx1ZT1cIlwiPi08L29wdGlvbj4iOwkKCglpZiAoJHNlcnZpY2VQcmVEZWZpbmVkKSB7CgkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIHNwZWNpZmllZDogJHNlcnZpY2VQcmVEZWZpbmVkIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiU2VydmljZSBub3Qgc3BlY2lmaWVkIik7CgkJCgl9CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCWlmICgkc2VydmljZVByZURlZmluZWQgZXEgJHNlcnZpY2UtPntLZXl9KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0gZWxzZSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0KCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCQkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTRHluYW1pY0ZpZWxkcyggU2NoZW1hID0+ICRzY2hlbWEsIE9wdGlvbnMgPT4gJGZpZWxkcyApOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoKCQkjIEluY2x1ZGUgZHluYW1pYyBmaWVsZHMgaW4gcmVwbGFjZSBjb21tYW5kCgkJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQkKCQkjIFNldCBmaXhlZCBmaWVsZCB2YWx1ZXMsIGlmIGRlZmluZWQKCQlpZiAoJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSkgewoJCQkoJHNjaGVtYSwgJGZpZWxkcykgPSAkU2VsZi0+QWRqdXN0Rml4ZWRGaWVsZHMoU2NoZW1hID0+ICRzY2hlbWEsIEZpZWxkcyA9PiAkZmllbGRzLCBGaXhlZFZhbHVlcyA9PiAkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KTsKCQl9CQoJfQoJCgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgoJCSRTZWxmLT5EZWJ1ZygiQWRqdXN0aW5nIGZpeGVkIGZpZWxkIHsgJGZpZWxkS2V5IH0gd2l0aCB2YWx1ZSBbICRmaXhlZFZhbHVlIF0iKTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoKCQkkU2VsZi0+RGVidWcoIkFkanVzdGluZyBmaXhlZCBmaWVsZHMgaW4gc2NoZW1hOiBcbiAiIC4gJHNjaGVtYSk7CgkJCgkJJHNjaGVtYSA9fiBzLyRrZXkvJHJlcGxhY2UvOwoJCQoJCSRTZWxmLT5EZWJ1ZygiQWRqdXN0aW5nIGZpeGVkIGZpZWxkcyBpbiBmb3JtOiBcbiAiIC4gJGZvcm0pOwoKCQkkZm9ybSA9ICJ7IiAuICRmb3JtIC4gIn0iOwoJCSRmb3JtID0gZW5jb2RlX3V0ZjgoJGZvcm0pOwoJCW15ICRmb3JtU3RydWN0ID0gZGVjb2RlX2pzb24oJGZvcm0pOwoJCW15ICRoaWRkZW5TdHJ1Y3QgPSB7fTsJCQoJCSRoaWRkZW5TdHJ1Y3QtPnsidHlwZSJ9ID0gImhpZGRlbiI7CgkJJGZvcm1TdHJ1Y3QtPnskZmllbGRLZXl9ID0gJGhpZGRlblN0cnVjdDsKCQkKCQlwcmludCBTVERFUlIgRHVtcGVyKCRmb3JtU3RydWN0KTsKCgkJJGZvcm0gPSBlbmNvZGVfanNvbigkZm9ybVN0cnVjdCk7CgkJJGZvcm0gPSBkZWNvZGVfdXRmOCgkZm9ybSk7CgkJc3Vic3RyKCRmb3JtLCAwLCAxLCAiIik7CgkJc3Vic3RyKCRmb3JtLCAtMSwgMSwgIiIpOwkJCgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCSMgQ2hlY2sgaWYgcXVldWUgd2FzIHByZS1kZWZpbmVkCglteSAkcXVldWVGaXhlZCA9IDA7CglpZiAoJERhdGF7UXVldWVJRH0pIHsKCQkkcXVldWVGaXhlZCA9IDE7Cgl9CQoJCgkjIEdldCBxdWV1ZSBuYW1lIGFuZCBpZCB1c2luZyBydWxlcywgaWYgbm8gcXVldWUgd2FzIHByZWRlZmluZWQKCW15ICggJFF1ZXVlLCAkUXVldWVJRCApID0gJFRpY2tldFdpemFyZC0+R2V0UXVldWVJRCglUGFyYW0pOwoJJERhdGF7UXVldWVJRH0gPSAkUXVldWVJRDsKCgkjIE1vZHVsZSBjb25maWcKCSRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIik7CgoJIyBUaWNrZXQgY3JlYXRpb24KCW15ICRjdXN0b21lcklEOwoJbXkgJGN1c3RvbWVyVXNlcjsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJGN1c3RvbWVySUQgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCQkkY3VzdG9tZXJVc2VyID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7Cgl9IGVsc2UgewoJCSRjdXN0b21lcklEID0gJFBhcmFte0N1c3RvbWVySUR9OwoJCSRjdXN0b21lclVzZXIgPSAkUGFyYW17Q3VzdG9tZXJVc2VyfTsKCX0KCQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyB0aWNrZXQiKTsKCW15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKCQlUaXRsZSAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCVF1ZXVlSUQgICAgPT4gJFF1ZXVlSUQsCgkJUHJpb3JpdHkgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9LAoJCUxvY2sgICAgICAgPT4gJ3VubG9jaycsCgkJU3RhdGUgICAgICA9PiAnbmV3JywKCQlTZXJ2aWNlSUQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzZXJ2aWNlIiApLAoJCVR5cGVJRCAgICAgPT4kUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAidHlwZSIgKSwKCQlDdXN0b21lcklEID0+ICRjdXN0b21lcklELAoJCUN1c3RvbWVyVXNlciA9PiAkY3VzdG9tZXJVc2VyLAoJCU93bmVySUQgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkpOwoJJFNlbGYtPkRlYnVnKCJDcmVhdGVkIHRpY2tldCBJRCAkVGlja2V0SUQiKTsKCglteSAkTWltZVR5cGUgICAgICA9ICd0ZXh0L2h0bWwnOwoJbXkgJXNlcnZpY2VGaWVsZHNWYWx1ZXMgPSAoKTsKCW15ICRzZXJ2aWNlRmllbGRzID0gIiI7CglteSBAc2VydmljZUZpZWxkc0tleXMgPSAoKTsKCgkjIFNlcnZpY2UgRmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmb3JtIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCggc3Vic3RyKCAkXywgMCwgMyApIGVxICJTRl8iICkgJiYgKCBzdWJzdHIoICRfLCAwLCA1ICkgbmUgIlNGX1RfIiApKSB7CgkJCWlmICgkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApKSB7CgkJCQlteSBAcGFyYW1WYWxzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKTsJCQkJCgkJCQlmb3IgbXkgJHBhcmFtVmFsdWUgKEBwYXJhbVZhbHMpIHsKCQkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0JCQkJCgkJCX0gZWxzZSB7CgkJCQlteSAkcGFyYW1WYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7IAoJCQkJCgkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJfQkJCQkJCQoJCQkJfQoJCQl9CgkJfQoJfQoJCglmb3IgKEBzZXJ2aWNlRmllbGRzS2V5cykgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiBzdWJzdHIoICRfLCAzICkpIC4gIjogPC9CPiIgLiAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLiAiPEJSLz4iOwoJfQkKCQoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPklQOiA8L0I+IiAuICAkRU5WeydSRU1PVEVfQUREUid9IC4gIjxCUi8+IjsKCSRzZXJ2aWNlRmllbGRzIC49ICI8QlIvPjxCUi8+IjsKCgkjIER5bmFtaWMgRmllbGRzCglteSAkdXNlcklEREY7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkdXNlcklEREYgPSAkU2VsZi0+e0RlZmF1bHRVc2VySUR9OwoJfSBlbHNlIHsKCQkkdXNlcklEREYgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKTsKCX0KCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBkeW5hbWljIGZpZWxkcyB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgMyApIGVxICJERl8iICkgewoJCQlteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKCQkJCUR5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoIE5hbWUgPT4gc3Vic3RyKCAkXywgMyApICksCgkJCQlPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAoJCQkJVmFsdWUgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICksCgkJCQlVc2VySUQgPT4gJHVzZXJJRERGLAoJCQkpOwoJCX0KCX0KCgkjIFNlcnZpY2UgRmllbGRzIC0gVGFibGUgZmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmaWVsZHMgLSB0YWJsZSBmaWVsZHMiKTsKCW15ICRsYXN0VGFiID0gIiI7CglteSAla2V5c0ZvdW5kID0gKCk7CglteSAkbmV3VGFiID0gMTsKCQoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCA1ICkgZXEgIlNGX1RfIiApIHsKCQkJbXkgJHBhcmFtTmFtZSA9ICRfOwoJCQlteSBAcGFydHMgPSBzcGxpdCgnXycsICRfKTsKCQkJbXkgJGN1cnJUYWIgPSAkcGFydHNbMl07CgkJCW15ICRjdXJyS2V5ID0gJHBhcnRzWzRdOwoJCQkKCQkJaWYgKCRjdXJyVGFiIG5lICRsYXN0VGFiKSB7CgkJCQlpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkJCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCQkJCX0KCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VEFCTEUgc3R5bGU9J2JvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA3MDBweDsnIGJvcmRlcj0nMXB4Jz4iOwoJCQkJJGxhc3RUYWIgPSAkY3VyclRhYjsKCQkJCSRuZXdUYWIgPSAxOwoJCQl9IGVsc2UgewoJCQkJJG5ld1RhYiA9IDA7CgkJCX0KCQkJCgkJCSMjIG5ldyBsaW5lIGR1ZSB0byByZXBldGl0aW9uIG9yIG5ldyB0YWJsZQoJCQlpZiAoJGtleXNGb3VuZHskY3VycktleX0gfHwgKCRuZXdUYWIpICkgewoJCQkJJWtleXNGb3VuZCA9ICgpOwkJCQkKCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIENPTFNQQU49JzInIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogbGFyZ2UnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyVGFiKSAuICI8L0I+PC9URD48L1RSPiI7IAoJCQl9CgkJCSRrZXlzRm91bmR7JGN1cnJLZXl9ID0gMTsKCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgc3R5bGU9J3dpZHRoOiAxMDBweDsnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyS2V5KSAuICI8L0I+PC9URD48VEQ+IiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRwYXJhbU5hbWUgKSAuICI8L1REPjwvVFI+IjsJCQkKCQl9Cgl9CgkKCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJfQoJCglteSAkYm9keSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJkZXNjcmlwdGlvbiIgKTsKCgkjIEltYWdlcwoJJFNlbGYtPkRlYnVnKCJMb2FkaW5nIGltYWdlcyBmcm9tIGNhY2hlIik7CglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCW15ICRDb250ZW50SUQgPSAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfTsKICAgICAgICBpZiAoJENvbnRlbnRJRCAmJiAoICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSAmJiAoICR1cGxvYWRlZEZpbGUtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogcmVwbGFjaW5nIGltYWdlIFVSTCBpbiBib2R5IHdpdGggYXR0YWNobWVudCIpOwogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogQm9keTogJGJvZHkiKTsKICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoVGV4dCA9PiAkQ29udGVudElELCk7CgkJCSMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgJGJvZHkgPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKICAgICAgICAgICAgJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IG5ldyBib2R5OiAkYm9keSIpOwogICAgICAgIH0KCX0KCQoJIyBDcmVhdGUgYXJ0aWNsZQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyBhcnRpY2xlIik7CglteSAkRnVsbE5hbWU7CglteSAkRW1haWw7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRGdWxsTmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJuYW1lIiApOwoJCSRFbWFpbCAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKTsJCQoJfSBlbHNlIHsKCQkkRnVsbE5hbWUgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSk7CgkJJEVtYWlsICAgID0gJFBhcmFte1VzZXJFbWFpbH07Cgl9CgkJCglteSAkRnJvbSAgICAgPSAiXCIkRnVsbE5hbWVcIiA8JEVtYWlsPiI7CglteSAkQXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKCQlUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKCQlBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKCQlTZW5kZXJUeXBlICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAoJCUZyb20gICAgICAgICAgICAgPT4gJEZyb20sCgkJVG8gICAgICAgICAgICAgICA9PiAkUXVldWUsCgkJU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlCb2R5ICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksCgkJTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCgkJQ2hhcnNldCAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAoJCVVzZXJJRCAgICAgICAgICAgPT4gJHVzZXJJRERGLAoJCUhpc3RvcnlUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAoJCUhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCgkJQXV0b1Jlc3BvbnNlVHlwZSA9PiAoICRDb25maWdPYmplY3QtPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkKCQk/ICdhdXRvIHJlcGx5JwoJCTogJycsCgkJT3JpZ0hlYWRlciA9PiB7CgkJCUZyb20gICAgPT4gJEZyb20sCgkJCVRvICAgICAgPT4gJFF1ZXVlLAoJCQlTdWJqZWN0ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCQlCb2R5ICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksLAoJCX0sCgkJUXVldWUgPT4gJFF1ZXVlLAoJKTsKCQoJIyBBdHRhY2htZW50cwoJJFNlbGYtPkRlYnVnKCJJbmNsdWRpbmcgYXR0YWNobWVudHMiKTsKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCSRUaWNrZXRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCgkJCUZpbGVuYW1lID0+ICR1cGxvYWRlZEZpbGUtPntGaWxlbmFtZX0sCgkJCUNvbnRlbnQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnR9LAoJCQlDb250ZW50VHlwZSA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9LAoJCQlBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKCQkJQ29udGVudElEID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9LAoJCQlVc2VySUQgICAgPT4gJHVzZXJJRERGLAoJCSk7Cgl9CgkKCSREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CglteSAkaWRDdXN0b21UZW1wbGF0ZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJDdXN0b21UZW1wbGF0ZSJ9OwoJCgkjIGJ1aWxkIG91dHB1dAoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7UHVibGljTW9kZX0gPSAiUHVibGljIjsKCQkkRGF0YXtNb2R1bGV9ID0gInB1YmxpYyI7Cgl9IGVsc2UgewoJCSREYXRhe01vZHVsZX0gPSAiY3VzdG9tZXIiOwoJfQoJaWYgKCEgJHF1ZXVlRml4ZWQpIHsKCQlkZWxldGUgJERhdGF7UXVldWVJRH0gCgl9CglteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSwgVGl0bGUgPT4gIlRpY2tldCBjcmVhdGVkIiApOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZFRpY2tldENyZWF0ZWQnLAoJKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKCn0KCj1oZWFkCklmIHB1YmxpYyBpbnRlcmZhY2Ugd2FzIHVzZWQsIHRyeSB0byBndWVzcyB0aGUgdXNlciBmcm9tIHRoZSBpbmZvcm1lZCBlLW1haWwKPWN1dApzdWIgR2V0VXNlcklERnJvbUVtYWlsIHsKCW15ICRTZWxmICAgICAgID0gc2hpZnQ7CglteSAkZW1haWwgICAgICA9IHNoaWZ0OwoJbXkgJHJlc3VsdCAgICAgPSAkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfTsKCW15ICRkb21haW5MaXN0ID0gJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn07CgkKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CgoJaWYgKCRkb21haW5MaXN0KSB7CgkJbXkgQGRvbWFpbnMgPSBzcGxpdCggIiwiLCAkZG9tYWluTGlzdCApOwoJCQoJCWZvciBteSAkZG9tYWluIChAZG9tYWlucykgewoJCQlteSBAcGFydHMgPSBzcGxpdCggIkAiLCAkZW1haWwgKTsKCQkJaWYgKCAkcGFydHNbMV0gZXEgJGRvbWFpbiApIHsKCQkJCW15ICRpZCAgID0gJHBhcnRzWzBdOwoJCQkJbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKCQkJCQlVc2VyTG9naW4gPT4gJGlkLAoJCQkJCVZhbGlkICAgICA9PiAxLCAgICAgICAgICAgICAgIyBub3QgcmVxdWlyZWQsIGRlZmF1bHQgMQoJCQkJKTsKCQkJCWlmICgga2V5cyAlTGlzdCApIHsKCQkJCQkkcmVzdWx0ID0gJGlkOwoJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiAkcmVzdWx0Owp9Cgo9aGVhZApEZWZhdWx0IGFjdGlvbiB0byBvcGVuIGEgbmV3IGZvcm0gKGZyb250ZW5kIG1ldGhvZCBzaGFyZSBieSBwdWJsaWMgYW5kIGN1c3RvbWVyIGZyb250ZW5kIG1vZHVsZXMpCj1jdXQKc3ViIE9wZW5Gb3JtIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CQkKCW15ICVEYXRhID0gKCk7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBwdWJsaWMgZm9ybSIpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgYXV0aGVudGljYXRlZCBmb3JtIik7Cgl9CgkKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgkKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSwgUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gdW5hdXRoZW50aWNhdGVkIG1lc3NhZ2UgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJCSRTZWxmLT5EZWJ1ZygiUHVibGljIHZpZXcgLSBwdWJsaWMgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCU5hbWUgPT4gJ1Rvb2xCYXJQdWJsaWMnLAoJCSk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJDdXN0b21lciB2aWV3IC0gY3VzdG9tZXIgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCQkKCQkJTmFtZSA9PiAnVG9vbEJhckN1c3RvbWVyJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlucHV0VHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5wdXRUeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpbnB1dFR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBpZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC10ZXh0YXJlYSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicm93cz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiY29scz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiZGF0YS0iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJvd3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbHMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdXJsIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsYWJlbCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtYnV0dG9uIGFscGFjYS1jb250cm9sLWJ1dHRvbi0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3R5bGVzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdHlsZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InN0eWxlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVuZGVyQnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9uIGFscGFjYS1mb3JtLWJ1dHRvbi0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3R5bGVzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdHlsZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InN0eWxlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmF0dHJpYnV0ZXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lc3NhZ2UgYWxwYWNhLW1lc3NhZ2UtIgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJ3aXphcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLW5hdlwiPlxuICAgICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdmJhciBuYXZiYXItZGVmYXVsdFwiIHJvbGU9XCJuYXZpZ2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBhbHBhY2Etd2l6YXJkLWJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdmJhci1uYXZcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdGVwcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmF2PlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRpdGxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aXRsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGl0bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hldnJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtcHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW5vdz1cIjBcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MCU7XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxoMz4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aXphcmRUaXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoid2l6YXJkVGl0bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvaDM+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxoND4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aXphcmREZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkRGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoid2l6YXJkRGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvaDQ+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hbGlnbiA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjE0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkXCI+XG5cbiAgICAgICAgPCEtLSBuYXYgYmFyIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dTdGVwcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPCEtLSB3aXphcmQgcHJvZ3Jlc3MgYmFyIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dQcm9ncmVzc0JhciA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aXphcmRUaXRsZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkRGVzY3JpcHRpb24gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHN0ZXBzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1zdGVwc1wiPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gd2l6YXJkIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLWJ1dHRvbnNcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjbGVhcjpib3RoXCI+PC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGVnZW5kIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvbGVnZW5kPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiICI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIj5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgIDwvc3Bhbj5cbiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciBoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLTE2IGdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRhaW5lcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1yYWRpbyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5kYXRhIDogZGVwdGhzWzFdKSx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXNlbGVjdCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kaXNwbGF5YWJsZVRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRpc3BsYXlhYmxlVGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkaXNwbGF5YWJsZVRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLWRvd25sb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImVycm9yXCIgY29sc3Bhbj1cIjJcIj5cbiAgICAgICAgICAgIEVycm9yOlxuICAgICAgICAgICAgIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgdGl0bGU9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWdhbGxlcnk9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGEgaHJlZj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgdGl0bGU9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWdhbGxlcnk9XCJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8L2E+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0RlbGV0ZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlbGV0ZSBidG4gYnRuLWRhbmdlclwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10cmFzaCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiBidG4gIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5idXR0b25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImJ1dHRvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczQoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmljb25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Imljb25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRyIGNsYXNzPVwidGVtcGxhdGUtZG93bmxvYWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFkZVwiPjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4iOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cImVycm9yXCIgY29sc3Bhbj1cIjJcIj48c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLWltcG9ydGFudFwiPkVycm9yPC9zcGFuPiAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90ZD5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS52YWxpZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRhdGEgJiYgZGF0YS5pbmRleCksMCx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPHRkIGNsYXNzPVwic3RhcnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF1dG9VcGxvYWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzIHByb2dyZXNzLXN1Y2Nlc3MgcHJvZ3Jlc3Mtc3RyaXBlZCBhY3RpdmVcIiByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBhcmlhLXZhbHVlbm93PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHN0eWxlPVwid2lkdGg6MCU7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCI+IFxcXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWQgZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TdGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhbmNlbFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRhdGEgJiYgZGF0YS5pbmRleCksMCx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCIxNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWJhbi1jaXJjbGUgZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DYW5jZWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMz1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRyIGNsYXNzPVwidGVtcGxhdGUtdXBsb2FkXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+PC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jc3NDbGFzc2VzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jc3NDbGFzc2VzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImNzc0NsYXNzZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPk5hbWU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+U2l6ZTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+PCEtLSBlcnJvciBvciBzdGFydCBvciBwcm9ncmVzcyBpbmRpY2F0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5BY3Rpb25zPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5UaHVtYm5haWw8L3RkPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jc3NDbGFzc2VzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFscGFjYS1maWxldXBsb2FkLWNob29zZXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIiCiAgICArIGFsaWFzMihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmlldyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiIGZpbGVpbnB1dC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZXVwbG9hZC1hZGQtYnV0dG9uXCI+IgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jaG9vc2VCdXR0b25MYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY2hvb3NlQnV0dG9uTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImNob29zZUJ1dHRvbkxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQtaGlkZGVuXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNfaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFscGFjYS1maWxldXBsb2FkLXdlbGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGZpbGV1cGxvYWQtYWN0aXZlLXpvbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0hlYWRlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDxwIGFsaWduPVwiY2VudGVyXCIgY2xhc3M9XCJkcm9wem9uZS1tZXNzYWdlXCI+IgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kcm9wWm9uZU1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRyb3Bab25lTWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZHJvcFpvbmVNZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicHJvZ3Jlc3NcIiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjb250cm9sLWxhYmVsIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWxwLWJsb2NrXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCI+PC9pPiZuYnNwOyIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gPSB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXSB8fCB7fTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lci1ncmlkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIGJ0bi1ncm91cCI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7CgogIHJldHVybiAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25cIiBkYXRhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCksIGRlcHRoMCkpCiAgICArICI8L2E+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczI9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbiAiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMix7Im5hbWUiOiJhY3Rpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmljb25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Imljb25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS10b29sYmFyXCIgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJidXR0b24iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhckFjdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXJcIj48L2Rpdj5cblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPCEtLSBoaWRkZW4gY29sdW1uIHN0b3Jpbmcgc29ydCBvcmRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtaGVhZGVyXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBkcmFnZ2FibGUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXJcIj48L3RoPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtaGVhZGVyLWlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGlkZGVuIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L3RoPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2xhc3M9XCJhbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlblwiIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFjdGlvbnM8L3RoPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRyYWdSb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGVhZGVycyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGJvZHkgLS0+XG4gICAgICAgICAgICA8dGJvZHk+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtY29sb3JwaWNrZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPjxpPjwvaT48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb21wb25lbnQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXR0cmlidXRlcyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb21wb25lbnQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZW5hbWVMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZW5hbWVMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZW5hbWVMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVTaXplTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVTaXplTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVTaXplTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlVXBsb2FkQWN0aW9uc0xhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGh1bWJuYWlsTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRodW1ibmFpbExhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6InRodW1ibmFpbExhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjb250cm9sLWxhYmVsIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWxwLWJsb2NrIGFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwovKioKICogVXNpbmcgZm9yazoKICogaHR0cHM6Ly9naXRodWIuY29tL2tjbW9vdC9CYXNlLmpzLUZvcmsvYmxvYi9tYXN0ZXIvYnVpbGQvYmFzZS5qcwogKi8KKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CiAgICAvKgogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS4KICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIChyb290LnJldHVybkV4cG9ydHNHbG9iYWwgPSBmYWN0b3J5KCkpOwogICAgICAgIH0pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAogICAgICAgIC8vIGxpa2UgTm9kZS4KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgIH0gZWxzZSB7CiAgICAqLwogICAgICAgIHJvb3RbJ0Jhc2UnXSA9IGZhY3RvcnkoKTsKICAgIC8qCiAgICB9CiAgICAqLwp9KHRoaXMsIGZ1bmN0aW9uICgpIHsKCiAgICAvKioKICAgICAqICAgQmFzZS5qcywgdmVyc2lvbiAxLjFhCiAgICAgKiAgIENvcHlyaWdodCAyMDA2LTIwMTAsIERlYW4gRWR3YXJkcwogICAgICogICBMaWNlbnNlOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogICAgICoKICAgICAqICAgTW9kaWZpZWQgYnkgdGhlIE5lcmRlcnkgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlIGFuZCB2YXJpb3VzIGJ1Z2ZpeGVzCiAgICAgKi8KCiAgICAvKioKICAgICAqIEZ1bmN0aW9uIHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7CgogICAgLyoqCiAgICAgKiBPYmplY3QgdHlwZQogICAgICoKICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQGlnbm9yZQogICAgICogQGZpbmFsCiAgICAgKi8KICAgIHZhciBUWVBFX09CSkVDVCA9ICdvYmplY3QnOwoKICAgIC8qKgogICAgICogU3RyaW5nIHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9TVFJJTkcgPSAnc3RyaW5nJzsKCiAgICAvKioKICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIGFyZSBjdXJyZW50bHkgY3JlYXRpbmcgYSBjbGVhbiBwcm90b3R5cGUgb2YgYSBjbGFzcwogICAgICoKICAgICAqIEB0eXBlIEJvb2xlYW4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHZhciBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE1ldGhvZCB0byBleHRlbmQgbWFudWFsbHkgLSBkbyBub3QgZG8gYXV0b21hdGljYWxseQogICAgICoKICAgICAqIEB0eXBlIEFycmF5CiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2hpZGRlbk1ldGhvZHMgPSBbJ2NvbnN0cnVjdG9yJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXTsKCiAgICAvKioKICAgICAqIExlbnRoIG9mIGhpZGRlbiBtZXRob2RzIGFycmF5CiAgICAgKgogICAgICogQHR5cGUgTnVtYmVyCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2hpZGRlbk1ldGhvZHNMZW5ndGggPSBfaGlkZGVuTWV0aG9kcy5sZW5ndGg7CgogICAgLyoqCiAgICAgKiBSZWdleCB0byBmaW5kIGFueSBjYWxscyB0byBhIHBhcmVudCBtZXRob2QKICAgICAqCiAgICAgKiBAdHlwZSBSZWdFeHAKICAgICAqIEBwcml2YXRlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHZhciBfc3VwZXJNZXRob2RSZWdleCA9IC9cYmJhc2VcYi87CgogICAgLyoqCiAgICAgKiBCbGFuayBmdW5jdGlvbgogICAgICoKICAgICAqIEB0eXBlIEZ1bmN0aW9uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2JsYW5rRnVuY3Rpb24gPSBmdW5jdGlvbigpIHt9OwoKICAgIC8qKgogICAgICogUHJvdG90eXBlIGRlZmF1bHQgdmFsdWVzLiBXaGVuIGV4dGVuZGluZyBtZXRob2RzLCBpZiBib3RoIHNvdXJjZXMgaGF2ZSB0aGVzZSB2YWx1ZXMsIGRvIG5vdCBjb3B5IHRoZW0uCiAgICAgKgogICAgICogQHR5cGUgT2JqZWN0CiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwZURlZmF1bHRzID0geyB0b1NvdXJjZTogbnVsbCwgYmFzZTogX2JsYW5rRnVuY3Rpb24gfTsKCiAgICAvKioKICAgICAqIEJhc2VMaWIgY2xhc3MKICAgICAqCiAgICAgKiBBIGxpYnJhcnkgdG8gY3JlYXRlIGEgbW9yZSB0cmFkaXRpb25hbCBPT1AgaW50ZXJmYWNlIGZvciBkZXZlbG9wZXJzIHRvIHdvcmsgd2l0aAogICAgICoKICAgICAqIEBjbGFzcyBMaWIuQmFzZS5CYXNlCiAgICAgKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIHZhciBCYXNlID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFN1YmNsYXNzIGEgY2xhc3MKICAgICAqCiAgICAgKiBAbWV0aG9kIGV4dGVuZAogICAgICogQHBhcmFtIHtPYmplY3R9IFtpbnN0YW5jZU1ldGhvZHNdIEluc3RhbmNlIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGF0aWNNZXRob2RzXSBTdGF0aWMgbWVtYmVycy9tZXRob2RzCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgQmFzZS5leHRlbmQgPSBmdW5jdGlvbihpbnN0YW5jZU1ldGhvZHMsIHN0YXRpY01ldGhvZHMpIHsgLy8gc3ViY2xhc3MKICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAvLyBidWlsZCB0aGUgcHJvdG90eXBlCiAgICAgICAgX3Byb3RvdHlwaW5nID0gdHJ1ZTsKCiAgICAgICAgdmFyIHByb3RvID0gbmV3IHRoaXMoKTsKICAgICAgICBleHRlbmQuY2FsbChwcm90bywgaW5zdGFuY2VNZXRob2RzKTsKCiAgICAgICAgLy8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGFueSBvdGhlciBtZXRob2QgdG8gaW52b2tlIHRoYXQgbWV0aG9kJ3MgYW5jZXN0b3IKICAgICAgICBwcm90by5iYXNlID0gX3Byb3RvdHlwZURlZmF1bHRzLmJhc2U7CgogICAgICAgIF9wcm90b3R5cGluZyA9IGZhbHNlOwoKICAgICAgICAvLyBjcmVhdGUgdGhlIHdyYXBwZXIgZm9yIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvLmNvbnN0cnVjdG9yOwogICAgICAgIHZhciBrbGFzcyA9IHByb3RvLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nKSB7CiAgICAgICAgICAgICAgICAvLyBpbnN0YW50aWF0aW9uCiAgICAgICAgICAgICAgICBpZiAodGhpcyAmJiAodGhpcy5fY29uc3RydWN0aW5nIHx8IHRoaXMuY29uc3RydWN0b3IgPT09IGtsYXNzKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN0cnVjdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdGluZwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgQmFzZS5jYXN0LmFwcGx5KGtsYXNzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBidWlsZCB0aGUgY2xhc3MgaW50ZXJmYWNlCiAgICAgICAgZXh0ZW5kLmNhbGwoa2xhc3MsIHRoaXMpOwogICAgICAgIGtsYXNzLmFuY2VzdG9yID0gdGhpczsKICAgICAgICBrbGFzcy5wcm90b3R5cGUgPSBwcm90bzsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIG9yaWdpbmFsIG1ldGhvZAogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB2YWx1ZU9mCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFt0eXBlXQogICAgICAgICAqIEByZXR1cm4gRnVuY3Rpb24KICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICovCiAgICAgICAga2xhc3MudmFsdWVPZiA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlID09PSBUWVBFX09CSkVDVCkgPyBrbGFzcyA6IGNvbnN0cnVjdG9yLnZhbHVlT2YoKTsKICAgICAgICB9OwogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCBzdGF0aWNNZXRob2RzKTsKCiAgICAgICAgLy8gaWYgc3RhdGljIGluaXQgbWV0aG9kIGV4aXN0cywgY2FsbCBpdAogICAgICAgIGlmICh0eXBlb2Yga2xhc3MuaW5pdCA9PT0gVFlQRV9GVU5DVElPTikgewogICAgICAgICAgICBrbGFzcy5pbml0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICAgIC8qKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gc291cmNlCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdmFsdWVdCiAgICAgKiBAY2hhaW5hYmxlCiAgICAgKi8KICAgIEJhc2UucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgdmFsdWUpIHsKICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBhIG5hbWUvdmFsdWUgcGFpcgogICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBUWVBFX1NUUklORyAmJiBhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzW3NvdXJjZV07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGFuY2VzdG9yICYmCiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGluZyBhIG1ldGhvZD8KICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUgPT09IFRZUEVfRlVOQ1RJT04pICYmCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlT2YoKSBjb21wYXJpc29uIGlzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgICghYW5jZXN0b3IudmFsdWVPZiB8fCBhbmNlc3Rvci52YWx1ZU9mKCkgIT09IHZhbHVlLnZhbHVlT2YoKSkgJiYKICAgICAgICAgICAgICAgIF9zdXBlck1ldGhvZFJlZ2V4LnRlc3QodmFsdWUpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB1bmRlcmx5aW5nIG1ldGhvZAogICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlLnZhbHVlT2YoKTsKCiAgICAgICAgICAgICAgICAvLyBvdmVycmlkZQogICAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5iYXNlIHx8IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IGFuY2VzdG9yOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBwb2ludCB0byB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlID09PSBUWVBFX09CSkVDVCkgPyB2YWx1ZSA6IG1ldGhvZDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZyA9IEJhc2UudG9TdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc1tzb3VyY2VdID0gdmFsdWU7CgogICAgICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbAogICAgICAgIH0gZWxzZSBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIHZhciBleHRlbmQgPSBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CgogICAgICAgICAgICAvLyBpZiB0aGlzIG9iamVjdCBoYXMgYSBjdXN0b21pc2VkIGV4dGVuZCBtZXRob2QgdGhlbiB1c2UgaXQKICAgICAgICAgICAgaWYgKCFfcHJvdG90eXBpbmcgJiYgdHlwZW9mIHRoaXMgIT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IHRoaXMuZXh0ZW5kIHx8IGV4dGVuZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZG8gaGlkZGVuIG1ldGhvZHMgc2VwYXJhdGVseQogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgcHJvdG90eXBpbmcgdGhlbiBpbmNsdWRlIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB2YXIgaSA9IF9wcm90b3R5cGluZyA/IDAgOiAxOwogICAgICAgICAgICB2YXIga2V5OwogICAgICAgICAgICBmb3IgKDsgaSA8IF9oaWRkZW5NZXRob2RzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGtleSA9IF9oaWRkZW5NZXRob2RzW2ldOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZVtrZXldICE9PSBfcHJvdG90eXBlRGVmYXVsdHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKHRoaXMsIGtleSwgc291cmNlW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IGVhY2ggb2YgdGhlIHNvdXJjZSBvYmplY3QncyBwcm9wZXJ0aWVzIHRvIHRoaXMgb2JqZWN0CiAgICAgICAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKCFfcHJvdG90eXBlRGVmYXVsdHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKHRoaXMsIGtleSwgc291cmNlW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLy8gaW5pdGlhbGlzZQogICAgQmFzZSA9IEJhc2UuZXh0ZW5kKHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBzdGF0aWMgYmFzZSBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgYmFzZQogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICBiYXNlOiBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZQoKICAgIH0sIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogUGFyZW50IG9iamVjdC9jbGFzcwogICAgICAgICAqCiAgICAgICAgICogQHByb3BlcnR5IGFuY2VzdG9yCiAgICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICBhbmNlc3RvcjogT2JqZWN0LAoKICAgICAgICAvKioKICAgICAgICAgKiBCYXNlLmpzIHZlcnNpb24KICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSB2ZXJzaW9uCiAgICAgICAgICogQHR5cGUgU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICB2ZXJzaW9uOiAnMS4xJywKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5kIGN1cnJlbnQgY2xhc3MgaW50byBhbm90aGVyIG9iamVjdCBvciBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIElmIGFuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZSBpcyBwYXNzZWQsIG9ubHkgcHJvdG90eXBlIG1ldGhvZHMKICAgICAgICAgKiB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBhIGNsYXNzICh3aXRoIGNvbnN0cnVjdG9yKSBpcyBwYXNzZWQsIGJvdGggc3RhdGljIGFuZAogICAgICAgICAqIHByb3RvdHlwZSBtZXRob2RzIHdpbGwgYmUgY2FzdCBFWENFUFQgZm9yIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgY2FzdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjbGFzcyogQ2xhc3NlcyBvciBvYmplY3RzIHRvIGNhc3QKICAgICAgICAgKiBAY2hhaW5hYmxlCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGNhc3Q6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICB2YXIgZXh0ZW5kOwogICAgICAgICAgICB2YXIgY2FzdGVyOwoKICAgICAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgY2FzdGVyID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgZXh0ZW5kID0gY2FzdGVyLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CgogICAgICAgICAgICAgICAgLy8gY2FzdCBwcm90b3R5cGUgYW5kIHN0YXRpYyBtZXRob2RzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhc3RlciA9PT0gVFlQRV9GVU5DVElPTikgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5wcm90b3R5cGUuZXh0ZW5kIHx8IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbChjYXN0ZXIucHJvdG90eXBlLCB0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBjYXN0ZXIuYW5jZXN0b3IgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICAvLyBjYXN0IG9ubHkgcHJvdG90eXBlIG1ldGhvZHMKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLCB0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudCBhIGNsYXNzIGludG8gdGhlIGN1cnJlbnQgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBBbGwgcHJvdG90eXBlIGFuZCBzdGF0aWMgcHJvcGVydGllcyB3aWxsIGJlIGV4dGVuZGVkIGludG8KICAgICAgICAgKiBgdGhpc2AgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGltcGxlbWVudAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjbGFzcyogQ2xhc3NlcyBvciBvYmplY3RzIHRvIGNhc3QKICAgICAgICAgKiBAY2hhaW5hYmxlCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGltcGxlbWVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhc3QuY2FsbChhcmd1bWVudHNbaV0sIHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgc3RyaW5nIHZhbHVlIG9mIGNsYXNzCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIHRvU3RyaW5nCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgKyAnJzsKICAgICAgICB9CgogICAgfSk7CgogICAgcmV0dXJuIEJhc2U7CgoKfSkpOwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCi8qanNoaW50IC1XMDgzICovIC8vIGlubGluZSBmdW5jdGlvbnMgYXJlIHVzZWQgc2FmZWx5Ci8qKgogKiBBbHBhY2EgZm9ybXMgZW5naW5lIGZvciBqUXVlcnkKICovCihmdW5jdGlvbigkKSB7CgogICAgLyoqCiAgICAgKiBSZW5kZXJzIGFuIEFscGFjYSBmaWVsZCBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogVGhlIGJhc2ljIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIGNvbmZpZyk7CiAgICAgKiAgICAgPC9wcmU+CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogVGhlIGZ1bGwgc3ludGF4IGlzOgogICAgICoKICAgICAqIDxjb2RlPgogICAgICogICAgIDxwcmU+CiAgICAgKiAgICAgICAgIEFscGFjYShlbCwgewogICAgICogICAgICAgICAgICAgICJkYXRhIiA6IHtBbnl9IGZpZWxkIGRhdGEgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAic2NoZW1hIjoge09iamVjdH0gZmllbGQgc2NoZW1hIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgIm9wdGlvbnMiIDoge09iamVjdH0gZmllbGQgb3B0aW9ucyAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJ2aWV3Ijoge09iamVjdHxTdHJpbmd9IGZpZWxkIHZpZXcgKG9iamVjdCBvciBpZCByZWZlcmVuY2UpIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInJlbmRlciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlcGxhY2luZyBkZWZhdWx0IHJlbmRlcmluZyBtZXRob2QgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHBvc3QtcmVuZGVyaW5nICAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJlcnJvciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVycm9yIGhhbmRsaW5nICAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJjb25uZWN0b3IiOiB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yIGZvciByZXRyaWV2aW5nIG9yIHN0b3JpbmcgZGF0YSwgc2NoZW1hLCBvcHRpb25zLCB2aWV3IGFuZCB0ZW1wbGF0ZXMuIChvcHRpb25hbCkKICAgICAqICAgICAgICAgfSk7CiAgICAgKiAgICAgPC9wcmU+CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIHZhciBBbHBhY2EgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIC8vIGlsbGVnYWwKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiWW91IG11c3Qgc3VwcGx5IGF0IGxlYXN0IG9uZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgY2FuIGVpdGhlciBiZSBhIERPTSBlbGVtZW50IGFnYWluc3Qgd2hpY2ggQWxwYWNhIHdpbGwgZ2VuZXJhdGUgYSBmb3JtIG9yIGl0IGNhbiBiZSBhIGZ1bmN0aW9uIG5hbWUuICBTZWUgaHR0cDovL3d3dy5hbHBhY2Fqcy5vcmcgZm9yIG1vcmUgZGV0YWlscy4iKTsKICAgICAgICB9CgogICAgICAgIC8vIGVsZW1lbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IChlaXRoZXIgYSBzdHJpbmcgb3IgYSBET00gZWxlbWVudCkKICAgICAgICB2YXIgZWwgPSBhcmdzWzBdOwogICAgICAgIGlmIChlbCAmJiBBbHBhY2EuaXNTdHJpbmcoZWwpKSB7CiAgICAgICAgICAgIGVsID0gJCgiIyIgKyBlbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBvdGhlciBhcmd1bWVudHMgd2UgbWF5IHdhbnQgdG8gZmlndXJlIG91dAogICAgICAgIHZhciBkYXRhID0gbnVsbDsKICAgICAgICB2YXIgc2NoZW1hID0gbnVsbDsKICAgICAgICB2YXIgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgdmFyIHZpZXcgPSBudWxsOwogICAgICAgIHZhciBjYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIHJlbmRlcmVkQ2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgY29ubmVjdG9yID0gbnVsbDsKICAgICAgICB2YXIgbm90VG9wTGV2ZWwgPSBmYWxzZTsKICAgICAgICB2YXIgaW5pdGlhbFNldHRpbmdzID0ge307CgogICAgICAgIC8vIGlmIHRoZXNlIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCB0aGVuIGRhdGEsIHNjaGVtYSwgb3B0aW9ucyBhbmQgc291cmNlIGFyZSBsb2FkZWQgdmlhIGNvbm5lY3RvcgogICAgICAgIHZhciBkYXRhU291cmNlID0gbnVsbDsKICAgICAgICB2YXIgc2NoZW1hU291cmNlID0gbnVsbDsKICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSBudWxsOwoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB0aGUgQWxwYWNhIGZpZWxkIGluc3RhbmNlIGJvdW5kIHRvIHRoZSBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEZpcnN0IGNvbnNpZGVycyB0aGUgaW1tZWRpYXRlIGRvbSBlbGVtZW50IGFuZCB0aGVuIGxvb2tzIDEgbGV2ZWwgZGVlcCB0byBjaGlsZHJlbiBhbmQgdGhlbiB1cCB0byBwYXJlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICB2YXIgZmluZEV4aXN0aW5nQWxwYWNhQmluZGluZyA9IGZ1bmN0aW9uKGRvbUVsZW1lbnQsIHNraXBQaXZvdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IG51bGw7CgogICAgICAgICAgICAvLyBsb29rIGF0ICJkYXRhLWFscGFjYS1maWVsZC1pZCIKICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkSWQgPSAkKGRvbUVsZW1lbnQpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FGaWVsZElkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYWxwYWNhRmllbGQgPSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbYWxwYWNhRmllbGRJZF07CiAgICAgICAgICAgICAgICBpZiAoYWxwYWNhRmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBhbHBhY2FGaWVsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBsb29rIGF0ICJkYXRhLWFscGFjYS1mb3JtLWlkIgogICAgICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZm9ybUlkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIik7CiAgICAgICAgICAgICAgICBpZiAoZm9ybUlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdWJFbGVtZW50cyA9ICQoZG9tRWxlbWVudCkuZmluZCgiOmZpcnN0Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRmllbGRJZCA9ICQoc3ViRWxlbWVudHNbMF0pLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJGaWVsZElkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRmllbGQgPSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbc3ViRmllbGRJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBzdWJGaWVsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBmb3IgY2hpbGRyZW4gMHRoIGVsZW1lbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGREb21FbGVtZW50cyA9ICQoZWwpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkRG9tRWxlbWVudHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcoY2hpbGREb21FbGVtZW50c1swXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IGNoaWxkRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgZm91bmQsIGNoZWNrIHBhcmVudAogICAgICAgICAgICBpZiAoIWV4aXN0aW5nICYmICFza2lwUGl2b3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRFbCA9ICQoZWwpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZCA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcocGFyZW50RWwsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gcGFyZW50RmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIHNwZWNpYWxGdW5jdGlvbk5hbWVzID0gWyJnZXQiLCAiZXhpc3RzIiwgImRlc3Ryb3kiXTsKICAgICAgICB2YXIgaXNTcGVjaWFsRnVuY3Rpb24gPSAoYXJncy5sZW5ndGggPiAxICYmIEFscGFjYS5pc1N0cmluZyhhcmdzWzFdKSAmJiAoc3BlY2lhbEZ1bmN0aW9uTmFtZXMuaW5kZXhPZihhcmdzWzFdKSA+IC0xKSk7CgogICAgICAgIHZhciBleGlzdGluZyA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcoZWwpOwogICAgICAgIGlmIChleGlzdGluZyB8fCBpc1NwZWNpYWxGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc1NwZWNpYWxGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBzcGVjaWFsIGZ1bmN0aW9uIG5hbWUKICAgICAgICAgICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lID0gYXJnc1sxXTsKICAgICAgICAgICAgICAgIGlmICgiZ2V0IiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJleGlzdHMiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleGlzdGluZyA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZGVzdHJveSIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5rbm93biBzcGVjaWFsIGZ1bmN0aW9uOiAiICsgc3BlY2lhbEZ1bmN0aW9uTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbmZpZyA9IG51bGw7CgogICAgICAgICAgICAvLyBqdXN0IGEgZG9tIGVsZW1lbnQsIG5vIG90aGVyIGFyZ3M/CiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ3JhYiB0aGUgZGF0YSBpbnNpZGUgb2YgdGhlIGVsZW1lbnQgYW5kIHVzZSB0aGF0IGZvciBjb25maWcKICAgICAgICAgICAgICAgIHZhciBqc29uU3RyaW5nID0gJChlbCkudGV4dCgpOwoKICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7CiAgICAgICAgICAgICAgICAkKGVsKS5odG1sKCIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoYXJnc1sxXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gYXJnc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogYXJnc1sxXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghY29uZmlnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIEFscGFjYSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRhdGEgPSBjb25maWcuZGF0YTsKICAgICAgICAgICAgc2NoZW1hID0gY29uZmlnLnNjaGVtYTsKICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zOwogICAgICAgICAgICB2aWV3ID0gY29uZmlnLnZpZXc7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLnJlbmRlcjsKICAgICAgICAgICAgaWYgKGNvbmZpZy5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayA9IGNvbmZpZy5wb3N0UmVuZGVyOwogICAgICAgICAgICBlcnJvckNhbGxiYWNrID0gY29uZmlnLmVycm9yOwogICAgICAgICAgICBjb25uZWN0b3IgPSBjb25maWcuY29ubmVjdG9yOwoKICAgICAgICAgICAgLy8gc291cmNlcwogICAgICAgICAgICBkYXRhU291cmNlID0gY29uZmlnLmRhdGFTb3VyY2U7CiAgICAgICAgICAgIHNjaGVtYVNvdXJjZSA9IGNvbmZpZy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSBjb25maWcub3B0aW9uc1NvdXJjZTsKICAgICAgICAgICAgdmlld1NvdXJjZSA9IGNvbmZpZy52aWV3U291cmNlOwoKICAgICAgICAgICAgLy8gb3RoZXIKICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkgewogICAgICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzWyJ1aSJdID0gY29uZmlnLnVpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSkgewogICAgICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzWyJ0eXBlIl0gPSBjb25maWcudHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZy5ub3RUb3BMZXZlbCkpIHsKICAgICAgICAgICAgICAgIG5vdFRvcExldmVsID0gY29uZmlnLm5vdFRvcExldmVsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBubyBlcnJvciBjYWxsYmFjayBpcyBwcm92aWRlZCwgd2UgZmFsbCBiYWNrIHRvIGEgYnJvd3NlciBhbGVydAogICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShlcnJvckNhbGxiYWNrKSkgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrID0gQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrOwogICAgICAgIH0KCiAgICAgICAgLy8gaW5zdGFudGlhdGUgdGhlIGNvbm5lY3RvciAoaWYgbm90IGFscmVhZHkgaW5zdGFudGlhdGVkKQogICAgICAgIC8vIGlmIGNvbmZpZyBpcyBwYXNzZWQgaW4gKGFzIG9iamVjdCksIHdlIGluc3RhbnRpYXRlCiAgICAgICAgaWYgKCFjb25uZWN0b3IgfHwgIWNvbm5lY3Rvci5jb25uZWN0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvcklkID0gImRlZmF1bHQiOwogICAgICAgICAgICB2YXIgY29ubmVjdG9yQ29uZmlnID0ge307CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoY29ubmVjdG9yKSkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KGNvbm5lY3RvcikgJiYgY29ubmVjdG9yLmlkKSB7CiAgICAgICAgICAgICAgICBjb25uZWN0b3JJZCA9IGNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgIGlmIChjb25uZWN0b3IuY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yQ29uZmlnID0gY29ubmVjdG9yLmNvbmZpZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkKTsKICAgICAgICAgICAgaWYgKCFDb25uZWN0b3JDbGFzcykgewogICAgICAgICAgICAgICAgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQsIGNvbm5lY3RvckNvbmZpZyk7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3Igc2Vjb25kIG9yIGRlZXBlciBsZXZlbCBvZiBmaWVsZHMsIGRlZmF1bHQgbG9hZGVyIHNob3VsZCBiZSB0aGUgb25lIHRvIGRvIGxvYWRBbGwKICAgICAgICAvLyBzaW5jZSBzY2hlbWEsIGRhdGEsIG9wdGlvbnMgYW5kIHZpZXcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICAgICAgICAvLyBVbmxlc3Mgd2Ugd2FudCB0byBsb2FkIGluZGl2aWR1YWwgZmllbGRzIChvdGhlciB0aGFuIHRoZSB0ZW1wbGF0ZXMpIHVzaW5nIHRoZSBwcm92aWRlZAogICAgICAgIC8vIGxvYWRlciwgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guIFRoZSBiZW5lZml0IGlzIHNhdmluZyB0aW1lIG9uIGxvYWRlciBmb3JtYXQgY2hlY2tpbmcuCgogICAgICAgIHZhciBsb2FkQWxsQ29ubmVjdG9yID0gY29ubmVjdG9yOwoKICAgICAgICBpZiAobm90VG9wTGV2ZWwpIHsKICAgICAgICAgICAgdmFyIExvYWRBbGxDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIpOwogICAgICAgICAgICBsb2FkQWxsQ29ubmVjdG9yID0gbmV3IExvYWRBbGxDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9CgogICAgICAgIC8vIHJlc2V0cyB0aGUgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgYmFjayB0byBkZWZhdWx0IHN0YXRlIGFmdGVyIGZpcnN0IHJlbmRlcgogICAgICAgIHZhciBfcmVzZXRJbml0VmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oZmllbGQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAvLyB3cmFwIHJlbmRlcmVkIGNhbGxiYWNrIHRvIGFsbG93IGZvciBVSSB0cmVhdG1lbnQgKGRvbSBmb2N1cywgZXRjKQogICAgICAgIHZhciBfcmVuZGVyZWRDYWxsYmFjayA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdG9wIGxldmVsLCBhcHBseSBhIHVuaXF1ZSBvYnNlcnZhYmxlIHNjb3BlIGlkCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWVsZC5vYnNlcnZhYmxlU2NvcGUgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgdGhlIHRvcC1tb3N0IGNvbnRyb2wKICAgICAgICAgICAgLy8gZmlyZSAicmVhZHkiIGV2ZW50IG9uIGV2ZXJ5IGNvbnRyb2wKICAgICAgICAgICAgLy8gZ28gZG93biBkZXB0aCBmaXJzdCBhbmQgZmlyZSB0byBsb3dlc3QgY29udHJvbHMgYmVmb3JlIHRyaWNrbGluZyBiYWNrIHVwCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KGZpZWxkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdG9wIGxldmVsIGFuZCBmb2N1cyBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLCB0aGVuIGF1dG8tc2V0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQob3B0aW9ucy5mb2N1cykgJiYgIWZpZWxkLnBhcmVudCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb2N1cyA9IEFscGFjYS5kZWZhdWx0Rm9jdXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGF1dG8tc2V0IHRoZSBmb2N1cz8KICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb2N1cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBkb0ZvY3VzID0gZnVuY3Rpb24oX19maWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX19maWVsZC5zdXNwZW5kQmx1ckZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNDb250cm9sRmllbGQgJiYgZmllbGQuaXNBdXRvRm9jdXNhYmxlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZm9jdXMgb24gdGhpcyBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZvY3VzID0gdHJ1ZSwgdGhlbiBmb2N1cyBvbiB0aGUgZmlyc3QgY2hpbGQgY29udHJvbCBpZiBpdCBpcyBhdXRvLWZvY3VzYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vdCByZWFkLW9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgZmlyc3QgZWxlbWVudCBpbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW5bel0uaXNDb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQXV0b0ZvY3VzYWJsZSgpICYmICFmaWVsZC5jaGlsZHJlblt6XS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhmaWVsZC5jaGlsZHJlblt6XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKG9wdGlvbnMuZm9jdXMpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSBwYXRoIHRvIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmdldENvbnRyb2xCeVBhdGgob3B0aW9ucy5mb2N1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmlzQ29udHJvbEZpZWxkICYmIGNoaWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBfcmVzZXRJbml0VmFsaWRhdGlvbkVycm9yKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZW5kZXJlZENhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZW5kZXJlZENhbGxiYWNrKGZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGxvYWRBbGxDb25uZWN0b3IubG9hZEFsbCh7CiAgICAgICAgICAgICJkYXRhIjogZGF0YSwKICAgICAgICAgICAgInNjaGVtYSI6IHNjaGVtYSwKICAgICAgICAgICAgIm9wdGlvbnMiOiBvcHRpb25zLAogICAgICAgICAgICAidmlldyI6IHZpZXcsCiAgICAgICAgICAgICJkYXRhU291cmNlIjogZGF0YVNvdXJjZSwKICAgICAgICAgICAgInNjaGVtYVNvdXJjZSI6IHNjaGVtYVNvdXJjZSwKICAgICAgICAgICAgIm9wdGlvbnNTb3VyY2UiOiBvcHRpb25zU291cmNlLAogICAgICAgICAgICAidmlld1NvdXJjZSI6IHZpZXdTb3VyY2UKICAgICAgICB9LCBmdW5jdGlvbihsb2FkZWREYXRhLCBsb2FkZWRPcHRpb25zLCBsb2FkZWRTY2hlbWEsIGxvYWRlZFZpZXcpIHsKCiAgICAgICAgICAgIC8vIGZvciBjYXNlcyB3aGVyZSB0aGluZ3MgY291bGQgbm90IGJlIGxvYWRlZCB2aWEgc291cmNlIGxvYWRlcnMsIGZhbGwgYmFjayB0byB3aGF0IG1heSBoYXZlIGJlZW4gcGFzc2VkCiAgICAgICAgICAgIC8vIGluIGRpcmVjdGx5IGFzIHZhbHVlcwoKICAgICAgICAgICAgbG9hZGVkRGF0YSA9IGxvYWRlZERhdGEgPyBsb2FkZWREYXRhIDogZGF0YTsKICAgICAgICAgICAgbG9hZGVkU2NoZW1hID0gbG9hZGVkU2NoZW1hID8gbG9hZGVkU2NoZW1hOiBzY2hlbWE7CiAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMgPSBsb2FkZWRPcHRpb25zID8gbG9hZGVkT3B0aW9ucyA6IG9wdGlvbnM7CiAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRWaWV3ID8gbG9hZGVkVmlldyA6IHZpZXc7CgogICAgICAgICAgICAvLyBzb21lIGRlZmF1bHRzIGZvciB0aGUgY2FzZSB3aGVyZSBkYXRhIGlzIG51bGwKICAgICAgICAgICAgLy8gaWYgc2NoZW1hICsgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkLCB3ZSBhc3N1bWUgYSB0ZXh0IGZpZWxkCgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkRGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRTY2hlbWEpICYmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zKSB8fCBBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zLnR5cGUpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWREYXRhID0gIiI7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMgPSAidGV4dCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgJiYgQWxwYWNhLmlzT2JqZWN0KG9wdGlvbnMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkT3B0aW9ucy50eXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxvYWRlZE9wdGlvbnMudmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9hZGVkVmlldyA9IGxvYWRlZE9wdGlvbnMudmlldzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaW5pdCBhbHBhY2EKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbml0KGVsLCBsb2FkZWREYXRhLCBsb2FkZWRPcHRpb25zLCBsb2FkZWRTY2hlbWEsIGxvYWRlZFZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIF9yZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sobG9hZEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWVzcGFjZSBOYW1lc3BhY2UgZm9yIGFsbCBBbHBhY2EgRmllbGQgQ2xhc3MgSW1wbGVtZW50YXRpb25zLgogICAgICovCiAgICBBbHBhY2EuRmllbGRzID0geyB9OwoKICAgIC8qKgogICAgICogQG5hbWVzcGFjZSBOYW1lc3BhY2UgZm9yIGFsbCBBbHBhY2EgQ29ubmVjdG9yIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkNvbm5lY3RvcnMgPSB7IH07CgogICAgQWxwYWNhLkV4dGVuZCA9ICQuZXh0ZW5kOwoKICAgIEFscGFjYS5DcmVhdGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgIGFyZ3MudW5zaGlmdCh7fSk7CgogICAgICAgIHJldHVybiAkLmV4dGVuZC5hcHBseSh0aGlzLCBhcmdzKTsKICAgIH07CgogICAgLy8gc3RhdGljIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMKICAgIEFscGFjYS5FeHRlbmQoQWxwYWNhLAogICAgLyoqIEBsZW5kcyBBbHBhY2EgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBub25BcnJheSBBIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG91dCBvZiB0aGUgbm9uLWFycmF5IHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIG1ha2VBcnJheSA6IGZ1bmN0aW9uKG5vbkFycmF5KSB7CiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub25BcnJheSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGZ1bmN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBmdW5jdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNTdHJpbmc6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICJzdHJpbmciKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gIUFscGFjYS5pc1VuZGVmaW5lZChvYmopICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYSBwbGFpbiwgbm9uLXByb3RvdHlwZWQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBwbGFpbiBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICQuaXNQbGFpbk9iamVjdChvYmopOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBudW1iZXIuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIG51bWJlciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzTnVtYmVyOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAibnVtYmVyIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYXJyYXksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0FycmF5OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBib29sZWFuLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBib29sZWFuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNCb29sZWFuOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAiYm9vbGVhbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHVuZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVW5kZWZpbmVkOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09ICJ1bmRlZmluZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdHJpcHMgYW55IGV4Y2VzcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4gdGV4dC4KICAgICAgICAgKiBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzdHIKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gdHJpbW1lZCBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICB0cmltOiBmdW5jdGlvbih0ZXh0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSB0ZXh0OwoKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgQWxwYWNhLmlzU3RyaW5nKHRyaW1tZWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cmltbWVkID0gdHJpbW1lZC5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJpbW1lZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBhIHNhZmUgY29udmVyc2lvbiBvZiBhbiBIVE1MIHRleHR1YWwgc3RyaW5nIGludG8gYSBET00gb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHgKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIHNhZmVEb21QYXJzZTogZnVuY3Rpb24oeCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4ICYmIEFscGFjYS5pc1N0cmluZyh4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgeCA9IEFscGFjYS50cmltKHgpOwoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZG9tCiAgICAgICAgICAgICAgICB2YXIgY29udmVydGVkID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9ICQoeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGFub3RoZXIgYXR0ZW1wdCB0byBhY2NvdW50IGZvciBzYWZldHkgaW4gc29tZSBicm93c2VycwogICAgICAgICAgICAgICAgICAgIHggPSAiPGRpdj4iICsgeCArICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpLmNoaWxkcmVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciBhIHZhcmlhYmxlIGlzIGVtcHR5LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0gW2Jvb2xlYW5dIGluY2x1ZGVGdW5jdGlvbnMgd2hldGhlciB0byBpbmNsdWRlIGZ1bmN0aW9ucyBpbiBhbnkgY291bnRzCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNFbXB0eTogZnVuY3Rpb24ob2JqLCBpbmNsdWRlRnVuY3Rpb25zKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IHNlbGYuY291bnRQcm9wZXJ0aWVzKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucyk7CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmoKICAgICAgICAgKiBAcGFyYW0gaW5jbHVkZUZ1bmN0aW9ucwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBjb3VudFByb3BlcnRpZXM6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICB2YXIgY291bnQgPSAwOwoKICAgICAgICAgICAgaWYgKG9iaiAmJiBBbHBhY2EuaXNPYmplY3Qob2JqKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvYmopCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRnVuY3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvYmpba10pICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb2R1Y2VzIGEgY29weSBvZiB0aGUgZ2l2ZW4gSlMgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSBzaW1wbGUgYXJyYXkgb3IgYSBzaW1wbGUgb2JqZWN0LCB0aGVuIGEgcHVyZSBjb3B5IGlzIHByb2R1Y2VkLgogICAgICAgICAqCiAgICAgICAgICogSWYgaXQncyBhIGNvbXBsZXggb2JqZWN0IG9yIGEgZnVuY3Rpb24sIHRoZW4gdGhlIHJlZmVyZW5jZSBpcyBjb3BpZWQgKGkuZS4gbm90IHRydWx5IGEgY29weSkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGhpbmcKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIGNvcHlPZjogZnVuY3Rpb24odGhpbmcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29weSA9IHRoaW5nOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29weSA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29weS5wdXNoKEFscGFjYS5jb3B5T2YodGhpbmdbaV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodGhpbmcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBEYXRlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGRhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpbmcuZ2V0VGltZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaW5nIGluc3RhbmNlb2YgUmVnRXhwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaW5nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaW5nLm5vZGVUeXBlICYmICJjbG9uZU5vZGUiIGluIHRoaW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlCiAgICAgICAgICAgICAgICAgICAgY29weSA9IHRoaW5nLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdCh0aGluZykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29weSA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaW5nKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmhhc093blByb3BlcnR5KGspKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2tdID0gQWxwYWNhLmNvcHlPZih0aGluZ1trXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCdzIHNvbWUgb3RoZXIga2luZCBvZiBvYmplY3Qgc28gd2UganVzdCBkbyBhIHJlZmVyZW50aWFsIGNvcHkKICAgICAgICAgICAgICAgICAgICAvLyBpbiBvdGhlciB3b3Jkcywgbm90IGEgY29weQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY29weTsKICAgICAgICB9LAoKICAgICAgICBjb3B5SW50bzogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShpKSAmJiAhdGhpcy5pc0Z1bmN0aW9uKHRoaXNbaV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IHNvdXJjZVtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2VzLiAgQWxpYXMgZm9yIGNvcHlPZigpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG9iamVjdAogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGNsb25lT2JqZWN0OiBmdW5jdGlvbihvYmplY3QpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNvcHlPZihvYmplY3QpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNwbGljZXMgYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlIFNvdXJjZSBzdHJpbmcgdG8gYmUgc3BsaWNlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZVBvaW50IFNwbGljZSBsb2NhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3BsaWNlIFN0cmluZyB0byBiZSBzcGxpY2VkIGluLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNwbGljZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgc3BsaWNlSW46IGZ1bmN0aW9uKHNvdXJjZSwgc3BsaWNlUG9pbnQsIHNwbGljZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnN0cmluZygwLCBzcGxpY2VQb2ludCkgKyBzcGxpY2UgKyBzb3VyY2Uuc3Vic3RyaW5nKHNwbGljZVBvaW50LCBzb3VyY2UubGVuZ3RoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYWN0cyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciBTb3VyY2UgYXJyYXkgdG8gYmUgY29tcGFjdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gQ29tcGFjdGVkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGNvbXBhY3RBcnJheTogZnVuY3Rpb24oYXJyKSB7CiAgICAgICAgICAgIHZhciBuID0gW10sIGwgPSBhcnIubGVuZ3RoLGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghbGFuZy5pc051bGwoYXJyW2ldKSAmJiAhbGFuZy5pc1VuZGVmaW5lZChhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGFycltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhY2NlbnRzIGZyb20gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFNvdXJjZSBzdHJpbmcuCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gQ2xlYW5lZCBzdHJpbmcgd2l0aG91dCBhY2NlbnRzLgogICAgICAgICAqLwogICAgICAgIHJlbW92ZUFjY2VudHM6IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1vDoMOhw6LDo8Okw6VdL2csICJhIikucmVwbGFjZSgvW8Oow6nDqsOrXS9nLCAiZSIpLnJlcGxhY2UoL1vDrMOtw67Dr10vZywgImkiKS5yZXBsYWNlKC9bw7LDs8O0w7XDtl0vZywgIm8iKS5yZXBsYWNlKC9bw7nDusO7w7xdL2csICJ1IikucmVwbGFjZSgvW8O9w79dL2csICJ5IikucmVwbGFjZSgvW8OxXS9nLCAibiIpLnJlcGxhY2UoL1vDp10vZywgImMiKS5yZXBsYWNlKC9bxZNdL2csICJvZSIpLnJlcGxhY2UoL1vDpl0vZywgImFlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gZWwKICAgICAgICAgKiBAcGFyYW0gYXJyCiAgICAgICAgICogQHBhcmFtIGZuCiAgICAgICAgICovCiAgICAgICAgaW5kZXhPZjogZnVuY3Rpb24oZWwsIGFyciwgZm4pIHsKICAgICAgICAgICAgdmFyIGwgPSBhcnIubGVuZ3RoLGk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0Z1bmN0aW9uKGZuKSkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZWx0CiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXJyRWx0CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oZWx0LCBhcnJFbHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0ID09PSBhcnJFbHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoZm4uY2FsbCh7fSwgZWwsIGFycltpXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFN0YXRpYyBjb3VudGVyIGZvciBnZW5lcmF0aW5nIGEgdW5pcXVlIElELgogICAgICAgICAqLwogICAgICAgIHVuaXF1ZUlkQ291bnRlcjogMCwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBMb2NhbGUuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdExvY2FsZTogImVuX1VTIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byBzZXQgZm9jdXMgYnkgZGVmYXVsdAogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRGb2N1czogdHJ1ZSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBmdW5jdGlvbiB0byB1c2UgZm9yIGVudW1lcmF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U29ydDogZnVuY3Rpb24oYSwgYikgewoKICAgICAgICAgICAgaWYgKGEudGV4dCA+IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYS50ZXh0IDwgYi50ZXh0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGRlZmF1bHQgTG9jYWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBOZXcgZGVmYXVsdCBsb2NhbGUuCiAgICAgICAgICovCiAgICAgICAgc2V0RGVmYXVsdExvY2FsZTogZnVuY3Rpb24obG9jYWxlKSB7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExvY2FsZSA9IGxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaWVsZCBUeXBlIHRvIFNjaGVtYSBUeXBlIE1hcHBpbmdzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBmaWVsZCB0eXBlIHRvIHNjaGVtYSBkYXRhIHR5cGUgbWFwcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzY2hlbWFUeXBlIFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZzogZnVuY3Rpb24oc2NoZW1hVHlwZSwgZmllbGRUeXBlKSB7CiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlICYmIGZpZWxkVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nW3NjaGVtYVR5cGVdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgRm9ybWF0IE1hcHBpbmdzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmc6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBmaWVsZCB0eXBlIHRvIHNjaGVtYSBmb3JtYXQgbWFwcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgU2NoZW1hIGZvcm1hdC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGRUeXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiBmdW5jdGlvbihmb3JtYXQsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoZm9ybWF0ICYmIGZpZWxkVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nW2Zvcm1hdF0gPSBmaWVsZFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHNjaGVtYSB0eXBlIG9mIGEgdmFyaWFibGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBUaGUgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gU2NoZW1hIHR5cGUgb2YgdGhlIHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYVR5cGU6IGZ1bmN0aW9uKGRhdGEpIHsKCiAgICAgICAgICAgIHZhciBzY2hlbWFUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG1hcCBkYXRhIHR5cGVzIHRvIGRlZmF1bHQgZmllbGQgdHlwZXMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gInN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJvYmplY3QiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyhkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJudW1iZXIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0Jvb2xlYW4oZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAiYm9vbGVhbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTGFzdCBjaGVjayBmb3IgZGF0YSB0aGF0IGNhcnJpZXMgZnVuY3Rpb25zIC0tIEdpdGFuYUNvbm5lY3RvciBjYXNlLgogICAgICAgICAgICBpZiAoIXNjaGVtYVR5cGUgJiYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYSBiZXN0IGd1ZXNzIGF0IHRoZSBvcHRpb25zIGZpZWxkIHR5cGUgaWYgbm9uZSBwcm92aWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZmllbGQgdHlwZQogICAgICAgICAqLwogICAgICAgIGd1ZXNzT3B0aW9uc1R5cGU6IGZ1bmN0aW9uKHNjaGVtYSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0eXBlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzY2hlbWEgJiYgdHlwZW9mKHNjaGVtYVsiZW51bSJdKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzY2hlbWFbImVudW0iXS5sZW5ndGggPiAzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2VsZWN0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhZGlvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWEudHlwZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBmb3JtYXQgZGVmaW5lZAogICAgICAgICAgICBpZiAoc2NoZW1hLmZvcm1hdCAmJiBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHlwZSA9IEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nW3NjaGVtYS5mb3JtYXRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbHBhY2EgVmlld3MuCiAgICAgICAgICovCiAgICAgICAgdmlld3M6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB2YWxpZCB2aWV3IGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gQSB2YWxpZCB1bmlxdWUgdmlldyBpZC4KICAgICAgICAgKi8KICAgICAgICBnZW5lcmF0ZVZpZXdJZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICJ2aWV3LSIgKyB0aGlzLmdlbmVyYXRlSWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB2aWV3IHdpdGggdGhlIGZyYW1ld29yay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3T2JqZWN0CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJWaWV3OiBmdW5jdGlvbih2aWV3T2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXdPYmplY3QuaWQ7CgogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHZpZXcgd2l0aCBtaXNzaW5nIHZpZXcgaWQ6ICIgKyB2aWV3SWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZXhpc3RpbmdWaWV3ID0gdGhpcy52aWV3c1t2aWV3SWRdOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdWaWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QoZXhpc3RpbmdWaWV3LCB2aWV3T2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHZpZXdPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0LnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlcyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IHByZWNvbXBpbGVkIHZpZXdzLCBmbGFnIHRoZW0KICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZHMgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5pZHMoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5naW5lSWRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZCA9IGVuZ2luZUlkc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhc2sgdGhlIGVuZ2luZSBpZiBpdCBoYXMgYW55IGNhY2hlIGtleXMgZm9yIHZpZXcgdGVtcGxhdGVzIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IGVuZ2luZS5maW5kQ2FjaGVLZXlzKHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHogPSAwOyB6IDwgY2FjaGVLZXlzLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBBbHBhY2Euc3BsaXRDYWNoZUtleShjYWNoZUtleXNbel0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcHJlY29tcGlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdPYmplY3QudGVtcGxhdGVzW3BhcnRzLnRlbXBsYXRlSWRdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogZW5naW5lSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleXNbel0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYSBub3JtYWxpemVkIHZpZXcgYnkgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIGdldE5vcm1hbGl6ZWRWaWV3OiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNvbHZlcyB3aGljaCB2aWV3IGhhbmRsZXMgYSBnaXZlbiB0aGVtZSBhbmQgdHlwZSBvZiBvcGVyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdWkKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBsb29rdXBOb3JtYWxpemVkVmlldzogZnVuY3Rpb24odWksIHR5cGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGhlVmlld0lkID0gbnVsbDsKCiAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiB0aGlzLm5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLm5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3LnVpID09PSB1aSAmJiB2aWV3LnR5cGUgPT09IHR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhlVmlld0lkID0gdmlld0lkOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhlVmlld0lkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIHRlbXBsYXRlIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZUlkIFRlbXBsYXRlIGlkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdGVtcGxhdGUgRWl0aGVyIHRoZSB0ZXh0IG9mIHRoZSB0ZW1wbGF0ZSBvciBhbiBvYmplY3QgY29udGFpbmluZyB7ICJ0eXBlIjogIjx0ZW1wbGF0ZUVuZ2luZUlkZW50aWZpZXI+IiwgInRlbXBsYXRlIjogIjxtYXJrdXA+IiB9CiAgICAgICAgICogQHBhcmFtIFtTdHJpbmddIHZpZXdJZCB0aGUgb3B0aW9uYWwgdmlldyBpZC4gIElmIG5vbmUgaXMgcHJvdmlkZWQsIHRoZW4gYWxsIHJlZ2lzdHJhdGlvbnMgYXJlIHRvIHRoZSBkZWZhdWx0IHZpZXcuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGVJZCwgdGVtcGxhdGUsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSA9IHRlbXBsYXRlOwoKICAgICAgICAgICAgLy8gaWYgbm9ybWFsaXplZCB2aWV3cyBoYXZlIGFscmVhZHkgYmVlbiBjb21wdXRlZCwgdGhlbiB3aXBlIHRoZW0gZG93bgogICAgICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGVtIHRvIGJlIHJlLWNvbXB1dGVkIG9uIHRoZSBuZXh0IHJlbmRlciBhbmQgYWxsb3dzIHRoaXMgdGVtcGxhdGUgdG8gcGFydGljaXBhdGUKICAgICAgICAgICAgaWYgKEFscGFjYS5jb3VudFByb3BlcnRpZXMoQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Eubm9ybWFsaXplZFZpZXdzID0ge307CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbGlzdCBvZiB0ZW1wbGF0ZXMgdG8gYSB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdGVtcGxhdGVzIFRlbXBsYXRlcyBiZWluZyByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSB0ZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlclRlbXBsYXRlczogZnVuY3Rpb24odGVtcGxhdGVzLCB2aWV3SWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB0ZW1wbGF0ZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJUZW1wbGF0ZSh0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZXNbdGVtcGxhdGVJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBtZXNzYWdlIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgSWQgb2YgdGhlIG1lc3NhZ2UgYmVpbmcgcmVnaXN0ZXJlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIHJlZ2lzdGVyZWQKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmlld0lkIElkIG9mIHRoZSB2aWV3IHRoYXQgdGhlIG1lc3NhZ2UgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2VJZCwgbWVzc2FnZSwgdmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgbm8gdmlldyBzcGVjaWZpZWQsIGZhbGwgYmFjayB0byB0aGUgYmFzZSB2aWV3IHdoaWNoIGlzICJiYXNlIgogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gImJhc2UiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdID0ge307CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0uaWQgPSB2aWV3SWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0ubWVzc2FnZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzW21lc3NhZ2VJZF0gPSBtZXNzYWdlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBtZXNzYWdlcyB3aXRoIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2VzIE1lc3NhZ2VzIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlcyBiZWluZyByZWdpc3RlcmVkIHRvLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyTWVzc2FnZXM6IGZ1bmN0aW9uKG1lc3NhZ2VzLCB2aWV3SWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIG1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXMuaGFzT3duUHJvcGVydHkobWVzc2FnZUlkKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlKG1lc3NhZ2VJZCwgbWVzc2FnZXNbbWVzc2FnZUlkXSwgdmlld0lkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgZGF0ZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdERhdGVGb3JtYXQ6ICJNTS9ERC9ZWVlZIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCB0aW1lIGZvcm1hdC4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0VGltZUZvcm1hdDogIkhIOm1tOnNzIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVndWxhciBleHByZXNzaW9ucyBmb3IgZmllbGRzLgogICAgICAgICAqLwogICAgICAgIHJlZ2V4cHM6CiAgICAgICAgewogICAgICAgICAgICAiZW1haWwiOiAvXlthLXowLTkhXCNcJCUmJ1wqXC1cLz1cP1wrXC1cXl9gXHtcfFx9fl0rKD86XC5bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKykqQCg/OlthLXowLTldKD86W2EtejAtOS1dKlthLXowLTldKT9cLikrW2Etel17Miw2fSQvaSwKICAgICAgICAgICAgInVybCI6IC9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvW2EtejAtOV0rKFtcLVwuXXsxfVthLXowLTldKykqXC5bYS16XXsyLDV9KFw6WzAtOV17MSw1fSk/KFwvLiopPyQvaSwKICAgICAgICAgICAgImludHJhbmV0LXVybCI6IC9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvW2EtejAtOV0rKFtcLVwuXXsxfVthLXowLTldKykqKFw6WzAtOV17MSw1fSk/KFwvLiopPyQvaSwKICAgICAgICAgICAgInBhc3N3b3JkIjogL15bMC05YS16QS1aXHgyMC1ceDdFXSokLywKICAgICAgICAgICAgImRhdGUiOiAvXigwWzEtOV18MVswMTJdKVstIC8uXSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVstIC8uXVxkXGQkLywKICAgICAgICAgICAgImludGVnZXIiOiAvXihbXCtcLV0/KFsxLTldXGQqKXwwKSQvLAogICAgICAgICAgICAibnVtYmVyIjovXihbXCtcLV0/KCgoWzAtOV0rKFwuKT8pfChbMC05XSpcLlswLTldKykpKFtlRV1bKy1dP1swLTldKyk/KSkkLywKICAgICAgICAgICAgInBob25lIjovXihcRD8oXGR7M30pXEQ/XEQ/KFxkezN9KVxEPyhcZHs0fSkpPyQvLAogICAgICAgICAgICAiaXB2NCI6L14oPzoxXGQ/XGQ/fDIoPzpbMC00XVxkP3xbNjc4OV18NVswLTVdPyk/fFszLTldXGQ/fDApKD86XC4oPzoxXGQ/XGQ/fDIoPzpbMC00XVxkP3xbNjc4OV18NVswLTVdPyk/fFszLTldXGQ/fDApKXszfSQvLAogICAgICAgICAgICAiemlwY29kZS1maXZlIjogL14oXGR7NX0pPyQvLAogICAgICAgICAgICAiemlwY29kZS1uaW5lIjogL14oXGR7NX0oLVxkezR9KT8pPyQvLAogICAgICAgICAgICAid2hpdGVzcGFjZSI6IC9eXHMrJC8KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXAgb2YgaW5zdGFudGlhdGVkIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZEluc3RhbmNlczoge30sCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcHMgb2YgZmllbGQgdHlwZXMgdG8gZmllbGQgY2xhc3MgaW1wbGVtZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGZpZWxkQ2xhc3NSZWdpc3RyeToge30sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgdGhpcy5maWVsZENsYXNzUmVnaXN0cnlbdHlwZV0gPSBmaWVsZENsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHR5cGUgb2YgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgY2xhc3MgbWFwcGVkIHRvIGZpZWxkIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnlbdHlwZV07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZmllbGQgdHlwZSBpZCBmb3IgYSBnaXZlbiBmaWVsZCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkZpZWxkfSBmaWVsZENsYXNzIEZpZWxkIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRmllbGQgdHlwZSBvZiB0aGUgZmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRDbGFzc1R5cGU6IGZ1bmN0aW9uKGZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgZm9yICh2YXIgdHlwZSBpbiB0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5Lmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID09PSBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGNvbm5lY3RvciB0eXBlcyB0byBjb25uZWN0b3IgY2xhc3MgaW1wbGVtZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RvckNsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgY29ubmVjdG9yIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBjQ29ubmVjdCB0eXBlCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3JDbGFzcyBDb25uZWN0b3IgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSwgY29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gY29ubmVjdG9yQ2xhc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgY29ubmVjdG9yIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBDb25uZWN0IHR5cGUuCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5Db25uZWN0b3J9IENvbm5lY3RvciBjbGFzcyBtYXBwZWQgdG8gY29ubmVjdCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldENvbm5lY3RvckNsYXNzOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RvckNsYXNzUmVnaXN0cnlbdHlwZV07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgZWFjaCBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gcmVwbGFjZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBTb3VyY2Ugc3RyaW5nIGJlaW5nIHJlcGxhY2VkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXBsYWNlIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcmVwbGFjaW5nLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB3aXRoX3RoaXMgUmVwbGFjZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXBsYWNlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgcmVwbGFjZUFsbDogZnVuY3Rpb24odGV4dCwgcmVwbGFjZSwgd2l0aF90aGlzKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChyZXBsYWNlLCAnZycpLCB3aXRoX3RoaXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCB3aXRoIGEgZ2l2ZW4gdGFnIG5hbWUsIGRvbS9zdHlsZSBhdHRyaWJ1dGVzIGFuZCBjbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0YWcgVGFnIG5hbWUuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gZG9tQXR0cmlidXRlcyBET00gYXR0cmlidXRlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzdHlsZUF0dHJpYnV0ZXMgU3R5bGUgYXR0cmlidXRlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBjbGFzc05hbWVzIENsYXNzIG5hbWVzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTmV3IGVsZW1lbnQgd2l0aCB0aGUgdGFnIG5hbWUgYW5kIGFsbCBvdGhlciBwcm92aWRlZCBhdHRyaWJ1dGVzLgogICAgICAgICAqLwogICAgICAgIGVsZW1lbnQ6IGZ1bmN0aW9uKHRhZywgZG9tQXR0cmlidXRlcywgc3R5bGVBdHRyaWJ1dGVzLCBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgIHZhciBlbCA9ICQoIjwiICsgdGFnICsgIi8+Iik7CgogICAgICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuYXR0cihkb21BdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3R5bGVBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBlbC5jc3Moc3R5bGVBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xhc3NOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgYSB0ZW1wbGF0ZSB3aXRoIGxpc3Qgb2YgcmVwbGFjZW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlIFRlbXBsYXRlIGJlaW5nIHByb2Nlc3NlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3Vic3RpdHV0aW9ucyBMaXN0IG9mIHN1YnN0aXR1dGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXBsYWNlZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50RnJvbVRlbXBsYXRlOiBmdW5jdGlvbih0ZW1wbGF0ZSwgc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICB2YXIgaHRtbCA9IHRlbXBsYXRlOwogICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBzdWJzdGl0dXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IEFscGFjYS5yZXBsYWNlQWxsKGh0bWwsICIkeyIgKyB4ICsgIn0iLCBzdWJzdGl0dXRpb25zW3hdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJChodG1sKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHVuaXF1ZSBhbHBhY2EgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFscGFjYS51bmlxdWVJZENvdW50ZXIrKzsKICAgICAgICAgICAgcmV0dXJuICJhbHBhY2EiICsgQWxwYWNhLnVuaXF1ZUlkQ291bnRlcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJvdmlkZSBZQUhPTyBsYXRlciBsaWtlIGNhcGFiaWxpdGllcy4KICAgICAgICAgKi8KICAgICAgICBsYXRlcjogZnVuY3Rpb24od2hlbiwgbywgZm4sIGRhdGEsIHBlcmlvZGljKSB7CiAgICAgICAgICAgIHdoZW4gPSB3aGVuIHx8IDA7CiAgICAgICAgICAgIG8gPSBvIHx8IHt9OwogICAgICAgICAgICB2YXIgbSA9IGZuLCBkID0gJC5tYWtlQXJyYXkoZGF0YSksIGYsIHI7CgogICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgbSA9IG9bZm5dOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIW0pIHsKICAgICAgICAgICAgICAgIC8vIFRocm93IGFuIGVycm9yIGFib3V0IHRoZSBtZXRob2QKICAgICAgICAgICAgICAgIHRocm93IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVHlwZUVycm9yJywKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4iCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbS5hcHBseShvLCBkKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHIgPSAocGVyaW9kaWMpID8gc2V0SW50ZXJ2YWwoZiwgd2hlbikgOiBzZXRUaW1lb3V0KGYsIHdoZW4pOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiByLAogICAgICAgICAgICAgICAgaW50ZXJ2YWw6IHBlcmlvZGljLAogICAgICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYW4gc3RyaW5nIGVuZHMgd2l0aCBhIGdpdmVuIHN1ZmZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWZmaXggU3VmZml4LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBlbmRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHN1ZmZpeCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHN1ZmZpeCwgdGV4dC5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYW4gc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gcHJlZml4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHN0cmluZyBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeCBQcmVmaXgKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBzdGFydHNXaXRoIDogZnVuY3Rpb24odGV4dCwgcHJlZml4KSB7CiAgICAgICAgICAgIC8vcmV0dXJuICh0ZXh0Lm1hdGNoKCJeIiArIHByZWZpeCkgPT0gcHJlZml4KTsKICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYSB2YXJpYWJsZSBpcyBhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBVUkksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VyaSA6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzU3RyaW5nKG9iaikgJiYgKEFscGFjYS5zdGFydHNXaXRoKG9iaiwgImh0dHA6Ly8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgImh0dHBzOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICIvIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICIuLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi4vIikpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGEgc3ViLWVsZW1lbnQgZnJvbSBhbiBvYmplY3QgdXNpbmcgYSBrZXlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBPYmplY3QgdG8gYmUgdHJhdmVyc2VkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGtleXMgRWl0aGVyIGFuIGFycmF5IG9mIHRva2VucyBvciBhIGRvdC1kZWxpbWl0ZWQgc3RyaW5nIChpLmUuICJkYXRhLnVzZXIuZmlyc3RuYW1lIikKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VicHJvcCBPcHRpb25hbCBzdWJwcm9wZXJ0eSB0byB0cmF2ZXJzZSAoaS5lLi4gImRhdGEucHJvcGVydGllcy51c2VyLnByb3BlcnRpZXMuZmlyc3RuYW1lIikKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFN1YiBlbGVtZW50IG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5IHBhdGgKICAgICAgICAgKi8KICAgICAgICB0cmF2ZXJzZU9iamVjdCA6IGZ1bmN0aW9uKG9iamVjdCwga2V5cywgc3VicHJvcCkgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGtleXMpKSB7CiAgICAgICAgICAgICAgICBrZXlzID0ga2V5cy5zcGxpdCgiLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZWxlbWVudCA9IG51bGw7CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gb2JqZWN0OwoKICAgICAgICAgICAgdmFyIGtleSA9IG51bGw7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGtleSA9IGtleXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIGlmIChzdWJwcm9wICYmIGtleSA9PT0gc3VicHJvcCkgewogICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY3VycmVudFtrZXldKSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAga2V5cyA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlIChrZXlzLmxlbmd0aCA+IDApOwoKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHVwb24gZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheQogICAgICAgICAqIFRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBiZWNvbWVzIHRoZSAidGhpcyIgdmFyaWFibGUgaW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gZGF0YSBFaXRoZXIgYW4gYXJyYXkgb3IgYW4gb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBGdW5jdGlvbiB0byBiZSBleGVjdXRlZC4KICAgICAgICAgKi8KICAgICAgICBlYWNoIDogZnVuY3Rpb24oZGF0YSwgZnVuYykgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoZGF0YVtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoZGF0YVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uIG9iajIgaW50byBvYmoxIHVzaW5nIGEgcmVjdXJzaXZlIGFwcHJvYWNoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajEgRGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyIFNvdXJjZSBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdmFsaWRLZXlGdW5jdGlvbiBGdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGluY2x1ZGUgYSBnaXZlbiBrZXkgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTWVyZ2VkIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBtZXJnZSA6IGZ1bmN0aW9uKG9iajEsIG9iajIsIHZhbGlkS2V5RnVuY3Rpb24pIHsKICAgICAgICAgICAgaWYgKCFvYmoxKSB7CiAgICAgICAgICAgICAgICBvYmoxID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iajIpIHsKICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkS2V5RnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkS2V5RnVuY3Rpb24oa2V5KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdChvYmoyW2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iajFba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gQWxwYWNhLm1lcmdlKG9iajFba2V5XSwgb2JqMltrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG9iajE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWVyZ2VzIGpzb24gInNvdXJjZSIgaW50byAidGFyZ2V0IiB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4gVGhlIG1lcmdlIHdpbGwgaW5jbHVkZSBlbXB0eSB2YWx1ZXMKICAgICAgICAgKiBvZiBvYmoyIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRhcmdldCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTWVyZ2VkIG9iamVjdAogICAgICAgICAqLwogICAgICAgIG1lcmdlT2JqZWN0IDogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKCiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0YXJnZXQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHNvdXJjZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm1lcmdlT2JqZWN0Mihzb3VyY2UsIHRhcmdldCk7CgogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH0sCgogICAgICAgIG1lcmdlT2JqZWN0MjogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNBcnJheSA9IEFscGFjYS5pc0FycmF5OwogICAgICAgICAgICB2YXIgaXNPYmplY3QgPSBBbHBhY2EuaXNPYmplY3Q7CiAgICAgICAgICAgIHZhciBpc1VuZGVmaW5lZCA9IEFscGFjYS5pc1VuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvcHlPZiA9IEFscGFjYS5jb3B5T2Y7CgogICAgICAgICAgICB2YXIgX21lcmdlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFycmF5IGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChjb3B5T2Yoc291cmNlW2luZGV4XSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIEFSUkFZCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdCh0YXJnZXQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2Ugb2JqZWN0IHByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHNvdXJjZSwgZnVuY3Rpb24oa2V5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHRhcmdldFtrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gY29weU9mKHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBfbWVyZ2Uoc291cmNlW2tleV0sIHRhcmdldFtrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgaXMgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IHRoYXQgaXNuJ3QgYW4gT0JKRUNUCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBhIHNjYWxhciwgYWx3YXlzIG92ZXJ3cml0ZQogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvcHlPZihzb3VyY2UpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBfbWVyZ2Uoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdWJzdGl0dXRlcyBhIHN0cmluZyB3aXRoIGEgbGlzdCBvZiB0b2tlbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGV4dCBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEBwYXJhbSBhcmdzIExpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgU3Vic3RpdHV0ZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHN1YnN0aXR1dGVUb2tlbnMgOiBmdW5jdGlvbih0ZXh0LCBhcmdzKSB7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRleHQpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAieyIgKyBpICsgIn0iOwoKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHRleHQuaW5kZXhPZih0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnQgPSB0ZXh0LnN1YnN0cmluZygwLCB4KSArIGFyZ3NbaV0gKyB0ZXh0LnN1YnN0cmluZyh4ICsgMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBudDsKICAgICAgICAgICAgICAgICAgICAgICAgLy90ZXh0ID0gQWxwYWNhLnJlcGxhY2VBbGwodGV4dCwgdG9rZW4sIGFyZ3NbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0d28gb2JqZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIEZpcnN0IG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTZWNvbmQgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdHdvIG9iamVjdHMgYXJlIHNhbWUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBjb21wYXJlT2JqZWN0IDogZnVuY3Rpb24ob2JqMSwgb2JqMikgewogICAgICAgICAgICByZXR1cm4gZXF1aXYob2JqMSwgb2JqMik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgY29udGVudCBvZiB0d28gYXJyYXlzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyXzEgRmlyc3QgYXJyYXkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyXzIgU2Vjb25kIGFycmF5LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBhcnJheXMgaGF2ZSBzYW1lIGNvbnRlbnQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBjb21wYXJlQXJyYXlDb250ZW50IDogZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICB2YXIgZXF1YWwgPSBhICYmIGIgJiYgKGEubGVuZ3RoID09PSBiLmxlbmd0aCk7CgogICAgICAgICAgICBpZiAoZXF1YWwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBhW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkodiwgYikgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBlcXVhbDsKICAgICAgICB9LAoKICAgICAgICB0ZXN0UmVnZXg6IGZ1bmN0aW9uKGV4cHJlc3Npb24sIHRleHRWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoZXhwcmVzc2lvbik7CgogICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh0ZXh0VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBoYXMgZW1wdHkgdmFsdWUgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbCBWYXJpYWJsZSB0byBiZSBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbiBpbiBhbnkgY291bnRzCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNWYWxFbXB0eSA6IGZ1bmN0aW9uKHZhbCwgaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICB2YXIgZW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCwgaW5jbHVkZUZ1bmN0aW9ucykpIHsKICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSAmJiB2YWwgPT09ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWwpICYmICQuaXNFbXB0eU9iamVjdCh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc051bWJlcih2YWwpICYmIGlzTmFOKHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbXB0eTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIGZpZWxkIGluc3RhbmNlIGFuZCBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIG5lZWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBDb250YWluZXIgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluaXRpYWxTZXR0aW5ncyBhbnkgYWRkaXRpb25hbCBzZXR0aW5ncyBwcm92aWRlZCB0byB0aGUgdG9wLWxldmVsIEFscGFjYSBvYmplY3QKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBSZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVuZGVyZWRDYWxsYmFjayBQb3N0LXJlbmRlciBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5jb25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IE5ldyBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKi8KICAgICAgICBpbml0OiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCByZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBDT01QSUxBVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgYW4gaW5saW5lIHZpZXcgb2JqZWN0LCB3ZSBhc3NpZ24gYW4gaWQgYW5kIHN0b3JlIG9udG8gdmlld3MgbWFwCiAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgZ2V0cyBjb21waWxlZCBhbG9uZyB3aXRoIHRoZSByZXN0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmlldykpIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3LmlkOwogICAgICAgICAgICAgICAgaWYgKCF2aWV3SWQpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LmlkID0gdGhpcy5nZW5lcmF0ZVZpZXdJZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gdmlldy5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpZXcucGFyZW50ID0gImJvb3RzdHJhcC1lZGl0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHZpZXcpOwogICAgICAgICAgICAgICAgdmlldyA9IHZpZXcuaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbXBpbGUgYWxsIG9mIHRoZSB2aWV3cyBhbmQgdGVtcGxhdGVzCiAgICAgICAgICAgIHRoaXMuY29tcGlsZShjb25uZWN0b3IsIGZ1bmN0aW9uKHJlcG9ydCkgewoKICAgICAgICAgICAgICAgIGlmIChyZXBvcnQuZXJyb3JzICYmIHJlcG9ydC5lcnJvcnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBvcnQuZXJyb3JzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHJlcG9ydC5lcnJvcnNbaV0udmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gcmVwb3J0LmVycm9yc1tpXS5jYWNoZUtleQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gcmVwb3J0LmVycm9yc1tpXS5lcnI7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICJUaGUgdGVtcGxhdGUgd2l0aCBjYWNoZSBrZXk6ICIgKyBjYWNoZUtleSArICIgZm9yIHZpZXc6ICIgKyB2aWV3SWQgKyAiIGZhaWxlZCB0byBjb21waWxlIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiLCBtZXNzYWdlOiAiICsgZXJyLm1lc3NhZ2U7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiLCBlcnI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcih0ZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLm5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi52aWV3c1t2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJWaWV3IGNvbXBpbGF0aW9uIGZhaWxlZCwgY2Fubm90IGluaXRpYWxpemUgQWxwYWNhLiAiICsgbWVzc2FnZXMuam9pbigiLCAiKSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5faW5pdChlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCByZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgUkVTT0xVVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgogICAgICAgICAgICAvLyBtYWtlIHNvbWUgaW50ZWxsaWdlbnQgZ3Vlc3NlcyBhYm91dCB3aGF0IHZpZXcgaWQgd2UgbWlnaHQgZGVmYXVsdCB0byBpbiBjYXNlIHRoZXkgd2FudCB0byB1c2UKICAgICAgICAgICAgLy8gYXV0by12aWV3IHNlbGVjdGlvbi4gIFdlIGRldGVjdCBqcXVlcnktdWksIGJvb3RzdHJhcCBhbmQganF1ZXJ5bW9iaWxlLiAgSWYgbm90aGluZyBjYW4gYmUgZGV0ZWN0ZWQsCiAgICAgICAgICAgIC8vIHdlIGZhbGwgYmFjayB0byBzdHJhaWdodCB3ZWIgdmlld3MuCiAgICAgICAgICAgIHZhciBmYWxsYmFja1VJICAgPSBBbHBhY2EuZGVmYXVsdFZpZXcgfHwgbnVsbDsKICAgICAgICAgICAgdmFyIGZhbGxiYWNrVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBkZXRlY3QgalF1ZXJ5IE1vYmlsZQogICAgICAgICAgICBpZiAoJC5tb2JpbGUgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5bW9iaWxlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IHR3aXR0ZXIgYm9vdHN0cmFwCiAgICAgICAgICAgIHZhciBib290c3RyYXBEZXRlY3RlZCA9ICh0eXBlb2YgJC5mbi5tb2RhbCA9PT0gJ2Z1bmN0aW9uJyk7CiAgICAgICAgICAgIGlmIChib290c3RyYXBEZXRlY3RlZCAmJiAhZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9ICJib290c3RyYXAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZXRlY3QganF1ZXJ5IHVpCiAgICAgICAgICAgIHZhciBqUXVlcnlVSURldGVjdGVkID0gKHR5cGVvZigkLnVpKSAhPT0gInVuZGVmaW5lZCIpOwogICAgICAgICAgICBpZiAoalF1ZXJ5VUlEZXRlY3RlZCAmJiAhZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9ICJqcXVlcnl1aSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmYWxsYmFja1VJKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJlZGl0IjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tUeXBlID0gImNyZWF0ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgcHJvdmlkZWQsIGJ1dCB0aGV5IHByb3ZpZGVkICJ1aSIgYW5kIG9wdGlvbmFsbHkgInR5cGUiLCB0aGVuIHdlIHRyeSB0byBhdXRvLXNlbGVjdCB0aGUgdmlldwogICAgICAgICAgICBpZiAoIXZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB1aSA9IGluaXRpYWxTZXR0aW5ncy51aTsKICAgICAgICAgICAgICAgIHZhciB0eXBlID0gaW5pdGlhbFNldHRpbmdzLnR5cGU7CgogICAgICAgICAgICAgICAgaWYgKCF1aSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9IEFscGFjYS5kZWZhdWx0VUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpID0gZmFsbGJhY2tVSTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHVpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBmYWxsYmFja1R5cGUgPyBmYWxsYmFja1R5cGUgOiAiZWRpdCI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgcHJvdmlkZWQgYnV0IGZvdW5kIHJlcXVlc3QgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gYXV0by1zZWxlY3QgYSB2aWV3CiAgICAgICAgICAgICAgICAgICAgdmlldyA9IHRoaXMubG9va3VwTm9ybWFsaXplZFZpZXcodWksIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRm91bmQgdmlldzogIiArIHZpZXcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiTm8gdmlldyBmb3VuZCBmb3IgVUk6ICIgKyB1aSArICIgYW5kIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgdmlldyBpcyBhIHN0cmluZyAodGhlIHZpZXcgaWQpIG9yIGl0IGlzIGVtcHR5L251bGwKCiAgICAgICAgICAgIC8vIGlmIHN0aWxsIG5vIHZpZXcsIHRoZW4gZGVmYXVsdCBmYWxsYmFjayB0byBvdXIgZGV0ZWN0ZWQgdmlldyBvciB0aGUgZGVmYXVsdAogICAgICAgICAgICBpZiAoIXZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQSB2aWV3IHdhcyBub3Qgc3BlY2lmaWVkIGFuZCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVidWdnaW5nOiBpZiB0aGUgdmlldyBpc24ndCBhdmFpbGFibGUsIHdlIHdhbnQgdG8gcmVwb3J0IGl0IHJpZ2h0IGF3YXkKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vcm1hbGl6ZWRWaWV3c1t2aWV3XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVGhlIGRlc2lyZWQgdmlldzogIiArIHZpZXcgKyAiIGNvdWxkIG5vdCBiZSBsb2FkZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGxvYWRlZCBhbmQgbm90IG1pc3NwZWxsZWQuIiwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBGSUVMRCBJTlNUQU5USUFUSU9OCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAgICAgLy8gVEVTVCAtIHN3YXAgY29kZQogICAgICAgICAgICAgICAgLy8gc3dhcCBlbCAtPiBwbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgLy92YXIgdGVtcEhvbGRlciA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLmJlZm9yZSh0ZW1wSG9sZGVyKTsKICAgICAgICAgICAgICAgIC8vJChlbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gQWxwYWNhLmNyZWF0ZUZpZWxkSW5zdGFuY2UoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGZpZWxkIHdoaWxlIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtcmVuZGVyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuYWRkQ2xhc3MoImFscGFjYS1oaWRkZW4iKTsKCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2ZpZWxkLmdldElkKCldID0gZmllbGQ7CgogICAgICAgICAgICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgbG9va2luZyB1cCBmaWVsZCBpbnN0YW5jZXMgYnkgaWQKICAgICAgICAgICAgICAgICAgICBmaWVsZC5hbGxGaWVsZEluc3RhbmNlcyA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZmllbGRJbnN0YW5jZXM7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgY2FsbGJhY2tzIGRlZmluZWQgdGhyb3VnaCB2aWV3CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZpZWxkLnZpZXcucmVuZGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkocmVuZGVyZWRDYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayA9IGZpZWxkLnZpZXcucG9zdFJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBmaW4gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB3ZSBhcHBseSBzb21lIGFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLSIgKyBzZWxmLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXcpLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB3ZSBtYXJrIGFzIHRvcAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtdG9wIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBhbHBhY2EgZmllbGQsIHRoZW4gd2UgY2FsbCBmb3IgdmFsaWRhdGlvbiBzdGF0ZSB0byBiZSByZWNhbGN1bGF0ZWQgYWNyb3NzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBjaGlsZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIGNhbGwgdG8gdXBkYXRlIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gc3VzcGVuZCBpbml0aWFsIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgdG8gZmFsc2UgZm9yIGZpZWxkIGFuZCBhbGwgY2hpbGRyZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC52aWV3LnR5cGUgIT09ICd2aWV3JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oZmllbGQsIGZ1bmN0aW9uKGZpZWxkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gZmFsc2UgYWZ0ZXIgZmlyc3QgdmFsaWRhdGlvbiAoZXZlbiBpZiBpbiBDUkVBVEUgbW9kZSwgd2Ugb25seSBmb3JjZSBpbml0IHZhbGlkYXRpb24gZXJyb3IgZmFsc2Ugb24gZmlyc3QgcmVuZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvciA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVEVTVCAtIHN3YXAgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FwIHBsYWNlaG9sZGVyIC0+IGVsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0ZW1wSG9sZGVyKS5iZWZvcmUoZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlYWwgZmllbGQgYWZ0ZXIgcmVuZGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtcmVuZGVyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBmaWVsZCB0aGF0IG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAsIGRvIHNvIG5vdwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuX29sZEZpZWxkRWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmllbGQuX29sZEZpZWxkRWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZmllbGQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZpZWxkLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVuZGVyZWRDYWxsYmFjayA9IHJlbmRlcmVkQ2FsbGJhY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgY2FuIGJlIG51bGwgaWYgYW4gZXJyb3Igd2FzIHRocm93biBvciBpZiBhIHZpZXcgd2Fzbid0IGZvdW5kCiAgICAgICAgICAgIC8vIEFjdHVhbGx5IGl0J2QgYWx3YXlzIGJlIHVuZGVmaW5lZCBiZWNhdXNlIGZpZWxkIGlzIGluIGFub3RoZXIgc2NvcGUuCiAgICAgICAgICAgIC8vIHJldHVybiBmaWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGVsIFRoZSBkb20gZWxlbWVudCB0byBhY3QgYXMgdGhlIGNvbnRhaW5lciBvZiB0aGUgY29uc3RydWN0ZWQgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIGRhdGEgdG8gYmUgYm91bmQgaW50byB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIFRoZSBzY2hlbWEgZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgVGhlIHZpZXcgZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5jb25uZWN0b3J9IGNvbm5lY3RvciBUaGUgZmllbGQgY29ubmVjdG9yIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlRmllbGRJbnN0YW5jZSA6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG9wdGlvbnMgYW5kIHNjaGVtYSBhcmUgbm90IGVtcHR5CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eShvcHRpb25zLCB0cnVlKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eShzY2hlbWEsIHRydWUpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3B0aW9ucyBjYW4gYmUgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGZpZWxkIHRvIGNvbnN0cnVjdCAoaS5lLiAidGV4dCIpCiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIEFscGFjYS5pc1N0cmluZyhvcHRpb25zKSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSBmaWVsZFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIG5vdGhpbmcgcGFzc2VkIGluLCB3ZSBjYW4gdHJ5IHRvIG1ha2UgYSBndWVzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBkYXRhCiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSBBbHBhY2EuZ2V0U2NoZW1hVHlwZShkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBBbHBhY2EuaXNBcnJheShkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEudHlwZSA9ICJhcnJheSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEudHlwZSA9ICJvYmplY3QiOyAvLyBmYWxsYmFjawogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB1c2luZyB3aGF0IHdlIG5vdyBhYm91dCBzY2hlbWEsIHRyeSB0byBndWVzcyB0aGUgdHlwZQogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gQWxwYWNhLmd1ZXNzT3B0aW9uc1R5cGUoc2NoZW1hKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmaW5kIHRoZSBmaWVsZCBjbGFzcyByZWdpc3RlcmVkIGZvciB0aGlzIGZpZWxkIHR5cGUKICAgICAgICAgICAgdmFyIEZpZWxkQ2xhc3MgPSBBbHBhY2EuZ2V0RmllbGRDbGFzcyhvcHRpb25zLnR5cGUpOwogICAgICAgICAgICBpZiAoIUZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGZpbmQgZmllbGQgY2xhc3MgZm9yIHR5cGU6ICIgKyBvcHRpb25zLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJGSUVMRF9JTlNUQU5USUFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGRhdGEsIGJpbmQgaXQgaW4KICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENsYXNzKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBmb3JtZXIgalF1ZXJ5IDEuOC4zIHBhcnNlSlNPTiBmdW5jdGlvbiAodGhpcyB3YXMgY2hhbmdlZAogICAgICAgICAqIGZvciBqUXVlcnkgMS45LjAgYW5kIGludHJvZHVjZXMgYWxsIGtpbmRzIG9mIGlzc3VlcykuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGV4dAogICAgICAgICAqLwogICAgICAgIHBhcnNlSlNPTjogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTih0ZXh0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyBhbGwgb2YgdGhlIHZpZXdzLCBub3JtYWxpemluZyB0aGVtIGZvciB1c2UgYnkgQWxwYWNhLgogICAgICAgICAqIEFsc28gY29tcGlsZXMgYW55IHRlbXBsYXRlcyB0aGF0IHRoZSB2aWV3cyBtYXkgcmVmZXJlbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbm5lY3RvciB0aGUgY29ubmVjdG9yCiAgICAgICAgICogQHBhcmFtIGNiIHRoZSBjYWxsYmFjayB0aGF0IGdldHMgZmlyZWQgb25jZSBjb21waWxhdGlvbiBoYXMgZW5kZWQKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBmaXJlZCBpZiB0aGUgY29tcGlsZSBmYWlscyBmb3IgYW55IHJlYXNvbgogICAgICAgICAqLwogICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGNvbm5lY3RvciwgY2IsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB2YXIgdDEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCiAgICAgICAgICAgIHZhciByZXBvcnQgPSB7CiAgICAgICAgICAgICAgICAiZXJyb3JzIjogW10sCiAgICAgICAgICAgICAgICAiY291bnQiOiAwLAogICAgICAgICAgICAgICAgInN1Y2Nlc3NDb3VudCI6IDAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaW5hbENhbGxiYWNrID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2YXIgdDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDb21waWxhdGlvbiBFeGl0ZWQgd2l0aCAiICsgcmVwb3J0LmVycm9ycy5sZW5ndGggKyAiIGVycm9ycyBpbjogIiArICh0Mi10MSkrICIgbXMiKTsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycy5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcyEKCiAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdXIgdmlld3MgaW50byB0aGUgbm9ybWFsaXplZCBzZXQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzW2tdID0gbm9ybWFsaXplZFZpZXdzW2tdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYihyZXBvcnQpOwogICAgICAgICAgICB9OwoKCgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVklFVyBURU1QTEFURSBDT01QSUxBVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIC8vIGZvciBhbGwgb2YgdGhlIHZpZXdzICh0aGUgb3JpZ2luYWwgb25lcywgbm90IHRoZSBjb21waWxlZCBvbmVzKSwgd2FsayB0aHJvdWdoIHRoZW0gYW5kIGZpbmQgYW55CiAgICAgICAgICAgIC8vIGFuZCBhbGwgdGVtcGxhdGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZCwgY29tcGlsZSB0aGVtLCBldGMuCgogICAgICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZpcmVkIHdoZW4gYSBjb21waWxhdGlvbiBlaXRoZXIgZmFpbHMgb3Igc3VjY2VlZHMKICAgICAgICAgICAgLy8gaWYgaXQgZmFpbHMsIGVyciBpcyBzZXQsIG90aGVyd2lzZSBjYWNoZUtleSBoYXMgdGhlCiAgICAgICAgICAgIHZhciB2aWV3Q29tcGlsZUNhbGxiYWNrID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKCiAgICAgICAgICAgICAgICByZXBvcnQuY291bnQrKzsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LmVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiB2aWV3SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IGNhY2hlS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyIjogZXJyCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LnN1Y2Nlc3NDb3VudCsrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChyZXBvcnQuY291bnQgPT0gdG90YWxDYWxscykgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluYWxDYWxsYmFjayhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNvbXBpbGVWaWV3VGVtcGxhdGUgPSBmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkKTsKCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaGFuZGxlYmFycyBhcyB0aGUgZW5naW5lIHdlJ2xsIHVzZQogICAgICAgICAgICAgICAgdmFyIGVuZ2luZVR5cGUgPSAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiOwoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhlIHRlbXBsYXRlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gb2JqZWN0IHRvIGV4cGxpY2l0bHkgZGVmaW5lIHRoZSB0eXBlIG9mIGVuZ2luZSB0byB1c2UuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSAmJiBBbHBhY2EuaXNPYmplY3QodGVtcGxhdGUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSB0ZW1wbGF0ZS50eXBlOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcHJlY29tcGlsZWQgdGVtcGxhdGUsIHN3YXAgY2FjaGUga2V5cwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5jYWNoZUtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSA9IHRlbXBsYXRlLmNhY2hlS2V5OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIElmIHRlbXBsYXRlIGlzIGEgc3RyaW5nLCB0aGVuIGl0IGlzIGVpdGhlciBzb21lIHRleHQgdGhhdCB3ZSBjYW4gdHJlYXQgYXMgYSB0ZW1wbGF0ZSBvciBpdCBpcwogICAgICAgICAgICAgICAgICogYSBVUkwgdGhhdCB3ZSBzaG91bGQgZHluYW1pY2FsbHkgbG9hZCBhbmQgdHJlYXQgdGhlIHJlc3VsdCBhcyBhIHRlbXBsYXRlLiAgSXQgbWF5IGFsc28gYmUgYQogICAgICAgICAgICAgICAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gbG9jYXRlIHNvbWV0aGluZyB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgd2Ugc2hvdWxkIGxvYWQgdGV4dCBmcm9tLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgdHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVcmkoeCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhpcyBpcyBhIFVSTCBhbmQgbGV0IHRoZSB0ZW1wbGF0ZSBlbmdpbmUgZGVhbCB3aXRoIGl0CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlICYmICgodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwKSB8fCAodGVtcGxhdGUuaW5kZXhPZigiLiIpID09PSAwKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBqUXVlcnkgc2VsZWN0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21FbCA9ICQodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lVHlwZSA9ICQoZG9tRWwpLmF0dHIoInR5cGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAkKGRvbUVsKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgcmVmZXJlbmNlZCBieSB0ZW1wbGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1RlbXBsYXRlID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBleGlzdGluZ1RlbXBsYXRlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZW5naW5lIHR5cGUgaGVyZSwgdGhyb3cKICAgICAgICAgICAgICAgIGlmICghZW5naW5lVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkVuZ2luZSB0eXBlIHdhcyBlbXB0eSIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb29rIHVwIHRoZSBlbmdpbmUKICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICAgICAgaWYgKCFlbmdpbmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgZm9yIHR5cGU6ICIgKyB0eXBlKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGVtcGxhdGUgPT09IHRydWUsIHRoZW4gdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGVtcGxhdGUgaXMgcHJlLWNvbXBpbGVkLgogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlID09PSB0cnVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUuaXNDYWNoZWQoY2FjaGVLZXkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGdvb2QKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG51bGwsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1aCBvaCwgY2xhaW1zIHRvIGJlIHByZWNvbXBpbGVkLCBidXQgdGhlIHRlbXBsYXRpbmcgZW5naW5lIGRvZXNuJ3Qga25vdyBhYm91dCBpdAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyaW5nID0gIlZpZXcgY29uZmlndXJhdGlvbiBmb3IgdmlldzogIiArIHZpZXcuaWQgKyAiIGNsYWltcyB0byBoYXZlIHByZWNvbXBpbGVkIHRlbXBsYXRlIGZvciBjYWNoZUtleTogIiArIGNhY2hlS2V5ICsgIiBidXQgaXQgY291bGQgbm90IGJlIGZvdW5kIjsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKGVyclN0cmluZyk7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgbmV3IEVycm9yKGVyclN0cmluZyksIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZW5naW5lIGFscmVhZHkgaGFzIHRoaXMgY2FjaGVkCiAgICAgICAgICAgICAgICAvLyB0aGlzIG1pZ2h0IGJlIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiBzdGVwCiAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBpbGVkLCBzbyBza2lwCiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG51bGwsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgICAgIGVuZ2luZS5jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgY29ubmVjdG9yLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVGVtcGxhdGVzID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG5vcm1hbGl6ZWQgdmlld3MgdGhhdCB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCBjb21waWxlIHRoZSB0ZW1wbGF0ZXMgd2l0aGluCiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25BcnJheSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwoKICAgICAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlSWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJ2aWV3Iiwgdmlldy5pZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgbGV2ZWwgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcGF0aCBpbiB2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImZpZWxkIiwgcGF0aCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGxheW91dCB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmxheW91dCAmJiB2aWV3LmxheW91dC50ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcubGF5b3V0LnRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAibGF5b3V0IiwgImxheW91dCIsICJsYXlvdXRUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5nbG9iYWxUZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcuZ2xvYmFsVGVtcGxhdGU7CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJnbG9iYWwiLCAiZ2xvYmFsIiwgImdsb2JhbFRlbXBsYXRlIiwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbm93IGludm9rZSBhbGwgb2YgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgLy8gdGhpcyB0ZWxscyBlYWNoIHRlbXBsYXRlIHRvIGNvbXBpbGUKICAgICAgICAgICAgICAgIHZhciB0b3RhbENhbGxzID0gZnVuY3Rpb25BcnJheS5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheVtpXSh0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBub3JtYWxpemVWaWV3cyA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhlIHZpZXdzIHRoYXQgd2UncmUgZ29pbmcgdG8gbm9ybWFsaXplCiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXdzID0ge307CiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXdDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgLy8gc29tZSBpbml0aWFsIHNlbGYtYXNzdXJhbmNlIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBub3JtYWxpemVkVmlld3MgbWFwIHNldCB1cAogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVkVmlld3MgPSBBbHBhY2Eubm9ybWFsaXplZFZpZXdzOwoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBhbGwgb2Ygb3VyIHZpZXdzCiAgICAgICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gc2VsZi52aWV3cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmlldyBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQgb24gdGhlIEFscGFjYSBnbG9iYWwsIHdlIGRvIG5vdCBib3RoZXIKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5ub3JtYWxpemVkVmlld3Nbdmlld0lkXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkVmlldyA9IG5ldyBBbHBhY2EuTm9ybWFsaXplZFZpZXcodmlld0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lm5vcm1hbGl6ZShzZWxmLnZpZXdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0gPSBub3JtYWxpemVkVmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBub3JtYWxpemF0aW9uIGZhaWxlZCwgY2Fubm90IGluaXRpYWxpemUgQWxwYWNhLiAgUGxlYXNlIGNoZWNrIHRoZSBlcnJvciBsb2dzLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlld0NvdW50ID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21waWxlVGVtcGxhdGVzKG5vcm1hbGl6ZWRWaWV3cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluYWxDYWxsYmFjayhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbm9ybWFsaXplVmlld3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb29rcyB1cCB0aGUgcHJvcGVyIHRlbXBsYXRlIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGEgcmVxdWVzdGVkIHRlbXBsYXRlIGlkIGZvciBhIHZpZXcgYW5kIGEgZmllbGQuCiAgICAgICAgICogUGVyZm9ybXMgYW4gb3ZlcnJpZGUgbG9va3VwIHRvIGZpbmQgdGhlIHByb3BlciB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEhhbmRzIGJhY2sgYSBkZXNjcmlwdG9yIG9mIGV2ZXJ5dGhpbmcgdGhhdCBpcyBrbm93biBhYm91dCB0aGUgcmVzb2x2ZWQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlldwogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUlkCiAgICAgICAgICogQHBhcmFtIGZpZWxkCiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odmlldywgdGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IG51bGw7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBGSUdVUkUgT1VUIFdIRVJFIFRIRSBURU1QTEFURSBJUyBJTiBUSEUgVklFVyBDT05GSUdVUkFUSU9OIChSRVNQRUNUSU5HIEZJRUxEIE9WRVJSSURFUykKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIHZhciBfZW5naW5lSWQgPSBudWxsOwogICAgICAgICAgICB2YXIgX2NhY2hlS2V5ID0gbnVsbDsKCiAgICAgICAgICAgIC8vIGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgdmlldyBsZXZlbD8KICAgICAgICAgICAgaWYgKHZpZXcudGVtcGxhdGVzICYmIHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlSWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJ2aWV3Iiwgdmlldy5pZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gaXMgdGhpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlPwogICAgICAgICAgICAgICAgdmFyIHQgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodCkgJiYgdC5jYWNoZUtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSB0LmNhY2hlS2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBvdmVycmlkZGVuIGF0IHRoZSBmaWVsZCBsZXZlbD8KICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoID0gZmllbGQucGF0aDsKCiAgICAgICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyB0cnkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgLy8gY29tYmluYXRpb25zIG9mIHBlcm11dGF0ZWQgYW5kIGdlbmVyYWxpemVkIGxvb2t1cHMgdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgYmVzdCBmaXQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCBpZiB0aGV5IHBhdGggaXM6IC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gbG9vayBmb3IgdGhlIGZvbGxvd2luZyBnZW5lcmFsaXplZCBwZXJtdXRhdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBhcHBsaWNhYmlsaXR5OgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0WzFdL3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3Qvc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZC90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgcGF0aC5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxlY3RNYXRjaGVzID0gZnVuY3Rpb24odG9rZW5zLCBpbmRleCwgbWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGFycmF5LCB3ZSdyZSBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdG9rZW5zLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VG9rZW5zID0gdG9rZW5zLnNsaWNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhcnJheSBpbiB0aGUgcGF0aCBhdCB0aGlzIGVsZW1lbnQsIHVwZGF0ZSBuZXdUb2tlbnMgdG8gcmVmbGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvZ2dsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeDEgPSB0b2tlbi5pbmRleE9mKCJbIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeDEgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cmluZygwLCB4MSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUb2tlbnNbaW5kZXhdID0gdG9rZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgbWF0Y2ggZm9yIHRoaXMgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXRoID0gbmV3VG9rZW5zLmpvaW4oIi8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5maWVsZHNbX3BhdGhdICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXMgJiYgdmlldy5maWVsZHNbX3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2NrID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBfcGF0aCwgdGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6IF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZWVkIGRvd24gdGhlIHRva2VuIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyh0b2tlbnMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgdG9nZ2xlZCwgcHJvY2VlZCB3aXRoIHRoYXQgYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyhuZXdUb2tlbnMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gcGF0aC5zcGxpdCgiLyIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyh0b2tlbnMsIDAsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gbWF0Y2hlc1swXS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMgJiYgdmlldy5maWVsZHNbcGF0aF0gJiYgdmlldy5maWVsZHNbcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsVGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJnbG9iYWwiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJnbG9iYWwiLCAiZ2xvYmFsIiwgImdsb2JhbFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGxheW91dCBsZXZlbD8KICAgICAgICAgICAgaWYgKHRlbXBsYXRlSWQgPT09ICJsYXlvdXRUZW1wbGF0ZSIgfHwgdGVtcGxhdGVJZCA9PT0gImxheW91dCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKF9jYWNoZUtleSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aGljaCBlbmdpbmUgaGFzIHRoaXMKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZHMgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5pZHMoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5naW5lSWRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZCA9IGVuZ2luZUlkc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUuaXNDYWNoZWQoX2NhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lbmdpbmVJZCA9IGVuZ2luZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKF9lbmdpbmVJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZW5naW5lIjogX2VuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBfY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlcyBhIHRlbXBsYXRlIGFuZCByZXR1cm5zIGEgRE9NIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVEZXNjcmlwdG9yCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICovCiAgICAgICAgdG1wbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBodG1sID0gQWxwYWNhLnRtcGxIdG1sKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5zYWZlRG9tUGFyc2UoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBIVE1MLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGxIdG1sOiBmdW5jdGlvbih0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFtb2RlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbW9kZWwgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZ2luZVR5cGUgPSB0ZW1wbGF0ZURlc2NyaXB0b3IuZW5naW5lOwoKICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lVHlwZSk7CiAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgZm9yIHR5cGU6ICIgKyBlbmdpbmVUeXBlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGVtcGxhdGVEZXNjcmlwdG9yLmNhY2hlS2V5OwogICAgICAgICAgICB2YXIgaHRtbCA9IGVuZ2luZS5leGVjdXRlKGNhY2hlS2V5LCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgdmFyIHN0ciA9IEpTT04uc3RyaW5naWZ5KGVycik7CiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICBzdHIgPSBlcnIubWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlRoZSBjb21waWxlZCB0ZW1wbGF0ZTogIiArIGNhY2hlS2V5ICsgIiBmYWlsZWQgdG8gZXhlY3V0ZTogIiArIHN0cik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfQoKICAgIH0pOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gTE9HR0VSCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5ERUJVRyA9IDA7CiAgICBBbHBhY2EuSU5GTyA9IDE7CiAgICBBbHBhY2EuV0FSTiA9IDI7CiAgICBBbHBhY2EuRVJST1IgPSAzOwoKICAgIC8vIGJ5IGRlZmF1bHQsIGxvZ2dpbmcgb25seSBzaG93cyB3YXJuaW5ncyBhbmQgYWJvdmUKICAgIC8vIHRvIGRlYnVnLCBzZXQgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLkRFQlVHCiAgICBBbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuV0FSTjsKCiAgICBBbHBhY2EubG9nRGVidWcgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5ERUJVRywgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nSW5mbyA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIEFscGFjYS5sb2coQWxwYWNhLklORk8sIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ1dhcm4gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5XQVJOLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dFcnJvciA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIEFscGFjYS5sb2coQWxwYWNhLkVSUk9SLCBvYmopOwogICAgfTsKCiAgICBBbHBhY2EuTE9HX01FVEhPRF9NQVAgPSB7CiAgICAgICAgMDogJ2RlYnVnJywKICAgICAgICAxOiAnaW5mbycsCiAgICAgICAgMjogJ3dhcm4nLAogICAgICAgIDM6ICdlcnJvcicKICAgIH07CgogICAgQWxwYWNhLmxvZyA9IGZ1bmN0aW9uKGxldmVsLCBvYmopIHsKCiAgICAgICAgaWYgKEFscGFjYS5sb2dMZXZlbCA8PSBsZXZlbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtZXRob2QgPSBBbHBhY2EuTE9HX01FVEhPRF9NQVBbbGV2ZWxdOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlW21ldGhvZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgiZGVidWciID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiaW5mbyIgPT09IG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIndhcm4iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJlcnJvciIgPT09IG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Iob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5jaGVja2VkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJjaGVja2VkIiwgdmFsdWUpOwogICAgfTsKCiAgICBBbHBhY2EuZGlzYWJsZWQgPSBmdW5jdGlvbihlbCwgdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIEFscGFjYS5hdHRyUHJvcChlbCwgImRpc2FibGVkIiwgdmFsdWUpOwogICAgfTsKCiAgICBBbHBhY2EuYXR0clByb3AgPSBmdW5jdGlvbihlbCwgbmFtZSwgdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgLy8galF1ZXJ5IDEuNisKICAgICAgICAgICAgaWYgKCQoZWwpLnByb3ApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLnByb3AobmFtZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuYXR0cihuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUF0dHIobmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIG5vdyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUKCiAgICAgICAgLy8galF1ZXJ5IDEuNisKICAgICAgICBpZiAoJChlbCkucHJvcCkgewogICAgICAgICAgICByZXR1cm4gJChlbCkucHJvcChuYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkKGVsKS5hdHRyKG5hbWUpOwogICAgfTsKCiAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnMgPSBmdW5jdGlvbih0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgY2FsbGJhY2spCiAgICB7CiAgICAgICAgdmFyIGZucyA9IFtdOwoKICAgICAgICAvLyBob2xkcyByZXNvbHV0aW9uIGluZm9ybWF0aW9uCiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB7fTsKCiAgICAgICAgLy8gc2NoZW1hIGxvYWRpbmcgZnVuY3Rpb24KICAgICAgICB2YXIgZm4xID0gZnVuY3Rpb24oc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihkb25lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYVJlZmVyZW5jZUlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYVJlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5zY2hlbWEgPSBzY2hlbWE7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYVJlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUmVmZXJlbmNlSWQgPSBzY2hlbWFSZWZlcmVuY2VJZC5zdWJzdHJpbmcoMik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0IGludG8gdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNjaGVtYVJlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZTY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2hlbWEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZlNjaGVtYVt0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlNjaGVtYSA9IGRlZlNjaGVtYVt0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmU2NoZW1hLnByb3BlcnRpZXMgJiYgZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEucHJvcGVydGllc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmU2NoZW1hLmRlZmluaXRpb25zICYmIGRlZlNjaGVtYS5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlNjaGVtYSA9IGRlZlNjaGVtYS5kZWZpbml0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gZGVmU2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHdpdGggb3Igd2l0aG91dCBhICIjIiBpbiBpdCB0byBwb2ludCB0byBhIHNwZWNpZmljIGxvY2F0aW9uIGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzY2hlbWEKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVBhcnRzID0gQWxwYWNhLnBhdGhQYXJ0cyhzY2hlbWFSZWZlcmVuY2VJZCk7CgogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkLmNvbm5lY3Rvci5sb2FkUmVmZXJlbmNlU2NoZW1hKHJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChzY2hlbWEpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VQYXJ0cy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkU2NoZW1hID0gQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2Uoc2NoZW1hLCByZWZlcmVuY2VQYXJ0cy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5zY2hlbWEgPSByZXNvbHZlZFNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMSh0b3BGaWVsZC5zY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkLCByZXNvbHV0aW9uKSk7CgogICAgICAgIHZhciBmbjIgPSBmdW5jdGlvbihvcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zUmVmZXJlbmNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zUmVmZXJlbmNlSWQgPT09ICIjIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zUmVmZXJlbmNlSWQuaW5kZXhPZigiIy8iKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcHJvcGVydHkgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBzY2hlbWEKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBvcHRpb25zUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBvcHRpb25zUmVmZXJlbmNlSWQuc3BsaXQoIi8iKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZk9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmT3B0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZPcHRpb25zLmZpZWxkcyAmJiBkZWZPcHRpb25zLmZpZWxkc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmZpZWxkc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5kZWZpbml0aW9ucyAmJiBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmT3B0aW9ucyA9IGRlZk9wdGlvbnMuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmT3B0aW9ucyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gZGVmT3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBJRCBvZiBhIG5vZGUgaW4gdGhlIGN1cnJlbnQgc2NoZW1hIGRvY3VtZW50CgogICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhlIGN1cnJlbnQgZG9jdW1lbnQgc2NoZW1hIHVudGlsIHdlIGZpbmQgdGhlIHJlZmVyZW5jZWQgbm9kZSAodXNpbmcgaWQgcHJvcGVydHkpCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShvcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZE9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHdpdGggb3Igd2l0aG91dCBhICIjIiBpbiBpdCB0byBwb2ludCB0byBhIHNwZWNpZmljIGxvY2F0aW9uIGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzY2hlbWEKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvblJlZmVyZW5jZVBhcnRzID0gQWxwYWNhLnBhdGhQYXJ0cyhvcHRpb25zUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZU9wdGlvbnMob3B0aW9uUmVmZXJlbmNlUGFydHMucGF0aCwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25SZWZlcmVuY2VQYXJ0cy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShvcHRpb25zLCBvcHRpb25SZWZlcmVuY2VQYXJ0cy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IHJlc29sdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgZm5zLnB1c2goZm4yKHRvcEZpZWxkLm9wdGlvbnMsIG9wdGlvbnNSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICAvLyBydW4gbG9hZHMgaW4gcGFyYWxsZWwKICAgICAgICBBbHBhY2EucGFyYWxsZWwoZm5zLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2socmVzb2x1dGlvbi5zY2hlbWEsIHJlc29sdXRpb24ub3B0aW9ucyk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIEFscGFjYS5ERUZBVUxUX0VSUk9SX0NBTExCQUNLID0gZnVuY3Rpb24oZXJyb3IpCiAgICB7CiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2cgdG8gZGVidWcKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7CgogICAgICAgICAgICAvLyBlcnJvciBvdXQKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbHBhY2EgY2F1Z2h0IGFuIGVycm9yIHdpdGggdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcjogIiArIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7CgogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGVycm9yIGNhbGxiYWNrIGhhbmRsZXIgZm9yIEFscGFjYS4KICAgICAqCiAgICAgKiBUaGlzIGVycm9yIGhhbmRsZXIgd2lsbCBiZSB1c2VkIGlmIGFuICJlcnJvciIgYXJndW1lbnQgaXNuJ3QgcGFzc2VkIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgYW4gQWxwYWNhIGZpZWxkLgogICAgICoKICAgICAqIEBwYXJhbSBlcnJvcgogICAgICovCiAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2sgPSBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSzsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGEgZ2VuZXJhbCBlcnJvciBhbmQgZGlzcGF0Y2hlcyB0byB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyLgogICAgICoKICAgICAqIEBwYXJhbSBtZXNzYWdlCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpCiAgICB7CiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgQWxwYWNhLmlzT2JqZWN0KG1lc3NhZ2UpKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGVyciA9IHsKICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlCiAgICAgICAgfTsKCiAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICB9OwoKICAgIC8qKgogICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCB0aHJvd3MgYW4gZXJyb3IgYmFjayB0byB0aGUgZ2l2ZW4gY2FsbGJhY2sgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAqLwogICAgQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2sgPSBmdW5jdGlvbihtZXNzYWdlLCBlcnJvckNhbGxiYWNrKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIGlmIChlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYSBzY2hlbWEgcGF0aCByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIHN1Yi1zY2hlbWEuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtYQogICAgICogQHBhcmFtIHJlZmVyZW5jZUlkCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2UgPSBmdW5jdGlvbihzY2hlbWEsIHJlZmVyZW5jZUlkKQogICAgewogICAgICAgIGlmICgoc2NoZW1hLmlkID09PSByZWZlcmVuY2VJZCkgfHwgKCgiIyIgKyBzY2hlbWEuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2NoZW1hLml0ZW1zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5pdGVtczsKCiAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2Uoc3ViU2NoZW1hLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHJlZmVyZW5jZUlkKQogICAgewogICAgICAgIGlmICgob3B0aW9ucy5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgb3B0aW9ucy5pZCkgPT09IHJlZmVyZW5jZUlkKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmZpZWxkcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGZpZWxkSWQgaW4gb3B0aW9ucy5maWVsZHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gb3B0aW9ucy5maWVsZHNbZmllbGRJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uoc3ViT3B0aW9ucywgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gb3B0aW9ucy5pdGVtczsKCiAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgJC5hbHBhY2EgPSB3aW5kb3cuQWxwYWNhID0gQWxwYWNhOwoKICAgIC8qKgogICAgICogalF1ZXJ5IGZyaWVuZGx5IG1ldGhvZCBmb3IgYmluZGluZyBhIGZpZWxkIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgICQuZm4uYWxwYWNhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CgogICAgICAgIC8vIGFwcGVuZCB0aGlzIGludG8gdGhlIGZyb250IG9mIGFyZ3MKICAgICAgICB2YXIgbmV3QXJncyA9IFtdLmNvbmNhdCh0aGlzLCBhcmdzKTsKCiAgICAgICAgLy8gaW52b2tlIEFscGFjYSBhZ2FpbnN0IGN1cnJlbnQgZWxlbWVudAogICAgICAgIHZhciByZXQgPSBBbHBhY2EuYXBwbHkodGhpcywgbmV3QXJncyk7CiAgICAgICAgaWYgKHR5cGVvZihyZXQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAvLyBhcyBwZXIgalF1ZXJ5J3MgcGF0dGVybiwgYXNzdW1lIHdlIGhhbmQgYmFjayAkZWwKICAgICAgICAgICAgcmV0ID0gJCh0aGlzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9OwoKICAgIC8qKgogICAgICogQGlnbm9yZQogICAgICogQHBhcmFtIG5vY2xvbmluZwogICAgICovCiAgICAkLmZuLm91dGVySFRNTCA9IGZ1bmN0aW9uKG5vY2xvbmluZykgewogICAgICAgIGlmIChub2Nsb25pbmcpIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMpLmh0bWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJCgiPGRpdj48L2Rpdj4iKS5hcHBlbmQodGhpcy5jbG9uZSgpKS5odG1sKCk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSB0bwogICAgICovCiAgICAkLmZuLnN3YXBXaXRoID0gZnVuY3Rpb24odG8pIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY29weV90byA9ICQodG8pLmNsb25lKCk7CiAgICAgICAgICAgIHZhciBjb3B5X2Zyb20gPSAkKHRoaXMpLmNsb25lKCk7CiAgICAgICAgICAgICQodG8pLnJlcGxhY2VXaXRoKGNvcHlfZnJvbSk7CiAgICAgICAgICAgICQodGhpcykucmVwbGFjZVdpdGgoY29weV90byk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgICQuZm4uYXR0clByb3AgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoJCh0aGlzKSwgbmFtZSwgdmFsdWUpOwogICAgfTsKCiAgICAvKioKICAgICAqIFdoZW4gZG9tIGVsZW1lbnRzIGFyZSByZW1vdmVkLCB3ZSBmaXJlIHRoZSBzcGVjaWFsICJkZXN0cm95ZWQiIGV2ZW50IHRvIGFsbG93IGZvciBsYXRlIGNsZWFudXAgb2YgYW55IEFscGFjYSBjb2RlCiAgICAgKiB0aGF0IG1pZ2h0IGJlIGluLW1lbW9yeSBhbmQgbGlua2VkIHRvIHRoZSBkb20gZWxlbWVudC4KICAgICAqCiAgICAgKiBAdHlwZSB7T2JqZWN0fQogICAgICovCiAgICAkLmV2ZW50LnNwZWNpYWwuZGVzdHJveWVkID0gewogICAgICAgIHJlbW92ZTogZnVuY3Rpb24obykgewogICAgICAgICAgICBpZiAoby5oYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBvLmhhbmRsZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgQWxwYWNhLnBhdGhQYXJ0cyA9IGZ1bmN0aW9uKHJlc291cmNlKQogICAgewogICAgICAgIGlmICh0eXBlb2YocmVzb3VyY2UpICE9PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgICB9CgogICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRvIG9iamVjdAogICAgICAgIHZhciByZXNvdXJjZVBhdGggPSByZXNvdXJjZTsKICAgICAgICB2YXIgcmVzb3VyY2VJZCA9IG51bGw7CiAgICAgICAgdmFyIGkgPSByZXNvdXJjZVBhdGguaW5kZXhPZigiIyIpOwogICAgICAgIGlmIChpID4gLTEpCiAgICAgICAgewogICAgICAgICAgICByZXNvdXJjZUlkID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZyhpICsgMSk7CiAgICAgICAgICAgIHJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgaSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQWxwYWNhLmVuZHNXaXRoKHJlc291cmNlUGF0aCwgIi8iKSkgewogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIHJlc291cmNlUGF0aC5sZW5ndGggLSAxKTsKICAgICAgICB9CgogICAgICAgIHZhciBwYXJ0cyA9IHt9OwogICAgICAgIHBhcnRzLnBhdGggPSByZXNvdXJjZVBhdGg7CgogICAgICAgIGlmIChyZXNvdXJjZUlkKQogICAgICAgIHsKICAgICAgICAgICAgcGFydHMuaWQgPSByZXNvdXJjZUlkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgZmllbGQgYnkgaXRzIHByb3BlcnR5IGlkLgogICAgICoKICAgICAqIEBwYXJhbSBjb250YWluZXJGaWVsZAogICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAqIEByZXR1cm5zIHtudWxsfQogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkID0gZnVuY3Rpb24oY29udGFpbmVyRmllbGQsIHByb3BlcnR5SWRPclJlZmVyZW5jZUlkKQogICAgewogICAgICAgIHZhciByZXNvbHZlZEZpZWxkID0gbnVsbDsKCiAgICAgICAgaWYgKHR5cGVvZihwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkgPT09ICJzdHJpbmciKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDAgJiYgcHJvcGVydHlJZC5sZW5ndGggPiAyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXRoIGJhc2VkIGxvb2t1cD8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMiIHx8IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkID09PSAiIy8iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaWQgbG9va3VwCgogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgdG9wIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgdG9wRmllbGQgPSBjb250YWluZXJGaWVsZDsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gcHJvcGVydHlJZE9yUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDEpOwoKICAgICAgICAgICAgICAgIHJlc29sdmVkRmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UodG9wRmllbGQsIHJlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBsb29rdXAKICAgICAgICAgICAgICAgIHJlc29sdmVkRmllbGQgPSBjb250YWluZXJGaWVsZC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNvbHZlZEZpZWxkOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgZmllbGQgYmFzZWQgb24gaXRzICJyZWZlcmVuY2UgaWQiIHJlbGF0aXZlIHRvIGEgdG9wIGxldmVsIGZpZWxkLiAgVGhpcyB3YWxrcyBkb3duIHRoZSBmaWVsZCB0cmVlIGFuZAogICAgICogbG9va3MgZm9yIG1hdGNoaW5nIHNjaGVtYS5pZCByZWZlcmVuY2VzIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGZpZWxkLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZAogICAgICogQHBhcmFtIHJlZmVyZW5jZUlkCiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlRmllbGRCeVJlZmVyZW5jZSA9IGZ1bmN0aW9uKGZpZWxkLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoZmllbGQuc2NoZW1hICYmIGZpZWxkLnNjaGVtYS5pZCA9PSByZWZlcmVuY2VJZCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmllbGQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UoY2hpbGQsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgZmlyc3QgYXJndW1lbnQgYXJlIGVxdWFsIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgogICAgICoKICAgICAqIEBwYXJhbSBmaXJzdCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcGFyYW0gc2Vjb25kIGVpdGhlciBhIHNjYWxhciB2YWx1ZSBvciBhIGNvbnRhaW5lciAob2JqZWN0IG9yIGFycmF5KSBvZiB2YWx1ZXMKICAgICAqIEByZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG1hdGNoIGlzIGZvdW5kCiAgICAgKi8KICAgIEFscGFjYS5hbnlFcXVhbGl0eSA9IGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpCiAgICB7CiAgICAgICAgLy8gY29weSB2YWx1ZXMgZnJvbSBmaXJzdCBpbnRvIGEgdmFsdWVzIGxvb2t1cCBtYXAKICAgICAgICB2YXIgdmFsdWVzID0ge307CiAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KGZpcnN0KSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlc1tmaXJzdFtrXV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlc1tmaXJzdF0gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlOwoKICAgICAgICAvLyBjaGVjayB2YWx1ZXMgZnJvbSBzZWNvbmQgYWdhaW5zdCB0aGUgbG9va3VwIG1hcAogICAgICAgIGlmICh0eXBlb2Yoc2Vjb25kKSA9PT0gIm9iamVjdCIgfHwgQWxwYWNhLmlzQXJyYXkoc2Vjb25kKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2Vjb25kKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHNlY29uZFtrXTsKCiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW3ZdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVzW3NlY29uZF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKCiAgICBBbHBhY2Euc2VyaWVzID0gQWxwYWNhLnNlcmlhbCA9IGZ1bmN0aW9uKGZ1bmNzLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBhc3luYy5zZXJpZXMoZnVuY3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EucGFyYWxsZWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMucGFyYWxsZWwoZnVuY3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EubmV4dFRpY2sgPSBmdW5jdGlvbihmKQogICAgewogICAgICAgIGFzeW5jLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ29tcGlsZXMgdGhlIHZhbGlkYXRpb24gY29udGV4dCBmb3IgdGhlIGNoYWluIG9mIGZpZWxkcyBmcm9tIHRoZSB0b3AtbW9zdCBkb3duIHRvIHRoZSBnaXZlbiBmaWVsZC4KICAgICAqIEVhY2ggdmFsaWRhdGlvbiBjb250ZXh0IGVudHJ5IGlzIGEgZmllbGQgaW4gdGhlIGNoYWluIHdoaWNoIGRlc2NyaWJlcyB0aGUgZm9sbG93aW5nOgogICAgICoKICAgICAqICAgIHsKICAgICAqICAgICAgICJmaWVsZCI6IHRoZSBmaWVsZCBpbnN0YW5jZSwKICAgICAqICAgICAgICJiZWZvcmUiOiB0aGUgYmVmb3JlIHZhbHVlIChib29sZWFuKQogICAgICogICAgICAgImFmdGVyIjogdGhlIGFmdGVyIHZhbHVlIChib29sZWFuKQogICAgICogICAgICAgInZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIHZhbGlkYXRlZCAoc3dpdGNoZXMgc3RhdGUgZnJvbSBpbnZhbGlkIHRvIHZhbGlkKQogICAgICogICAgICAgImludmFsaWRhdGVkIjogKG9wdGlvbmFsKSBpZiB0aGUgZmllbGQgaW52YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gdmFsaWQgdG8gaW52YWxpZCkKICAgICAqICAgIH0KICAgICAqCiAgICAgKiBUaGlzIGhhbmRzIGJhY2sgYW4gYXJyYXkgb2YgZW50cmllcyB3aXRoIHRoZSBjaGlsZCBmaWVsZCBmaXJzdCBhbmQgY29udGludWluZyB1cCB0aGUgcGFyZW50IGNoYWluLgogICAgICogVGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5IGlzIHRoZSB0b3AgbW9zdCBwYXJlbnQgZmllbGQuCiAgICAgKgogICAgICogVGhlIGNhbGxiYWNrIGlzIGZpcmVkIHdpdGggdGhlIGFzc2VtYmxlZCBjb250ZXh0LCBhbGxvd2luZyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gdG8gcnVuLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZAogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge0FycmF5fQogICAgICovCiAgICBBbHBhY2EuY29tcGlsZVZhbGlkYXRpb25Db250ZXh0ID0gZnVuY3Rpb24oZmllbGQsIGNhbGxiYWNrKQogICAgewogICAgICAgIC8vIHdhbGsgdXAgdGhlIHBhcmVudCB0cmVlIHVudGlsIHdlIGZpbmQgdGhlIHRvcC1tb3N0IGNvbnRyb2wKICAgICAgICAvLyB0aGlzIHNlcnZlcyBhcyBvdXIgc3RhcnRpbmcgcG9pbnQgZm9yIGRvd253YXJkIHZhbGlkYXRpb24KICAgICAgICB2YXIgY2hhaW4gPSBbXTsKICAgICAgICB2YXIgcGFyZW50ID0gZmllbGQ7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzVmFsaWRhdGlvblBhcnRpY2lwYW50KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2gocGFyZW50KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAocGFyZW50KTsKCiAgICAgICAgLy8gcmV2ZXJzZSBzbyB0b3AgbW9zdCBwYXJlbnQgaXMgZmlyc3QKICAgICAgICBjaGFpbi5yZXZlcnNlKCk7CgogICAgICAgIC8vIGNvbXBpbGF0aW9uIGNvbnRleHQKICAgICAgICB2YXIgY29udGV4dCA9IFtdOwoKICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdGhhdCBzZXRzIHZhbGlkYXRpb24gZm9yIGEgc2luZ2xlIGZpZWxkCiAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihjaGFpbiwgY29udGV4dCwgZG9uZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY2hhaW4gfHwgY2hhaW4ubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY3VycmVudCA9IGNoYWluWzBdOwoKICAgICAgICAgICAgdmFyIGVudHJ5ID0ge307CiAgICAgICAgICAgIGVudHJ5LmlkID0gY3VycmVudC5nZXRJZCgpOwogICAgICAgICAgICBlbnRyeS5maWVsZCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjdXJyZW50LnBhdGg7CgogICAgICAgICAgICAvLyBCRUZPUkUgZmllbGQgdmFsaWRhdGlvbiBzdGF0dXMKICAgICAgICAgICAgdmFyIGJlZm9yZVN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICBpZiAoY3VycmVudC5pc0NvbnRhaW5lcigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVudHJ5LmJlZm9yZSA9IGJlZm9yZVN0YXR1czsKCiAgICAgICAgICAgIHZhciBvdXJzZWx2ZXNIYW5kbGVyID0gZnVuY3Rpb24oY3VycmVudCwgZW50cnksIHdlRmluaXNoZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c2x5VmFsaWRhdGVkID0gY3VycmVudC5fcHJldmlvdXNseVZhbGlkYXRlZDsKCiAgICAgICAgICAgICAgICAvLyBub3cgcnVuIHRoZSB2YWxpZGF0aW9uIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICBjdXJyZW50LnZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgY3VzdG9tIHZhbGlkYXRpb24gKGlmIGV4aXN0cykgZm9yIGp1c3QgdGhpcyBvbmUgZmllbGQKICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoaXMganVzdCBmaXJlcyB0aGUgY2FsbGJhY2sKICAgICAgICAgICAgICAgIGN1cnJlbnQuX3ZhbGlkYXRlQ3VzdG9tVmFsaWRhdG9yKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBBRlRFUiBmaWVsZCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuYWZ0ZXIgPSBhZnRlclN0YXR1czsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBmaWVsZCdzIHZhbGlkYXRpb24gc3RhdHVzIGZsaXBwZWQsIGZpcmUgdHJpZ2dlcnMKICAgICAgICAgICAgICAgICAgICBlbnRyeS52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmICghYmVmb3JlU3RhdHVzICYmIGFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmVmb3JlU3RhdHVzICYmICFhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBmaWVsZHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiB2YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcHJldmlvdXNseVZhbGlkYXRlZCAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb250YWluZXIgPSBjdXJyZW50LmlzQ29udGFpbmVyKCk7CiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWQgPSBlbnRyeS5hZnRlcjsKCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKGVudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgd2VGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdGVwIGRvd24gaW50byBjaGFpbgogICAgICAgICAgICAvLyB3ZSBkbyBjaGlsZHJlbiBiZWZvcmUgb3Vyc2VsdmVzCiAgICAgICAgICAgIGlmIChjaGFpbi5sZW5ndGggPiAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjb3B5IGFycmF5CiAgICAgICAgICAgICAgICB2YXIgY2hpbGRDaGFpbiA9IGNoYWluLnNsaWNlKDApOwogICAgICAgICAgICAgICAgY2hpbGRDaGFpbi5zaGlmdCgpOwogICAgICAgICAgICAgICAgZihjaGlsZENoYWluLCBjb250ZXh0LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBvdXJzZWx2ZXNIYW5kbGVyKGN1cnJlbnQsIGVudHJ5LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvdXJzZWx2ZXNIYW5kbGVyKGN1cnJlbnQsIGVudHJ5LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZihjaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRleHQpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EudXBkYXRlVmFsaWRhdGlvblN0YXRlRm9yQ29udGV4dCA9IGZ1bmN0aW9uKHZpZXcsIGNvbnRleHQpCiAgICB7CiAgICAgICAgLy8gd2FsayB0aHJvdWdoIGVhY2ggYW5kIGZsaXAgYW55IERPTSBVSSBiYXNlZCBvbiBlbnRyeSBzdGF0ZQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dC5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbnRyeSA9IGNvbnRleHRbaV07CiAgICAgICAgICAgIHZhciBmaWVsZCA9IGVudHJ5LmZpZWxkOwoKICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIHZhbGlkYXRpb24gVUkgbWFya2VycwogICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkucmVtb3ZlQ2xhc3MoImFscGFjYS1pbnZhbGlkIGFscGFjYS1pbnZhbGlkLWhpZGRlbiBhbHBhY2EtdmFsaWQiKTsKICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJjbGVhclZhbGlkaXR5Iik7CgogICAgICAgICAgICAvLyB2YWxpZD8KICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC12YWxpZCIpOwogICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJ2YWxpZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbWFya3VwIGludmFsaWRhdGlvbiBzdGF0ZSBmb3IgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5maXJlQ2FsbGJhY2soImludmFsaWQiLCBoaWRkZW4pOwoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGRlbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLWludmFsaWQtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZmllbGQgaXMgaW52YWxpZCBhbmQgaXMgYWxzbyByZWFkLW9ubHksIHNvIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBpbmZvcm0gdGhlIGVuZC11c2VyCiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBVSSAoc2luY2UgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQpCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSwgd2UgbG9nIGEgbWVzc2FnZSB0byBkZWJ1ZyB0byBpbmZvcm0gdGhlIGRldmVsb3BlcgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJUaGUgZmllbGQgKGlkPSIgKyBmaWVsZC5nZXRJZCgpICsgIiwgdGl0bGU9IiArIGZpZWxkLmdldFRpdGxlKCkgKyAiLCBwYXRoPSIgKyBmaWVsZC5wYXRoICsgIikgaXMgaW52YWxpZCBhbmQgYWxzbyByZWFkLW9ubHkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVFJJR0dFUlMKICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJ2YWxpZGF0ZWQiKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnRyaWdnZXIoImludmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWxsb3cgZm9yIHRoZSBtZXNzYWdlIHRvIGNoYW5nZQogICAgICAgICAgICBpZiAoZmllbGQub3B0aW9ucy5zaG93TWVzc2FnZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaW5pdGlhbGl6aW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQub3B0aW9ucy5yZWFkb25seSB8fCBBbHBhY2Euc2hvd1JlYWRPbmx5SW52YWxpZFN0YXRlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBmaWVsZC52YWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLnZhbGlkYXRpb25bbWVzc2FnZUlkXVsic3RhdHVzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IG1lc3NhZ2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bIm1lc3NhZ2UiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kaXNwbGF5TWVzc2FnZShtZXNzYWdlcywgZmllbGQudmFsaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBvdmVyIHRoZSBmaWVsZCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiByZWN1cnNpdmVseS4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBmbgogICAgICovCiAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4gPSBmdW5jdGlvbihmaWVsZCwgZm4pCiAgICB7CiAgICAgICAgZm4oZmllbGQpOwoKICAgICAgICAvLyBpZiB0aGUgZmllbGQgaGFzIGNoaWxkcmVuLCBnbyBkZXB0aCBmaXJzdAogICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLmNoaWxkcmVuW2ldLCBmbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgc3RyaW5nIDxmaW5kPiB3aXRoIHRoZSByZXBsYWNlbWVudCB0ZXh0IDxyZXBsYWNlPi4KICAgICAqCiAgICAgKiBAcGFyYW0gdGV4dAogICAgICogQHBhcmFtIGZpbmQKICAgICAqIEBwYXJhbSByZXBsYWNlCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgQWxwYWNhLnJlcGxhY2VBbGwgPSBmdW5jdGlvbih0ZXh0LCBmaW5kLCByZXBsYWNlKQogICAgewogICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChmaW5kLCAnZycpLCByZXBsYWNlKTsKICAgIH07CgogICAgQWxwYWNhLmFzQXJyYXkgPSBmdW5jdGlvbih0aGluZykKICAgIHsKICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHRoaW5nKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwogICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGluZzsKICAgIH07CgoKCgoKCgoKCgoKCgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBBU1lOQwogICAgLy8KICAgIC8vIEhlcmUgd2UgcHJvdmlkZSBhIHJlZHVjZWQgdmVyc2lvbiBvZiB0aGUgd29uZGVyZnVsIGFzeW5jIGxpYnJhcnkuICBUaGlzIGlzIGVudGlyZWx5IGlubGluZSBhbmQKICAgIC8vIHdpbGwgaGF2ZSBubyBiZWFyaW5nIG9uIGFueSBleHRlcm5hbCBkZXBlbmRlbmNpZXMgb24gYXN5bmMuCiAgICAvLwogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nhb2xhbi9hc3luYwogICAgLy8gQ29weXJpZ2h0IChjKSAyMDEwIENhb2xhbiBNY01haG9uCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8qZ2xvYmFsIHNldEltbWVkaWF0ZTogZmFsc2UsIHNldFRpbWVvdXQ6IGZhbHNlLCBjb25zb2xlOiBmYWxzZSAqLwogICAgKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgdmFyIGFzeW5jID0ge307CgogICAgICAgIC8vIGdsb2JhbCBvbiB0aGUgc2VydmVyLCB3aW5kb3cgaW4gdGhlIGJyb3dzZXIKICAgICAgICB2YXIgcm9vdCwgcHJldmlvdXNfYXN5bmM7CgogICAgICAgIHJvb3QgPSB0aGlzOwogICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKICAgICAgICAgICAgcHJldmlvdXNfYXN5bmMgPSByb290LmFzeW5jOwogICAgICAgIH0KCiAgICAgICAgYXN5bmMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcm9vdC5hc3luYyA9IHByZXZpb3VzX2FzeW5jOwogICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gb25seV9vbmNlKGZuKSB7CiAgICAgICAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkLiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZuLmFwcGx5KHJvb3QsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLy8vIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsaXR5IGZ1bmN0aW9ucyAvLy8vCgogICAgICAgIHZhciBfZWFjaCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yKSB7CiAgICAgICAgICAgIGlmIChhcnIuZm9yRWFjaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5mb3JFYWNoKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2ldLCBpLCBhcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9tYXAgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLm1hcCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5tYXAoaXRlcmF0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvcih4LCBpLCBhKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICB9OwoKICAgICAgICB2YXIgX3JlZHVjZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtZW1vKSB7CiAgICAgICAgICAgIGlmIChhcnIucmVkdWNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLnJlZHVjZShpdGVyYXRvciwgbWVtbyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkgewogICAgICAgICAgICAgICAgbWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHgsIGksIGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG1lbW87CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9rZXlzID0gZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBrZXlzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBrZXlzOwogICAgICAgIH07CgogICAgICAgIC8vLy8gZXhwb3J0ZWQgYXN5bmMgbW9kdWxlIGZ1bmN0aW9ucyAvLy8vCgogICAgICAgIC8vLy8gbmV4dFRpY2sgaW1wbGVtZW50YXRpb24gd2l0aCBicm93c2VyLWNvbXBhdGlibGUgZmFsbGJhY2sgLy8vLwogICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIShwcm9jZXNzLm5leHRUaWNrKSkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhc3luYy5uZXh0VGljayA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZm4sIDApOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrOwogICAgICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGRpcmVjdCBhbGlhcyBmb3IgSUUxMCBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGZuKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYXN5bmMuZWFjaCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBvbmx5X29uY2UoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZvckVhY2ggPSBhc3luYy5lYWNoOwoKICAgICAgICBhc3luYy5lYWNoU2VyaWVzID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CiAgICAgICAgICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2NvbXBsZXRlZF0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoU2VyaWVzID0gYXN5bmMuZWFjaFNlcmllczsKCiAgICAgICAgYXN5bmMuZWFjaExpbWl0ID0gZnVuY3Rpb24gKGFyciwgbGltaXQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgZm4gPSBfZWFjaExpbWl0KGxpbWl0KTsKICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgW2FyciwgaXRlcmF0b3IsIGNhbGxiYWNrXSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoTGltaXQgPSBhc3luYy5lYWNoTGltaXQ7CgogICAgICAgIHZhciBfZWFjaExpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7CgogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ZWQgPSAwOwogICAgICAgICAgICAgICAgdmFyIHJ1bm5pbmcgPSAwOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbiByZXBsZW5pc2ggKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nIDwgbGltaXQgJiYgc3RhcnRlZCA8IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltzdGFydGVkIC0gMV0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsZW5pc2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIHZhciBkb1BhcmFsbGVsID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2FzeW5jLmVhY2hdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICB2YXIgZG9QYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24obGltaXQsIGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW19lYWNoTGltaXQobGltaXQpXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvU2VyaWVzID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2FzeW5jLmVhY2hTZXJpZXNdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIHZhciBfYXN5bmNNYXAgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKGVyciwgdikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbeC5pbmRleF0gPSB2OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5tYXAgPSBkb1BhcmFsbGVsKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwU2VyaWVzID0gZG9TZXJpZXMoX2FzeW5jTWFwKTsKICAgICAgICBhc3luYy5tYXBMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgcmV0dXJuIF9tYXBMaW1pdChsaW1pdCkoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwTGltaXQgPSBmdW5jdGlvbihsaW1pdCkgewogICAgICAgICAgICByZXR1cm4gZG9QYXJhbGxlbExpbWl0KGxpbWl0LCBfYXN5bmNNYXApOwogICAgICAgIH07CgogICAgICAgIC8vIHJlZHVjZSBvbmx5IGhhcyBhIHNlcmllcyB2ZXJzaW9uLCBhcyBkb2luZyByZWR1Y2UgaW4gcGFyYWxsZWwgd29uJ3QKICAgICAgICAvLyB3b3JrIGluIG1hbnkgc2l0dWF0aW9ucy4KICAgICAgICBhc3luYy5yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMuZWFjaFNlcmllcyhhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IobWVtbywgeCwgZnVuY3Rpb24gKGVyciwgdikgewogICAgICAgICAgICAgICAgICAgIG1lbW8gPSB2OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBtZW1vKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBpbmplY3QgYWxpYXMKICAgICAgICBhc3luYy5pbmplY3QgPSBhc3luYy5yZWR1Y2U7CiAgICAgICAgLy8gZm9sZGwgYWxpYXMKICAgICAgICBhc3luYy5mb2xkbCA9IGFzeW5jLnJlZHVjZTsKCiAgICAgICAgYXN5bmMucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJldmVyc2VkID0gX21hcChhcnIsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfSkucmV2ZXJzZSgpOwogICAgICAgICAgICBhc3luYy5yZWR1Y2UocmV2ZXJzZWQsIG1lbW8sIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICAvLyBmb2xkciBhbGlhcwogICAgICAgIGFzeW5jLmZvbGRyID0gYXN5bmMucmVkdWNlUmlnaHQ7CgogICAgICAgIHZhciBfZmlsdGVyID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZmlsdGVyID0gZG9QYXJhbGxlbChfZmlsdGVyKTsKICAgICAgICBhc3luYy5maWx0ZXJTZXJpZXMgPSBkb1NlcmllcyhfZmlsdGVyKTsKICAgICAgICAvLyBzZWxlY3QgYWxpYXMKICAgICAgICBhc3luYy5zZWxlY3QgPSBhc3luYy5maWx0ZXI7CiAgICAgICAgYXN5bmMuc2VsZWN0U2VyaWVzID0gYXN5bmMuZmlsdGVyU2VyaWVzOwoKICAgICAgICB2YXIgX3JlamVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICghdikgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CiAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5yZWplY3QgPSBkb1BhcmFsbGVsKF9yZWplY3QpOwogICAgICAgIGFzeW5jLnJlamVjdFNlcmllcyA9IGRvU2VyaWVzKF9yZWplY3QpOwoKICAgICAgICB2YXIgX2RldGVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHgpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZGV0ZWN0ID0gZG9QYXJhbGxlbChfZGV0ZWN0KTsKICAgICAgICBhc3luYy5kZXRlY3RTZXJpZXMgPSBkb1NlcmllcyhfZGV0ZWN0KTsKCiAgICAgICAgYXN5bmMuc29tZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8vIGFueSBhbGlhcwogICAgICAgIGFzeW5jLmFueSA9IGFzeW5jLnNvbWU7CgogICAgICAgIGFzeW5jLmV2ZXJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8vIGFsbCBhbGlhcwogICAgICAgIGFzeW5jLmFsbCA9IGFzeW5jLmV2ZXJ5OwoKICAgICAgICBhc3luYy5zb3J0QnkgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMubWFwKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAoZXJyLCBjcml0ZXJpYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHt2YWx1ZTogeCwgY3JpdGVyaWE6IGNyaXRlcmlhfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgX21hcChyZXN1bHRzLnNvcnQoZm4pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLmF1dG8gPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIHZhciBrZXlzID0gX2tleXModGFza3MpOwogICAgICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CgogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gW107CiAgICAgICAgICAgIHZhciBhZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoZm4pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHRhc2tDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF9lYWNoKGxpc3RlbmVycy5zbGljZSgwKSwgZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgYWRkTGlzdGVuZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKF9rZXlzKHJlc3VsdHMpLmxlbmd0aCA9PT0ga2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIF9lYWNoKGtleXMsIGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICB2YXIgdGFzayA9ICh0YXNrc1trXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSA/IFt0YXNrc1trXV06IHRhc2tzW2tdOwogICAgICAgICAgICAgICAgdmFyIHRhc2tDYWxsYmFjayA9IGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhZmVSZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKF9rZXlzKHJlc3VsdHMpLCBmdW5jdGlvbihya2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlUmVzdWx0c1tya2V5XSA9IHJlc3VsdHNbcmtleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBzYWZlUmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc2FmZVJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHN1YnNlcXVlbnQgZXJyb3JzIGhpdHRpbmcgY2FsbGJhY2sgbXVsdGlwbGUgdGltZXMKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUodGFza0NvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVzID0gdGFzay5zbGljZSgwLCBNYXRoLmFicyh0YXNrLmxlbmd0aCAtIDEpKSB8fCBbXTsKICAgICAgICAgICAgICAgIHZhciByZWFkeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZHVjZShyZXF1aXJlcywgZnVuY3Rpb24gKGEsIHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChhICYmIHJlc3VsdHMuaGFzT3duUHJvcGVydHkoeCkpOwogICAgICAgICAgICAgICAgICAgIH0sIHRydWUpICYmICFyZXN1bHRzLmhhc093blByb3BlcnR5KGspOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChyZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrW3Rhc2subGVuZ3RoIC0gMV0odGFza0NhbGxiYWNrLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy53YXRlcmZhbGwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICh0YXNrcy5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIHdhdGVyZmFsbCBtdXN0IGJlIGFuIGFycmF5IG9mIGZ1bmN0aW9ucycpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0YXNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3cmFwSXRlcmF0b3IgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh3cmFwSXRlcmF0b3IobmV4dCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHdyYXBJdGVyYXRvcihhc3luYy5pdGVyYXRvcih0YXNrcykpKCk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9wYXJhbGxlbCA9IGZ1bmN0aW9uKGVhY2hmbiwgdGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICh0YXNrcy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgIGVhY2hmbi5tYXAodGFza3MsIGZ1bmN0aW9uIChmbiwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgZXJyLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICAgIGVhY2hmbi5lYWNoKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5wYXJhbGxlbCA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBhc3luYy5tYXAsIGVhY2g6IGFzeW5jLmVhY2ggfSwgdGFza3MsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5wYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24odGFza3MsIGxpbWl0LCBjYWxsYmFjaykgewogICAgICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IF9tYXBMaW1pdChsaW1pdCksIGVhY2g6IF9lYWNoTGltaXQobGltaXQpIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuc2VyaWVzID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBhc3luYy5tYXBTZXJpZXModGFza3MsIGZ1bmN0aW9uIChmbiwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgZXJyLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoX2tleXModGFza3MpLCBmdW5jdGlvbiAoaywgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICB0YXNrc1trXShmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLml0ZXJhdG9yID0gZnVuY3Rpb24gKHRhc2tzKSB7CiAgICAgICAgICAgIHZhciBtYWtlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzW2luZGV4XS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4ubmV4dCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZuLm5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA8IHRhc2tzLmxlbmd0aCAtIDEpID8gbWFrZUNhbGxiYWNrKGluZGV4ICsgMSk6IG51bGw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gbWFrZUNhbGxiYWNrKDApOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLmFwcGx5ID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSgKICAgICAgICAgICAgICAgICAgICBudWxsLCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX2NvbmNhdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByID0gW107CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYikgewogICAgICAgICAgICAgICAgZm4oeCwgZnVuY3Rpb24gKGVyciwgeSkgewogICAgICAgICAgICAgICAgICAgIHIgPSByLmNvbmNhdCh5IHx8IFtdKTsKICAgICAgICAgICAgICAgICAgICBjYihlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuY29uY2F0ID0gZG9QYXJhbGxlbChfY29uY2F0KTsKICAgICAgICBhc3luYy5jb25jYXRTZXJpZXMgPSBkb1NlcmllcyhfY29uY2F0KTsKCiAgICAgICAgYXN5bmMud2hpbHN0ID0gZnVuY3Rpb24gKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBpZiAodGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMud2hpbHN0KHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5kb1doaWxzdCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgICAgIGFzeW5jLmRvV2hpbHN0KGl0ZXJhdG9yLCB0ZXN0LCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy51bnRpbCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKCF0ZXN0KCkpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy51bnRpbCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9VbnRpbCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1VudGlsKGl0ZXJhdG9yLCB0ZXN0LCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5xdWV1ZSA9IGZ1bmN0aW9uICh3b3JrZXIsIGNvbmN1cnJlbmN5KSB7CiAgICAgICAgICAgIGlmIChjb25jdXJyZW5jeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2luc2VydChxLCBkYXRhLCBwb3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpZihkYXRhLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEudGFza3MudW5zaGlmdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAocS5zYXR1cmF0ZWQgJiYgcS50YXNrcy5sZW5ndGggPT09IGNvbmN1cnJlbmN5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEuc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShxLnByb2Nlc3MpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB3b3JrZXJzID0gMDsKICAgICAgICAgICAgdmFyIHEgPSB7CiAgICAgICAgICAgICAgICB0YXNrczogW10sCiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeTogY29uY3VycmVuY3ksCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgX2luc2VydChxLCBkYXRhLCBmYWxzZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVuc2hpZnQ6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgdHJ1ZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2VycyA8IHEuY29uY3VycmVuY3kgJiYgcS50YXNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBxLnRhc2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmVtcHR5ICYmIHEudGFza3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VycyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5jYWxsYmFjay5hcHBseSh0YXNrLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEuZHJhaW4gJiYgcS50YXNrcy5sZW5ndGggKyB3b3JrZXJzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5kcmFpbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5wcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYiA9IG9ubHlfb25jZShuZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyKHRhc2suZGF0YSwgY2IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS50YXNrcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXJzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gcTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5jYXJnbyA9IGZ1bmN0aW9uICh3b3JrZXIsIHBheWxvYWQpIHsKICAgICAgICAgICAgdmFyIHdvcmtpbmcgICAgID0gZmFsc2UsCiAgICAgICAgICAgICAgICB0YXNrcyAgICAgICA9IFtdOwoKICAgICAgICAgICAgdmFyIGNhcmdvID0gewogICAgICAgICAgICAgICAgdGFza3M6IHRhc2tzLAogICAgICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCwKICAgICAgICAgICAgICAgIHNhdHVyYXRlZDogbnVsbCwKICAgICAgICAgICAgICAgIGVtcHR5OiBudWxsLAogICAgICAgICAgICAgICAgZHJhaW46IG51bGwsCiAgICAgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXJnby5zYXR1cmF0ZWQgJiYgdGFza3MubGVuZ3RoID09PSBwYXlsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5zYXR1cmF0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShjYXJnby5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5kcmFpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdHMgPSB0eXBlb2YgcGF5bG9hZCA9PT0gJ251bWJlcicgPwogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5zcGxpY2UoMCwgcGF5bG9hZCkgOgogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5zcGxpY2UoMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IF9tYXAodHMsIGZ1bmN0aW9uICh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGlmKGNhcmdvLmVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHdvcmtlcihkcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2godHMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2FsbGJhY2suYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JraW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gY2FyZ287CiAgICAgICAgfTsKCiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqLwogICAgICAgIHZhciBfY29uc29sZV9mbiA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc29sZVtuYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2goYXJncywgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW25hbWVdKHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi8KCiAgICAgICAgYXN5bmMubG9nID0gX2NvbnNvbGVfZm4oJ2xvZycpOwogICAgICAgIGFzeW5jLmRpciA9IF9jb25zb2xlX2ZuKCdkaXInKTsKICAgICAgICAvKmFzeW5jLmluZm8gPSBfY29uc29sZV9mbignaW5mbycpOwogICAgICAgICBhc3luYy53YXJuID0gX2NvbnNvbGVfZm4oJ3dhcm4nKTsKICAgICAgICAgYXN5bmMuZXJyb3IgPSBfY29uc29sZV9mbignZXJyb3InKTsqLwoKICAgICAgICBhc3luYy5tZW1vaXplID0gZnVuY3Rpb24gKGZuLCBoYXNoZXIpIHsKICAgICAgICAgICAgdmFyIG1lbW8gPSB7fTsKICAgICAgICAgICAgdmFyIHF1ZXVlcyA9IHt9OwogICAgICAgICAgICBoYXNoZXIgPSBoYXNoZXIgfHwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmdzLnBvcCgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IGhhc2hlci5hcHBseShudWxsLCBhcmdzKTsKICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gbWVtbykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIG1lbW9ba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgaW4gcXVldWVzKSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0ucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBxdWV1ZXNba2V5XSA9IFtjYWxsYmFja107CiAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncy5jb25jYXQoW2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb1trZXldID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcXVldWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH1dKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG1lbW9pemVkLm1lbW8gPSBtZW1vOwogICAgICAgICAgICBtZW1vaXplZC51bm1lbW9pemVkID0gZm47CiAgICAgICAgICAgIHJldHVybiBtZW1vaXplZDsKICAgICAgICB9OwoKICAgICAgICBhc3luYy51bm1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoZm4udW5tZW1vaXplZCB8fCBmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy50aW1lcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBjb3VudGVyID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhc3luYy5tYXAoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy50aW1lc1NlcmllcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBjb3VudGVyID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhc3luYy5tYXBTZXJpZXMoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5jb21wb3NlID0gZnVuY3Rpb24gKC8qIGZ1bmN0aW9ucy4uLiAqLykgewogICAgICAgICAgICB2YXIgZm5zID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIGFzeW5jLnJlZHVjZShmbnMsIGFyZ3MsIGZ1bmN0aW9uIChuZXdhcmdzLCBmbiwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgbmV3YXJncy5jb25jYXQoW2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoZXJyLCBuZXh0YXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1dKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoYXQsIFtlcnJdLmNvbmNhdChyZXN1bHRzKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9hcHBseUVhY2ggPSBmdW5jdGlvbiAoZWFjaGZuLCBmbnMgLyphcmdzLi4uKi8pIHsKICAgICAgICAgICAgdmFyIGdvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCBmdW5jdGlvbiAoZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MuY29uY2F0KFtjYl0pKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICAgICAgICAgICAgICByZXR1cm4gZ28uYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ287CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGFzeW5jLmFwcGx5RWFjaCA9IGRvUGFyYWxsZWwoX2FwcGx5RWFjaCk7CiAgICAgICAgYXN5bmMuYXBwbHlFYWNoU2VyaWVzID0gZG9TZXJpZXMoX2FwcGx5RWFjaCk7CgogICAgICAgIGFzeW5jLmZvcmV2ZXIgPSBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmbihuZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgfTsKCiAgICAgICAgLyoKICAgICAgICAvLyBBTUQgLyBSZXF1aXJlSlMKICAgICAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVmaW5lLmFtZCkgewogICAgICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhc3luYzsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIE5vZGUuanMKICAgICAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGFzeW5jOwogICAgICAgIH0KICAgICAgICAvLyBpbmNsdWRlZCBkaXJlY3RseSB2aWEgPHNjcmlwdD4gdGFnCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgcm9vdC5hc3luYyA9IGFzeW5jOwoKCgoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIEVRVUlWIEFORCBIT09aSVQKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8vIERldGVybWluZSB3aGF0IGlzIG8uCiAgICAgICAgZnVuY3Rpb24gaG9veml0KG8pIHsKICAgICAgICAgICAgaWYgKG8uY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChvLmNvbnN0cnVjdG9yID09PSBCb29sZWFuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChvLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpIHsKCiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5hbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInVuZGVmaW5lZCI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IHR5cGVvZiBudWxsID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgW10gPT09IG9iamVjdAogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IHR5cGVvZiBuZXcgRGF0ZSgpID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogLy4vIGluc3RhbmNlb2YgT2JqZWN0OwogICAgICAgICAgICAgICAgLy8gICAgICAgICAgIC8uLyBpbnN0YW5jZW9mIFJlZ0V4cDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHR5cGVvZiAvLi8gPT09ICJmdW5jdGlvbiI7IC8vID0+IGZhbHNlIGluIElFIGFuZCBPcGVyYSwKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBpbiBGRiBhbmQgU2FmYXJpCiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJlZ0V4cCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJyZWdleHAiOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbyA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENhbGwgdGhlIG8gcmVsYXRlZCBjYWxsYmFjayB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCiAgICAgICAgZnVuY3Rpb24gYmluZENhbGxiYWNrcyhvLCBjYWxsYmFja3MsIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIHByb3AgPSBob296aXQobyk7CiAgICAgICAgICAgIGlmIChwcm9wKSB7CiAgICAgICAgICAgICAgICBpZiAoaG9veml0KGNhbGxiYWNrc1twcm9wXSkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdLmFwcGx5KGNhbGxiYWNrcywgYXJncyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFja3NbcHJvcF07IC8vIG9yIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUZXN0IGZvciBlcXVhbGl0eSBhbnkgSmF2YVNjcmlwdCB0eXBlLgogICAgICAgIHZhciBlcXVpdiA9IHJvb3QuZXF1aXYgPSBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlubmVyRXF1aXY7IC8vIHRoZSByZWFsIGVxdWl2IGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBjYWxsZXJzID0gW107IC8vIHN0YWNrIHRvIGRlY2lkZSBiZXR3ZWVuIHNraXAvYWJvcnQgZnVuY3Rpb25zCgogICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIC8vIGZvciBzdHJpbmcsIGJvb2xlYW4sIG51bWJlciBhbmQgbnVsbAogICAgICAgICAgICAgICAgZnVuY3Rpb24gdXNlU3RyaWN0RXF1YWxpdHkoYiwgYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgYS5jb25zdHJ1Y3RvciB8fCBhIGluc3RhbmNlb2YgYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaCBzaG9ydCBhbm5vdGFpb24gVlMgJ25ldycgYW5ub3RhdGlvbiBvZiBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gdmFyIGkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIHZhciBqID0gbmV3IE51bWJlcigxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT0gYjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA9PT0gYjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RyaW5nIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iOiB1c2VTdHJpY3RFcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAibnVtYmVyIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bGwiOiB1c2VTdHJpY3RFcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkIjogdXNlU3RyaWN0RXF1YWxpdHksCgogICAgICAgICAgICAgICAgICAgICJuYW4iOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4oYik7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgImRhdGUiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9veml0KGIpID09PSAiZGF0ZSIgJiYgYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJyZWdleHAiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9veml0KGIpID09PSAicmVnZXhwIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zb3VyY2UgPT09IGIuc291cmNlICYmIC8vIHRoZSByZWdleCBpdHNlbGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJiAvLyBhbmQgaXRzIG1vZGlmZXJzIChnbWkpIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAvLyAtIHNraXAgd2hlbiB0aGUgcHJvcGVydHkgaXMgYSBtZXRob2Qgb2YgYW4gaW5zdGFuY2UgKE9PUCkKICAgICAgICAgICAgICAgICAgICAvLyAtIGFib3J0IG90aGVyd2lzZSwKICAgICAgICAgICAgICAgICAgICAvLyAgIGluaXRpYWwgPT09IHdvdWxkIGhhdmUgY2F0Y2ggaWRlbnRpY2FsIHJlZmVyZW5jZXMgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGVyID0gY2FsbGVyc1tjYWxsZXJzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGVyICE9PSBPYmplY3QgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjYWxsZXIgIT09ICJ1bmRlZmluZWQiOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJhcnJheSI6IGZ1bmN0aW9uIChiLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYiBjb3VsZCBiZSBhbiBvYmplY3QgbGl0ZXJhbCBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoaG9veml0KGIpID09PSAiYXJyYXkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBhLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiAhPT0gYi5sZW5ndGgpIHsgLy8gc2FmZSBhbmQgZmFzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggISBpbm5lckVxdWl2KGFbaV0sIGJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJvYmplY3QiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVxID0gdHJ1ZTsgLy8gdW5sZXNzIHdlIGNhbiBwcm9vdmUgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFQcm9wZXJ0aWVzID0gW10sIGJQcm9wZXJ0aWVzID0gW107IC8vIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIGNvbnN0cnVjdG9ycyBpcyBtb3JlIHN0cmljdCB0aGFuIHVzaW5nIGluc3RhbmNlb2YKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrIGNvbnN0cnVjdG9yIGJlZm9yZSB0cmF2ZXJzaW5nIHByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycy5wdXNoKGEuY29uc3RydWN0b3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGEpIHsgLy8gYmUgc3RyaWN0OiBkb24ndCBlbnN1cmVzIGhhc093blByb3BlcnR5IGFuZCBnbyBkZWVwCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBhJ3MgcHJvcGVydGllcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBpbm5lckVxdWl2KGFbaV0sIGJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycy5wb3AoKTsgLy8gdW5zdGFjaywgd2UgYXJlIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvcGVydGllcy5wdXNoKGkpOyAvLyBjb2xsZWN0IGIncyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZXMgaWRlbnRpY2FsIHByb3BlcnRpZXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXEgJiYgaW5uZXJFcXVpdihhUHJvcGVydGllcy5zb3J0KCksIGJQcm9wZXJ0aWVzLnNvcnQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwoKICAgICAgICAgICAgaW5uZXJFcXVpdiA9IGZ1bmN0aW9uICgpIHsgLy8gY2FuIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBlbmQgdHJhbnNpdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY2F0Y2ggdGhlIG1vc3QgeW91IGNhbgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsIHx8IHR5cGVvZiBhID09PSAidW5kZWZpbmVkIiB8fCB0eXBlb2YgYiA9PT0gInVuZGVmaW5lZCIgfHwgaG9veml0KGEpICE9PSBob296aXQoYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkb24ndCBsb3NlIHRpbWUgd2l0aCBlcnJvciBwcm9uZSBjYXNlcwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kQ2FsbGJhY2tzKGEsIGNhbGxiYWNrcywgW2IsIGFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gd2l0aCAoMS4ubikgYXJndW1lbnRzCiAgICAgICAgICAgICAgICB9KShhcmdzWzBdLCBhcmdzWzFdKSAmJiBhcmd1bWVudHMuY2FsbGVlLmFwcGx5KHRoaXMsIGFyZ3Muc3BsaWNlKDEsIGFyZ3MubGVuZ3RoIC0xKSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gaW5uZXJFcXVpdjsKCiAgICAgICAgfSgpOwoKICAgIH0oKSk7CgogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UUk9MX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udHJvbC1maWVsZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRhaW5lci1maWVsZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNID0gImFscGFjYS1tYXJrZXItY29udHJvbC1maWVsZC1pdGVtIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgPSAiZGF0YS1hbHBhY2EtY29udGFpbmVyLWZpZWxkLWl0ZW0ta2V5IjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWZvcm0taXRlbXMtZmllbGQiOwogICAgQWxwYWNhLkNMQVNTX0NPTlRBSU5FUiA9ICJhbHBhY2EtY29udGFpbmVyIjsKICAgIEFscGFjYS5DTEFTU19DT05UUk9MID0gImFscGFjYS1jb250cm9sIjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUID0gImFscGFjYS1tYXJrZXItaW5zZXJ0IjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZID0gImRhdGEtYWxwYWNhLW1hcmtlci1pbnNlcnQta2V5IjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLXRvb2xiYXIiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX1RPT0xCQVJfRklFTERfSUQgPSAiZGF0YS1hbHBhY2EtYXJyYXktZmllbGQtdG9vbGJhci1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSID0gImFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1hY3Rpb25iYXIiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgPSAiZGF0YS1hbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tcGFyZW50LWZpZWxkLWlkIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLWZpZWxkLWlkIjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQtaXRlbS1maWVsZCI7CgogICAgQWxwYWNhLm1ha2VDYWNoZUtleSA9IGZ1bmN0aW9uKHZpZXdJZCwgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkKQogICAgewogICAgICAgIHJldHVybiB2aWV3SWQgKyAiOiIgKyBzY29wZVR5cGUgKyAiOiIgKyBzY29wZUlkICsgIjoiICsgdGVtcGxhdGVJZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBjYWNoZSBrZXkgaW50byBpdHMgcGFydHMgLSB2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCBhbmQgdGVtcGxhdGVJZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAqIEByZXR1cm5zIHt7fX0KICAgICAqLwogICAgQWxwYWNhLnNwbGl0Q2FjaGVLZXkgPSBmdW5jdGlvbihjYWNoZUtleSkKICAgIHsKICAgICAgICB2YXIgcGFydHMgPSB7fTsKCiAgICAgICAgdmFyIHggPSBjYWNoZUtleS5pbmRleE9mKCI6Iik7CiAgICAgICAgdmFyIHkgPSBjYWNoZUtleS5sYXN0SW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy52aWV3SWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoMCwgeCk7CiAgICAgICAgcGFydHMudGVtcGxhdGVJZCA9IGNhY2hlS2V5LnN1YnN0cmluZyh5ICsgMSk7CgogICAgICAgIHZhciBzY29wZUlkZW50aWZpZXIgPSBjYWNoZUtleS5zdWJzdHJpbmcoeCArIDEsIHkpOwoKICAgICAgICB2YXIgeiA9IHNjb3BlSWRlbnRpZmllci5pbmRleE9mKCI6Iik7CgogICAgICAgIHBhcnRzLnNjb3BlVHlwZSA9IHNjb3BlSWRlbnRpZmllci5zdWJzdHJpbmcoMCwgeik7CiAgICAgICAgcGFydHMuc2NvcGVJZCA9IHNjb3BlSWRlbnRpZmllci5zdWJzdHJpbmcoeisxKTsKCiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgfTsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgZGF0YSBvYmplY3QgZm9yIGEgZ2l2ZW4gSlNPTiBzY2hlbWEuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtYQogICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAqLwogICAgQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlID0gZnVuY3Rpb24oc2NoZW1hKQogICAgewogICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICAvKioKICAgICAqIFN3YXBzIHR3byBkaXZzIHZpc3VhbGx5IGFuZCB0aGVuIGZpcmVzIGEgY2FsbGJhY2suCiAgICAgKgogICAgICogQHBhcmFtIHNvdXJjZQogICAgICogQHBhcmFtIHRhcmdldAogICAgICogQHBhcmFtIGR1cmF0aW9uCiAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAqLwogICAgQWxwYWNhLmFuaW1hdGVkU3dhcCA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihkdXJhdGlvbikgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkdXJhdGlvbjsKICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgfQoKICAgICAgICB2YXIgX2FuaW1hdGUgPSBmdW5jdGlvbihhLCBiLCBkdXJhdGlvbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZnJvbSA9ICQoYSksCiAgICAgICAgICAgICAgICBkZXN0ID0gJChiKSwKICAgICAgICAgICAgICAgIGZyb21fcG9zID0gZnJvbS5vZmZzZXQoKSwKICAgICAgICAgICAgICAgIGRlc3RfcG9zID0gZGVzdC5vZmZzZXQoKSwKICAgICAgICAgICAgICAgIGZyb21fY2xvbmUgPSBmcm9tLmNsb25lKCksCiAgICAgICAgICAgICAgICBkZXN0X2Nsb25lID0gZGVzdC5jbG9uZSgpLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfdmVydGljYWwgICA9IGRlc3RfcG9zLnRvcCArIGRlc3QuaGVpZ2h0KCkgLSBmcm9tX3Bvcy50b3AsCiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgICAgPSAwLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfaG9yaXpvbnRhbCA9IGRlc3RfcG9zLmxlZnQgKyBkZXN0LndpZHRoKCkgLSBmcm9tX3Bvcy5sZWZ0LAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgID0gMDsKCiAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMCk7CiAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmluc2VydEFmdGVyKGZyb20pLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBmcm9tLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBmcm9tLm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZnJvbV9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKICAgICAgICAgICAgZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgZGVzdF9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sIGR1cmF0aW9uICsgMSk7CiAgICAgICAgfTsKCiAgICAgICAgX2FuaW1hdGUoc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogQW5pbWF0ZXMgdGhlIG1vdmVtZW50IG9mIGEgZGl2IHZpc3VhbGx5IGFuZCB0aGVuIGZpcmVzIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZE1vdmUgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lID0gZGVzdC5jbG9uZSgpLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfdmVydGljYWwgICA9IGRlc3RfcG9zLnRvcCArIGRlc3QuaGVpZ2h0KCkgLSBmcm9tX3Bvcy50b3AsCiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgICAgPSAwLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfaG9yaXpvbnRhbCA9IGRlc3RfcG9zLmxlZnQgKyBkZXN0LndpZHRoKCkgLSBmcm9tX3Bvcy5sZWZ0LAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgID0gMDsKCiAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMCk7CiAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmluc2VydEFmdGVyKGZyb20pLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBmcm9tLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBmcm9tLm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZnJvbV9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKICAgICAgICAgICAgLy9kZXN0X2Nsb25lLmluc2VydEFmdGVyKGRlc3QpLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBkZXN0Lm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBkZXN0Lm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZGVzdF9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKCiAgICAgICAgICAgIGlmKGZyb21fcG9zLnRvcCAhPT0gZGVzdF9wb3MudG9wKSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBmcm9tLmhlaWdodCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGRlc3QuaGVpZ2h0KCk7CiAgICAgICAgICAgIGlmKGZyb21fcG9zLmxlZnQgIT09IGRlc3RfcG9zLmxlZnQpIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBmcm9tLndpZHRoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGRlc3Qud2lkdGgoKTsKCiAgICAgICAgICAgIGZyb21fY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICIrPSIgKyByb3V0ZV9mcm9tX3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICIrPSIgKyByb3V0ZV9mcm9tX2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZGVzdC5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgZGVzdF9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIi09IiArIHJvdXRlX2Rlc3RfdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIi09IiArIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZyb21fY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAvL2Rlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCgogICAgQWxwYWNhLmZpcmVSZWFkeSA9IGZ1bmN0aW9uKF9maWVsZCkKICAgIHsKICAgICAgICBpZiAoX2ZpZWxkLmNoaWxkcmVuICYmIF9maWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBnKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoX2ZpZWxkLmNoaWxkcmVuW2ddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgX2ZpZWxkLnRyaWdnZXIoInJlYWR5Iik7CiAgICB9OwoKICAgIEFscGFjYS5yZWFkQ29va2llID0gZnVuY3Rpb24obmFtZSkKICAgIHsKICAgICAgICBmdW5jdGlvbiBfcmVhZENvb2tpZShuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG5hbWVFUSA9IG5hbWUgKyAiPSI7CiAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IGNhW2ldOwogICAgICAgICAgICAgICAgd2hpbGUgKGMuY2hhckF0KDApPT0nICcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYyA9IGMuc3Vic3RyaW5nKDEsYy5sZW5ndGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YnN0cmluZyhuYW1lRVEubGVuZ3RoLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlID0gX3JlYWRDb29raWUobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwoKICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkgPSBmdW5jdGlvbihiYXNlT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlcykgewoKICAgICAgICBpZiAodHlwZW9mKGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSkgPT09ICJ1bmRlZmluZWQiIHx8IGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSA9IFtdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLnB1c2godmFsdWVzW2ldKTsKICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5pbkFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gKCQuaW5BcnJheSh2YWwsIGFycmF5KSA+IC0xKTsKICAgIH07CgogICAgQWxwYWNhLmluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwgdmFsKQogICAgewogICAgICAgIHJldHVybiAkLmluQXJyYXkodmFsLCBhcnJheSk7CiAgICB9OwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIE1vbWVudC5qcyBzdGF0aWMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EubW9tZW50ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5tb21lbnQpIHsKICAgICAgICAgICAgICAgIEFscGFjYS5fbW9tZW50ID0gd2luZG93Lm1vbWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFBbHBhY2EuX21vbWVudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBtb21lbnQuanMgbGlicmFyeSBoYXMgbm90IGJlZW4gaW5jbHVkZWQsIGNhbm5vdCBwcm9kdWNlIG1vbWVudCBvYmplY3QiKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBbHBhY2EuX21vbWVudC5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIENTUkYgU3VwcG9ydAogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5DU1JGX1RPS0VOID0gbnVsbDsKICAgIEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUyA9IFsiQ1NSRi1UT0tFTiIsICJYU1JGLVRPS0VOIl07CiAgICBBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRSA9ICJYLUNTUkYtVE9LRU4iOwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIFNUQVRJQyBERUZBVUxUUwogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8vIHVzZSB0aGlzIHRvIHNldCB0aGUgZGVmYXVsdCAic3RpY2t5IiB0b29sYmFyIGJlaGF2aW9yCiAgICAvLyBzZXQgdG8gdHJ1ZSB0byBoYXZlIHRvb2xiYXJzIGFsd2F5cyBzdGljayBvciB1bmRlZmluZWQgdG8gaGF2ZSB0aGVtIGFwcGVhciBvbiBob3ZlcgogICAgQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5ID0gdW5kZWZpbmVkOwoKICAgIC8vIHVzZSB0aGlzIHRvIGhhdmUgaW52YWxpZCBtZXNzYWdlcyBzaG93IHVwIGZvciByZWFkLW9ubHkgZmllbGRzCiAgICBBbHBhY2Euc2hvd1JlYWRPbmx5SW52YWxpZFN0YXRlID0gZmFsc2U7CgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIENBQ0hFIElNUExFTUVOVEFUSU9OUwogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5jYWNoZXMgPSB7fTsKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlID0gZnVuY3Rpb24oaWQsIGNhY2hlRm4pCiAgICB7CiAgICAgICAgQWxwYWNhLmNhY2hlc1tpZF0gPSBjYWNoZUZuOwogICAgfTsKICAgIEFscGFjYS5nZXRDYWNoZSA9IGZ1bmN0aW9uKGlkKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuY2FjaGVzW2lkXTsKICAgIH07CgoKfSkoalF1ZXJ5KTsKCi8qanNoaW50IC1XMDE0ICovIC8vIGJhZCBsaW5lIGJyZWFraW5nCi8qanNoaW50IC1XMDA0ICovIC8vIGR1cGxpY2F0ZSB2YXJpYWJsZXMKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EubGlzdGVuZXJJZCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgeCA9IDA7CgogICAgICAgIHJldHVybiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImxpc3RlbmVyLSIgKyAoeCsrKTsKICAgICAgICB9OwogICAgfSgpOwoKICAgIC8qKgogICAgICogU3Vic2NyaWJlcyBhIGZ1bmN0aW9uIGhhbmRsZXIgdG8gYW4gb2JzZXJ2YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrRnVuY3Rpb24gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS5zdWJzY3JpYmUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CgogICAgICAgIHZhciBzY29wZSA9IG51bGw7CiAgICAgICAgdmFyIGlkID0gbnVsbDsKICAgICAgICB2YXIgbGlzdGVuZXIgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lciA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lciA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIHN1YnNjcmliZSBpZDogIiArIGlkKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBmdW5jdGlvbiBpZGVudGlmaWVyCiAgICAgICAgdmFyIGxpc3RlbmVySWQgPSBsaXN0ZW5lci5fbGZpZDsKICAgICAgICBpZiAoIWxpc3RlbmVySWQpIHsKICAgICAgICAgICAgbGlzdGVuZXJJZCA9IEFscGFjYS5saXN0ZW5lcklkKCk7CiAgICAgICAgICAgIGxpc3RlbmVyLl9sZmlkID0gbGlzdGVuZXJJZDsKICAgICAgICB9CgogICAgICAgIC8vIHdyYXAgZnVuY3Rpb24gaW50byBhIGNsb3N1cmUKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKHRoYXQpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSh0aGlzKTsKICAgICAgICBmdW5jLl9sZmlkID0gbGlzdGVuZXIuX2xmaWQ7CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIC8vIHRlbGwgdGhlIG9ic2VydmFibGUgdG8gc3Vic2NyaWJlCiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUobGlzdGVuZXJJZCwgZnVuYyk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBVbnN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIGZyb20gYW4gb2JzZXJ2YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBsaXN0ZW5lciBlaXRoZXIgdGhlIGZ1bmN0aW9uIG9yIGxpc3RlbmVyIGlkCiAgICAgKiBAcmV0dXJuIGRlc2NyaXB0b3IKICAgICAqLwogICAgQWxwYWNhLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyT3JJZCA9IG51bGw7CgogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXJPcklkID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxpc3RlbmVySWQgPSBsaXN0ZW5lck9ySWQ7CiAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGxpc3RlbmVySWQpKQogICAgICAgIHsKICAgICAgICAgICAgbGlzdGVuZXJJZCA9IGxpc3RlbmVySWQuX2xmaWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIGlkKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHVuc3Vic2NyaWJlCiAgICAgICAgb2JzZXJ2YWJsZS51bnN1YnNjcmliZShsaXN0ZW5lcklkKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInNjb3BlIjogc2NvcGUsCiAgICAgICAgICAgICJpZCI6IGlkLAogICAgICAgICAgICAibGlzdGVuZXJJZCI6IGxpc3RlbmVySWQKICAgICAgICB9OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldHMgb3Igc2V0cyBhbiBvYnNlcnZhYmxlIGluIHRoZSBnaXZlbiBzY29wZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqLwogICAgQWxwYWNhLm9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlOwogICAgICAgIHZhciBpZDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7CiAgICB9OwoKICAgIEFscGFjYS5jbGVhck9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlOwogICAgICAgIHZhciBpZDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgb2JzZXJ2YWJsZS5jbGVhcigpOwogICAgfTsKCiAgICAvKioKICAgICAqIERlY2xhcmVzIGFuZCBnZXRzIGEgZGVwZW5kZW50IG9ic2VydmFibGUgaW4gYSBnaXZlbiBzY29wZQogICAgICoKICAgICAqIEBwYXJhbSBzY29wZQogICAgICogQHBhcmFtIGlkCiAgICAgKiBAcGFyYW0gZnVuYwogICAgICovCiAgICBBbHBhY2EuZGVwZW5kZW50T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGZ1bmMgPSBudWxsOwoKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBmdW5jID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBmdW5jID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EuZXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBKU09OLnN0cmluZ2lmeShhcmdzKSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKCiAgICAgICAgcmV0dXJuIG9ic2VydmFibGVzLmRlcGVuZGVudE9ic2VydmFibGUoaWQsIGZ1bmMpOwogICAgfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBDb2xsZWN0aW9uIG9mIG9ic2VydmFibGVzLgogICAgICovCiAgICBBbHBhY2EuT2JzZXJ2YWJsZXMgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKCiAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSB7fTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlOiBmdW5jdGlvbihpZCwgaW5pdGlhbFZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9ic2VydmFibGVzW2lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgQWxwYWNhLk9ic2VydmFibGUodGhpcy5zY29wZSwgaWQpOwoKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsVmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXQoaW5pdGlhbFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzW2lkXSA9IG9ic2VydmFibGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmQgYmFjayBmcm9tIG1hcAogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9ic2VydmFibGVzW2lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSB0aGlzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAgICAgICAgIC8vIHdyYXAgdGhlIG1vZGVsCiAgICAgICAgICAgICAgICB2YXIgbSA9IG5ldyBBbHBhY2EuT2JzZXJ2YWJsZXModGhpcy5zY29wZSk7CiAgICAgICAgICAgICAgICBtLm9ic2VydmFibGUgPSBmdW5jdGlvbih4LCB5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vUmF0Y2hldC5kZWJ1ZygiT2JzZXJ2YWJsZTogIiArIG9ic2VydmFibGUuaWQgKyAiIGRlcGVuZHMgb24gb2JzZXJ2YWJsZTogIiArIHgpOwogICAgICAgICAgICAgICAgICAgIHZhciBvID0gX3RoaXMub2JzZXJ2YWJsZSh4LCB5KTsKICAgICAgICAgICAgICAgICAgICBvLm1hcmtEZXBlbmRlbnRPblVzKG9ic2VydmFibGUpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB2YWx1ZSBmdW5jdGlvbiAod2hlcmUgInRoaXMiID0gdGhlIG1vZGVsKQogICAgICAgICAgICAgICAgdmFyIHZhbHVlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKG0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzW2lkXTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXM7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuT2JzZXJ2YWJsZSA9IEJhc2UuZXh0ZW5kKAogICAgewogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihzY29wZSwgaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gc2NvcGUgKyAiLSIgKyBpZDsKCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0ge307CgogICAgICAgICAgICAvLyBhcnJheSB0aGF0IGNvbnRhaW5zIG9ic2VydmFibGUgd2hvc2UgdmFsdWUgaXMgZGVwZW5kZW50IG9uIG91ciB2YWx1ZQogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXMgPSB7fTsKCgogICAgICAgICAgICAvLyBwcml2aWxlZ2VkIGZ1bmN0aW9ucwoKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLnN1YnNjcmliZXJzLCBmdW5jdGlvbihpZCwgaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoX3RoaXMudmFsdWUsIHByaW9yKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzID0gZnVuY3Rpb24ocHJpb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLmRlcGVuZGVudE9uVXMsIGZ1bmN0aW9uKGtleSwgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkRlcGVuZGVuY3lDaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYXNzdW1lIG51bGwgdmFsdWUgZnVuY3Rpb24KICAgICAgICAgICAgdGhpcy52YWx1ZUZ1bmN0aW9uID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZUZ1bmN0aW9uOiBmdW5jdGlvbih2YWx1ZUZ1bmN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52YWx1ZUZ1bmN0aW9uID0gdmFsdWVGdW5jdGlvbjsKICAgICAgICAgICAgdGhpcy5vbkRlcGVuZGVuY3lDaGFuZ2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIHdoaWNoIGFjdHMgYXMgYSBzdWJzY3JpYmVyLiAgV2hlbiB0aGlzIG9ic2VydmFibGUgdmFsdWUgY2hhbmdlcywKICAgICAgICAgKiB0aGUgaGFuZGxlciBtZXRob2QgaXMgcmFpc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGYKICAgICAgICAgKi8KICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKGlkLCBoYW5kbGVyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3Vic2NyaWJlZChpZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnNbaWRdID0gaGFuZGxlcjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN1YnNjcmliZXJzW2lkXTsKICAgICAgICB9LAoKICAgICAgICBpc1N1YnNjcmliZWQ6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLnN1YnNjcmliZXJzW2lkXSA/IHRydWU6IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBtYXJrRGVwZW5kZW50T25VczogZnVuY3Rpb24ob2JzZXJ2YWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW50T25Vc1tvYnNlcnZhYmxlLmlkXSA9IG9ic2VydmFibGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiBvbmUgb2Ygb3VyIGRlcGVuZGVudHMgaGFzIGNoYW5nZWQgaXRzIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW5jeUNoYW5nZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHByaW9yID0gdGhpcy5nZXQoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSB2YWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiwgZmlyZSBpdAogICAgICAgICAgICBpZiAodGhpcy52YWx1ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMudmFsdWVGdW5jdGlvbigpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkLCBub3RpZnkKICAgICAgICAgICAgICAgIGlmIChwcmlvciAhPSBjdXJyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGN1cnJlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0OiBmdW5jdGlvbihfZGVmYXVsdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2ID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgaWYgKCF2KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ID0gX2RlZmF1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgLy8gbm90aWZ5IGFsbCBkZXBlbmRlbnRzIChvYnNlcnZlcnMgdGhhdCBkZXBlbmQgb24gb3VyIHZhbHVlKQogICAgICAgICAgICB0aGlzLm5vdGlmeURlcGVuZGVudHMocHJpb3IpOwoKICAgICAgICAgICAgLy8gbm90aWZ5IGFsbCBzdWJzY3JpYmVycyBvZiB0aGUgdXBkYXRlZCB2YWx1ZQogICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKHByaW9yKTsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcyA9IHt9OwogICAgQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcCA9IHt9OwoKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQgPSBmdW5jdGlvbihzY29wZSkKICAgIHsKICAgICAgICBpZiAoIUFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHNjb3BlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXTsKICAgIH07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCkKewogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciByZWdpc3RyeSA9IHt9OwoKICAgICAgICByZXR1cm4gewoKICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGlkLCBlbmdpbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlZ2lzdHJ5W2lkXSA9IGVuZ2luZTsKCiAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmluZDogZnVuY3Rpb24oaWRPclR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeVtpZE9yVHlwZV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRPclR5cGVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc3BlY3QgYnkgdHlwZQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1cHBvcnRlZE1pbWV0eXBlcyA9IHJlZ2lzdHJ5W2lkXS5zdXBwb3J0ZWRNaW1ldHlwZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBwb3J0ZWRNaW1ldHlwZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZE9yVHlwZS50b0xvd2VyQ2FzZSgpID09PSBzdXBwb3J0ZWRNaW1ldHlwZXNbaV0udG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUgPSByZWdpc3RyeVtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGlkczogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaWRzID0gW107CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gcmVnaXN0cnkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goaWQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBpZHM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoKTsKCn0pKCk7CgooZnVuY3Rpb24oJCkKewogICAgQWxwYWNhLkFic3RyYWN0VGVtcGxhdGVFbmdpbmUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKCiAgICAgICAgICAgIHRoaXMuY2xlYW51cCA9IGZ1bmN0aW9uKGh0bWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChodG1sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGlmIHN0YXJ0cyB3aXRoIGEgc2NyaXB0IHRhZywgdGhlbiB3ZSBzdHJpcCB0aGF0IG91dAogICAgICAgICAgICAgICAgICAgIGlmICgkKGh0bWwpLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGh0bWwpWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJzY3JpcHQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChodG1sKS5odG1sKCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiB0ZW1wbGF0ZSAob3IgVVJJIG9yIGRvbSBzZWxlY3RvcikKICAgICAgICAgKgogICAgICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCBvbmNlIHRoZSBjb21waWxlIGNvbXBsZXRlcyBhbmQgaGFzIHNpZ25hdHVyZSBjYWxsYmFjayhlcnIpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgY29ubmVjdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBiZWluZyBjb21waWxlZCBjYW4gYmUKICAgICAgICAgICAgLy8gICBIVE1MCiAgICAgICAgICAgIC8vICAgVVJMIChodHRwLCAuLyBvciAvKQogICAgICAgICAgICAvLyAgIGRvbSBzZWxlY3RvciAoI2FiYywgLmNsYXNzbmFtZSkKICAgICAgICAgICAgLy8gICBkb20gZWxlbWVudAoKICAgICAgICAgICAgLy8gaGVyZSB3ZSB0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB2YWx1ZSBpdCBpcwogICAgICAgICAgICB2YXIgdHlwZSA9ICJodG1sIjsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh0ZW1wbGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsYyA9IHRlbXBsYXRlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKGxjKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInVyaSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZS5pbmRleE9mKCIjIikgPT09IDAgfHwgdGVtcGxhdGUuaW5kZXhPZigiLiIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIlsiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdG9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkb20gZWxlbWVudCwgd2UgZmxvdyB0aHJvdWdoCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG5vdyBleHRyYWN0IGh0bWwgYW5kIGNvbXBpbGUKICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzZWxlY3RvciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIHRlbXBsYXRlLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gInVyaSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlRXh0ZW5zaW9uID0gc2VsZi5maWxlRXh0ZW5zaW9uKCk7CgogICAgICAgICAgICAgICAgdmFyIHVybCA9IHRlbXBsYXRlOwogICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCIuIiArIGZpbGVFeHRlbnNpb24pID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHVybCArPSAiLiIgKyBmaWxlRXh0ZW5zaW9uOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIHRlbXBsYXRlIHVzaW5nIHRoZSBjb25uZWN0b3IKICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkVGVtcGxhdGUodXJsLCBmdW5jdGlvbihodG1sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgaHRtbAogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBzZWxmLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogdXJsLAogICAgICAgICAgICAgICAgICAgICJkYXRhVHlwZSI6ICJodG1sIiwKICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyI6IGZ1bmN0aW9uKGh0bWwsIGNvZGUsIHhocikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgaHRtbAogICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29tcGlsZShjYWNoZUtleSwgaHRtbCwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKHhociwgY29kZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogeGhyLnJlc3BvbnNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHIiOiB4aHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZSI6IGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJodG1sIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmIChodG1sIGluc3RhbmNlb2YgalF1ZXJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSAkKGh0bWwpLm91dGVySFRNTCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcigiVGVtcGxhdGUgZW5naW5lIGNhbm5vdCBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0eXBlOiAiICsgdHlwZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGZvciBudWxsIHRlbXBsYXRlcywgc2V0IHRvIGVtcHR5IHN0cmluZwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoaHRtbCkpIHsKICAgICAgICAgICAgICAgIGh0bWwgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJpbSB0aGUgaHRtbAogICAgICAgICAgICBodG1sID0gQWxwYWNhLnRyaW0oaHRtbCk7CgogICAgICAgICAgICBpZiAoaHRtbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIjxzY3JpcHQiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXMgc2NyaXB0IHRhZwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXBwbHkgc2NyaXB0IHRhZwogICAgICAgICAgICAgICAgaHRtbCA9ICI8c2NyaXB0IHR5cGU9JyIgKyB0aGlzLnN1cHBvcnRlZE1pbWV0eXBlcygpWzBdICsgIic+IiArIGh0bWwgKyAiPC9zY3JpcHQ+IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJDb21waWxpbmcgdGVtcGxhdGU6ICIgKyB0aGlzLmlkICsgIiwgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIsIHRlbXBsYXRlOiAiICsgaHRtbCk7CgogICAgICAgICAgICB0aGlzLmRvQ29tcGlsZShjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBleHRlbnNpb25fcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSBodG1sCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgZG9Db21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRXhlY3V0aW5nIHRlbXBsYXRlIGZvciBjYWNoZSBrZXk6ICIgKyBjYWNoZUtleSk7CgogICAgICAgICAgICB2YXIgaHRtbCA9IHRoaXMuZG9FeGVjdXRlKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjayk7CgogICAgICAgICAgICAvLyByZW1vdmVzIHdyYXBwaW5nIDxzY3JpcHQvPiB0YWcKICAgICAgICAgICAgaHRtbCA9IHRoaXMuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGUgYSB0ZW1wbGF0ZSBhbmQgaGFuZCBiYWNrIGEgdGV4dCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvRXhlY3V0ZTogZnVuY3Rpb24oY2FjaGVLZXksIG1vZGVsLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgZXhwZWN0ZWQgZmlsZSBleHRlbnNpb24gZm9yIHRlbXBsYXRlcyBsb2FkZWQgdmlhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kcyBiYWNrIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc2NyaXB0IHRhZyB0eXBlcyBmb3IgdGVtcGxhdGVzIGxvYWRlZCBmcm9tIHRoZSBET00uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhpc3RpbmcgdGVtcGxhdGUgaXMgYWxyZWFkeSBpbiBjYWNoZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqLwogICAgICAgIGlzQ2FjaGVkOiBmdW5jdGlvbihjYWNoZUtleSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBY3F1aXJlcyBhbiBhcnJheSBvZiBjYWNoZSBrZXlzIG1hdGNoaW5nIHRoZSB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXdJZAogICAgICAgICAqLwogICAgICAgIGZpbmRDYWNoZUtleXM6IGZ1bmN0aW9uKHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQsIEhhbmRsZWJhcnMsIEhhbmRsZWJhcnNQcmVjb21waWxlZCkKewogICAgLy8gcnVudGltZSBjYWNoZSBvZiBwcmVjb21waWxlZCB0ZW1wbGF0ZXMga2V5ZWQgYnkgY2FjaGVLZXkKICAgIHZhciBDT01QSUxFRF9URU1QTEFURVMgPSB7fTsKCiAgICB2YXIgaGVscGVycyA9IHt9OwogICAgaGVscGVyc1siY29tcGFyZSJdID0gZnVuY3Rpb24obHZhbHVlLCBydmFsdWUsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSGFuZGxlcmJhcnMgSGVscGVyICdjb21wYXJlJyBuZWVkcyAyIHBhcmFtZXRlcnMiKTsKICAgICAgICB9CgogICAgICAgIHZhciBvcGVyYXRvciA9IG9wdGlvbnMuaGFzaC5vcGVyYXRvciB8fCAiPT0iOwoKICAgICAgICB2YXIgb3BlcmF0b3JzID0gewogICAgICAgICAgICAnPT0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT0gcjsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICc9PT0nOiAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA9PT0gcjsgfSwKICAgICAgICAgICAgJyE9JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnIT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgIT09IHI7IH0sCiAgICAgICAgICAgICc8JzogICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA8IHI7IH0sCiAgICAgICAgICAgICc+JzogICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA+IHI7IH0sCiAgICAgICAgICAgICc8PSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA8PSByOyB9LAogICAgICAgICAgICAnPj0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPj0gcjsgfSwKICAgICAgICAgICAgJ3R5cGVvZic6ICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiB0eXBlb2YgbCA9PSByOyB9IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIH07CgogICAgICAgIGlmICghb3BlcmF0b3JzW29wZXJhdG9yXSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgZG9lc24ndCBrbm93IHRoZSBvcGVyYXRvciAiK29wZXJhdG9yKTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBvcGVyYXRvcnNbb3BlcmF0b3JdKGx2YWx1ZSxydmFsdWUpOwoKICAgICAgICBpZiggcmVzdWx0ICkgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpOwogICAgICAgIH0KICAgIH07CiAgICBoZWxwZXJzWyJpZm5vdCJdID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpOwogICAgICAgIH0KICAgIH07CiAgICBoZWxwZXJzWyJ0aW1lcyJdID0gZnVuY3Rpb24obiwgYmxvY2spIHsKICAgICAgICB2YXIgYWNjdW0gPSAnJzsKICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgYWNjdW0gKz0gYmxvY2suZm4oaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bTsKICAgIH07CiAgICBoZWxwZXJzWyJjb250cm9sIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJpdGVtIl0gPSBmdW5jdGlvbih0YWcsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0YWcpKQogICAgICAgIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHRhZzsKICAgICAgICAgICAgdGFnID0gImRpdiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIjwiICsgdGFnICsgIiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU0gKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0tFWSArICI9JyIgKyB0aGlzLm5hbWUgKyAiJz48LyIgKyB0YWcgKyAiPiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbUZpZWxkIl0gPSBmdW5jdGlvbih0YWcsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0YWcpKQogICAgICAgIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHRhZzsKICAgICAgICAgICAgdGFnID0gImRpdiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIjwiICsgdGFnICsgIiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQgKyAiJz48LyIgKyB0YWcgKyAiPiI7CiAgICB9OwogICAgaGVscGVyc1siZm9ybUl0ZW1zIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaW5zZXJ0Il0gPSBmdW5jdGlvbihrZXkpCiAgICB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19JTlNFUlQgKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0lOU0VSVF9LRVkgKyAiPSciICsga2V5ICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJzdHIiXSA9IGZ1bmN0aW9uKGRhdGEpCiAgICB7CiAgICAgICAgaWYgKGRhdGEgPT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmYWxzZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRhdGEgPT09IHRydWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gInRydWUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIwIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mKGRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAiICAiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSA9IGZ1bmN0aW9uKG9wdGlvbnMpCiAgICB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9UT09MQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHRoaXMuaWQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHZhciBodG1sID0gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyB0aGlzLm5hbWUgKyAiJyI7CiAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIiciOwogICAgICAgIGlmICh0aGlzLnBhcmVudEZpZWxkSWQpCiAgICAgICAgewogICAgICAgICAgICBodG1sICs9ICIgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX1BBUkVOVF9GSUVMRF9JRCArICI9JyIgKyB0aGlzLnBhcmVudEZpZWxkSWQgKyAiJyIKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAiPjwvZGl2PiI7CgogICAgICAgIHJldHVybiBodG1sOwogICAgfTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImFycmF5VG9vbGJhciIsIGhlbHBlcnNbImFycmF5VG9vbGJhciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImFycmF5QWN0aW9uYmFyIiwgaGVscGVyc1siYXJyYXlBY3Rpb25iYXIiXSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigic2V0SW5kZXgiLCBmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgdGhpcy5pbmRleCA9IE51bWJlcih2YWx1ZSk7CiAgICB9KTsKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJlYWNoUHJvcGVydHkiLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHJldCA9ICIiOwogICAgICAgIGZvcih2YXIgcHJvcCBpbiBjb250ZXh0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gcmV0ICsgb3B0aW9ucy5mbih7a2V5OnByb3AsdmFsdWU6Y29udGV4dFtwcm9wXX0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfSk7CgoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInVwbG9hZEVycm9yTWVzc2FnZSIsIGZ1bmN0aW9uKGVycm9yKSB7CgogICAgICAgIHZhciBtZXNzYWdlID0gZXJyb3I7CgogICAgICAgIGlmIChlcnJvciA9PT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBleGNlZWRzIHVwbG9hZF9tYXhfZmlsZXNpemUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gMikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBleGNlZWRzIE1BWF9GSUxFX1NJWkUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gMykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB3YXMgb25seSBwYXJ0aWFsbHkgdXBsb2FkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNCkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTm8gRmlsZSB3YXMgdXBsb2FkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTWlzc2luZyBhIHRlbXBvcmFyeSBmb2xkZXIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIHdyaXRlIGZpbGUgdG8gZGlzayI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSA3KQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxlIHVwbG9hZCBzdG9wcGVkIGJ5IGV4dGVuc2lvbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4RmlsZVNpemUiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxlIGlzIHRvbyBiaWciOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1pbkZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gc21hbGwiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gImFjY2VwdEZpbGVUeXBlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGV0eXBlIG5vdCBhbGxvd2VkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtYXhOdW1iZXJPZkZpbGVzIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTWF4IG51bWJlciBvZiBmaWxlcyBleGNlZWRlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAidXBsb2FkZWRCeXRlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIlVwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gImVtcHR5UmVzdWx0IikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRW1wdHkgZmlsZSB1cGxvYWQgcmVzdWx0IjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZGlzZ3Vpc2UiLCBmdW5jdGlvbih0ZXh0LCBjaGFyYWN0ZXIpIHsKCiAgICAgICAgdmFyIHJlcGxhY2VkID0gIiI7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlcGxhY2VkICs9IGNoYXJhY3RlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXBsYWNlZDsKCiAgICB9KTsKCgoKICAgIC8vSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaCIsIGhlbHBlcnNbImVhY2giXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb21wYXJlIiwgaGVscGVyc1siY29tcGFyZSJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRyb2wiLCBoZWxwZXJzWyJjb250cm9sIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29udGFpbmVyIiwgaGVscGVyc1siY29udGFpbmVyIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbSIsIGhlbHBlcnNbIml0ZW0iXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJpdGVtRmllbGQiLCBoZWxwZXJzWyJpdGVtRmllbGQiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJmb3JtSXRlbXMiLCBoZWxwZXJzWyJmb3JtSXRlbXMiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ0aW1lcyIsIGhlbHBlcnNbInRpbWVzIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigic3RyIiwgaGVscGVyc1sic3RyIl0pOwoKICAgIC8vIHdpdGgKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7CiAgICB9KTsKCiAgICAvLyBpZm5vdAogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaWZub3QiLCBoZWxwZXJzWyJpZm5vdCJdKTsKCiAgICB2YXIgcGFydGlhbHMgPSB7fTsKCiAgICBBbHBhY2EuSGFuZGxlYmFyc1RlbXBsYXRlRW5naW5lID0gQWxwYWNhLkFic3RyYWN0VGVtcGxhdGVFbmdpbmUuZXh0ZW5kKAogICAgewogICAgICAgIGZpbGVFeHRlbnNpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImh0bWwiOwogICAgICAgIH0sCgogICAgICAgIHN1cHBvcnRlZE1pbWV0eXBlczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdG1wbCIKICAgICAgICAgICAgXTsKICAgICAgICB9LAoKICAgICAgICBpbml0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhdXRvIGRpc2NvdmVyIGFueSBwcmVjb21waWxlZCB0ZW1wbGF0ZXMgYW5kIHN0b3JlIHRoZW0gYnkgY2FjaGUga2V5IGhlcmUKICAgICAgICAgICAgaWYgKEhhbmRsZWJhcnNQcmVjb21waWxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIEhhbmRsZWJhcnNQcmVjb21waWxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlcyA9IEhhbmRsZWJhcnNQcmVjb21waWxlZFt2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdmlld1RlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXdUZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGVtcGxhdGUpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlld0lkLCAidmlldyIsIHZpZXdJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVEX1RFTVBMQVRFU1tjYWNoZUtleV0gPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvblN0cmluZyA9IEhhbmRsZWJhcnMucHJlY29tcGlsZShodG1sKTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXZhbCgiKCIgKyBmdW5jdGlvblN0cmluZyArICIpIik7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZnVuY3Rpb24gLSBmbihtb2RlbCkKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh0ZW1wbGF0ZSk7CgogICAgICAgICAgICAgICAgLy8gQ0FDSEU6IHdyaXRlCiAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvRXhlY3V0ZTogZnVuY3Rpb24oY2FjaGVLZXksIG1vZGVsLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gQ0FDSEU6IHJlYWQKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRnVuY3Rpb24gPSBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldOwogICAgICAgICAgICBpZiAoIXRlbXBsYXRlRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sobmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBoYW5kbGViYXJzIGNhY2hlZCB0ZW1wbGF0ZSBmb3Iga2V5OiAiICsgY2FjaGVLZXkpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcmVuZGVyIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBodG1sID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGh0bWwgPSB0ZW1wbGF0ZUZ1bmN0aW9uKG1vZGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKENPTVBJTEVEX1RFTVBMQVRFU1tjYWNoZUtleV0gPyB0cnVlICA6IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2FjaGVLZXlzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBjYWNoZUtleSBpbiBDT01QSUxFRF9URU1QTEFURVMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZUtleS5pbmRleE9mKHZpZXdJZCArICI6IikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXlzLnB1c2goY2FjaGVLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY2FjaGVLZXlzOwogICAgICAgIH0KCiAgICB9KTsKCiAgICAvLyBhdXRvIHJlZ2lzdGVyCiAgICBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5yZWdpc3RlcigiaGFuZGxlYmFycyIsIG5ldyBBbHBhY2EuSGFuZGxlYmFyc1RlbXBsYXRlRW5naW5lKCJoYW5kbGViYXJzIikpOwoKfSkoalF1ZXJ5LCAoKHR5cGVvZihIYW5kbGViYXJzKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzIDogd2luZG93LkhhbmRsZWJhcnMpLCAoKHR5cGVvZihIYW5kbGViYXJzUHJlY29tcGlsZWQpICE9ICJ1bmRlZmluZWQiKSA/IEhhbmRsZWJhcnNQcmVjb21waWxlZCA6IHdpbmRvdy5IYW5kbGViYXJzUHJlY29tcGlsZWQpKTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Ob3JtYWxpemVkVmlldyA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3LnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogT25jZSBhbGwgb2YgdGhlIEFscGFjYSB2aWV3cyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmcmFtZXdvcmssIGVhY2ggaXMgbm9ybWFsaXplZCBzbyB0aGF0IHBhcmVudC1jaGFpbgogICAgICAgICAqIHJlZmVyZW5jZXMgYW5kIG92ZXJyaWRlcyBhcmUgbm9ybWFsaXplZCBpbnRvIGEgc2luZ2xlLCBmYXN0IGxvb2t1cCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIE5vcm1hbGl6ZWQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbih2aWV3SWQpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBOb3JtYWxpemF0aW9uIG9jY3VycyBvbmNlIHBlciB2aWV3IHVwb24gc3RhcnR1cCBvZiBBbHBhY2EuCiAgICAgICAgICovCiAgICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbih2aWV3cykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGxvYWQgdGhlIHZpZXcgb2JqZWN0CiAgICAgICAgICAgIHZhciB2aWV3T2JqZWN0ICA9IHZpZXdzW3RoaXMuaWRdOwogICAgICAgICAgICBpZiAoIXZpZXdPYmplY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSB2aWV3IG5vdCBmb3VuZDogIiArIHRoaXMuaWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb2xsZWN0IHRoZSBpbmhlcml0YW5jZSBjaGFpbgogICAgICAgICAgICB2YXIgY2hhaW4gPSBbXTsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB2aWV3T2JqZWN0OwogICAgICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICAgICAgY2hhaW4ucHVzaChjdXJyZW50KTsKCiAgICAgICAgICAgICAgICB2YXIgcGFyZW50SWQgPSBjdXJyZW50LnBhcmVudDsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSB2aWV3c1tjdXJyZW50LnBhcmVudF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJWaWV3IGNvbXBpbGF0aW9uIGZhaWxlZCAtIGNhbm5vdCBmaW5kIHBhcmVudCB2aWV3OiAiICsgcGFyZW50SWQgKyAiIGZvciB2aWV3OiAiICsgY3VycmVudC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcmV2ZXJzZSB0aGUgY2hhaW4KICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi5yZXZlcnNlKCk7CgogICAgICAgICAgICB2YXIgc2V0U2NhbGFyID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIHByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSAmJiAhQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkICsgIiBhbHJlYWR5IGhhcyB2YWx1ZTogIiArIGN1cnJlbnRWYWx1ZSArICIgYW5kIG92ZXJ3cml0aW5nIHRvOiAiICsgdmFsdWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eUlkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHNldEZ1bmN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIHByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSAmJiAhQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkICsgIiBhbHJlYWR5IGhhcyBmdW5jdGlvbiwgb3ZlcndyaXRpbmciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBtZXJnZU1hcCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwID0gc291cmNlW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZU1hcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwcm9wZXJ0eUlkXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eUlkXSA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0Mihzb3VyY2VNYXAsIHRhcmdldFtwcm9wZXJ0eUlkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQgYW5kIGFwcGx5CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gY2hhaW5baV07CgogICAgICAgICAgICAgICAgLy8gY29yZSBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInR5cGUiKTsgLy8gdmlldywgZWRpdCwgY3JlYXRlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInVpIik7IC8vIGJvb3RzdHJhcCwganF1ZXJ5dWksIGpxdWVyeW1vYmlsZSwgd2ViCgogICAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGUgdmlldyBpcyByZWFkb25seQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJkaXNwbGF5UmVhZG9ubHkiKTsKCiAgICAgICAgICAgICAgICAvLyBsb2NhbGUKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibG9jYWxlIik7CgogICAgICAgICAgICAgICAgLy8gZnVuY3Rpb25zCiAgICAgICAgICAgICAgICBzZXRGdW5jdGlvbih0aGlzLCBlbGVtZW50LCAicmVuZGVyIik7CiAgICAgICAgICAgICAgICBzZXRGdW5jdGlvbih0aGlzLCBlbGVtZW50LCAicG9zdFJlbmRlciIpOwoKICAgICAgICAgICAgICAgIC8vIHZpZXcgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAidGVtcGxhdGVzIik7CgogICAgICAgICAgICAgICAgLy8gZmllbGQgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAiZmllbGRzIik7CgogICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibGF5b3V0Iik7CgogICAgICAgICAgICAgICAgLy8gc3R5bGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAic3R5bGVzIik7CgogICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAiY2FsbGJhY2tzIik7CgogICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgIG1lcmdlTWFwKHRoaXMsIGVsZW1lbnQsICJtZXNzYWdlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWwKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiaG9yaXpvbnRhbCIpOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBzb21lIG9mIHRoZXNlPwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJsZWdlbmRTdHlsZSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0b29sYmFyU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiYnV0dG9uU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0aWNreSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJnbG9iYWxUZW1wbGF0ZSIpOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB3aXphcmQ/CiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAid2l6YXJkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVmlldyBjb21waWxhdGlvbiBjb21wbGV0ZSBmb3IgdmlldzogIiArIHRoaXMuaWQpOwogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpbmFsIHZpZXc6ICIpOwogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcywgbnVsbCwgIiAgICIpKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0pOwp9KShqUXVlcnkpOwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5SdW50aW1lVmlldyA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLlJ1bnRpbWVWaWV3LnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogUnVudGltZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpZXcgYXMgYXBwbGllZCB0byBhIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhY2Nlc3NvcnMgaW50byB0aGUgbmVzdGVkIGJlaGF2aW9ycyBvZiB2aWV3cyBhbmQgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgZmllbGQtbGV2ZWwgYXR0cmlidXRlcwogICAgICAgICAqIG9mIHRoZSBjdXJyZW50bHkgcmVuZGVyaW5nIGRvbSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDbGFzcyBmb3IgbWFuYWdpbmcgdmlldyBjb21wb25lbnRzIHN1Y2ggYXMgbGF5b3V0LCB0ZW1wbGF0ZSwgbWVzc2FnZSBldGMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGQgdGhlIGZpZWxkIGNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkLCBmaWVsZCkgewogICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CiAgICAgICAgICAgIHRoaXMuc2V0Vmlldyh2aWV3SWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZpZXcgdGhhdCB0aGlzIHJ1bnRpbWUgdmlldyBhZGFwdGVycyBzaG91bGQgY29uc3VsdCBkdXJpbmcgcmVuZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgc2V0VmlldzogZnVuY3Rpb24gKHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBmaWVsZCBjbGFzc2VzIGV2ZXIgcmVhbGx5IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseT8KICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBsZWZ0IGluIHRvIHN1cHBvcnQgQWxwYWNhIGRvY3MgZ2VuZXJhdGlvbiAobmVlZCB0byBjbGVhbiB0aGlzIHVwKXMKICAgICAgICAgICAgLy8gaWYgYSB2aWV3IGlzIG5vdCBzZXQgYXQgdGhpcyBwb2ludCBpdCBwcm9iYWJseSBtZWFucyB0aGV5IGluc3RhbnRpYXRlZCBhIGZpZWxkIGRpcmVjdGx5CiAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UsIHdlJ2xsIGp1c3QgcGljayB0aGUgZGVmYXVsdCB2aWV3CiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAgIndlYi1lZGl0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIG5vcm1hbGl6ZWQgdmlldwogICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBBbHBhY2EuZ2V0Tm9ybWFsaXplZFZpZXcodmlld0lkKTsKICAgICAgICAgICAgaWYgKCFub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgdGhlIGNhc2UKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUnVudGltZSB2aWV3IGZvciB2aWV3IGlkOiAiICsgdmlld0lkICsgIiBjb3VsZCBub3QgZmluZCBhIG5vcm1hbGl6ZWQgdmlldyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IGNvbXBpbGVkIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKHZhciBrIGluIG5vcm1hbGl6ZWRWaWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXcuaGFzT3duUHJvcGVydHkoaykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW2tdID0gbm9ybWFsaXplZFZpZXdba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVmlldyB3aXphcmQgc2V0dGluZ3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0V2l6YXJkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRWaWV3UGFyYW0oIndpemFyZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGdsb2JhbCBsYXlvdXQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fFN0cmluZ30gR2xvYmFsIGxheW91dCB0ZW1wbGF0ZSBzZXR0aW5nIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGdldEdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImdsb2JhbFRlbXBsYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBsYXlvdXQgdGVtcGxhdGUgYW5kIGJpbmRpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncyBzZXR0aW5nIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGdldExheW91dDogZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAidGVtcGxhdGVEZXNjcmlwdG9yIjogdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImxheW91dFRlbXBsYXRlIiwgc2VsZiksCiAgICAgICAgICAgICAgICAiYmluZGluZ3MiOiB0aGlzLmdldFZpZXdQYXJhbShbImxheW91dCIsImJpbmRpbmdzIl0sIHRydWUpCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgY29tcGlsZWQgdGVtcGxhdGUgaWQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZCAob3B0aW9uYWwpCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbih0ZW1wbGF0ZUlkLCBmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRoaXMsIHRlbXBsYXRlSWQsIGZpZWxkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBpZAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VJZCBNZXNzYWdlIGlkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBsb2NhbGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IE1lc3NhZ2UgbWFwcGVkIHRvIHRoZSBnaXZlbiBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRNZXNzYWdlIDogZnVuY3Rpb24gKG1lc3NhZ2VJZCwgbG9jYWxlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbWVzc2FnZUZvckxvY2FsZSA9IHRoaXMuZ2V0Vmlld1BhcmFtKFsibWVzc2FnZXMiLCBsb2NhbGUsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobWVzc2FnZUZvckxvY2FsZSkpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbWVzc2FnZUlkXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlRm9yTG9jYWxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB2aWV3IHBhcmFtZXRlciBiYXNlZCBvbiBjb25maWd1cmF0aW9uIElkIG9yIElkIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGNvbmZpZ0lkIENvbmZpZ3VyYXRpb24gaWQgb3IgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSBWaWV3IHBhcmFtZXRlciBtYXBwZWQgdG8gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBnZXRWaWV3UGFyYW06IGZ1bmN0aW9uIChjb25maWdJZCwgdG9wTGV2ZWxPbmx5KSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb29rIGZvciBleGFjdCBtYXRjaAogICAgICAgICAgICB2YXIgZmllbGRQYXRoID0gdGhpcy5maWVsZC5wYXRoOwogICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbZmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tmaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhcnJheSByZWxhdGVkIGZpZWxkIHBhdGggKHVzaW5nIFsqXSBzeW50YXgpICBpLmUuICAvYS9iWypdL2MvZFsqXS9lCiAgICAgICAgICAgIGlmIChmaWVsZFBhdGggJiYgZmllbGRQYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEgJiYgZmllbGRQYXRoLmluZGV4T2YoJ10nKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdGaWVsZFBhdGggPSBmaWVsZFBhdGgucmVwbGFjZSgvXFtcZCtcXS9nLCJbKl0iKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhcnJheSByZWxhdGVkIGZpZWxkIHBhdGggKHVzaW5nIHB1cmUgcGF0aCBzeW50YXgpICAgaS5lLiAvYS9iL2MvZC9lCiAgICAgICAgICAgIGlmIChmaWVsZFBhdGggJiYgZmllbGRQYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEgJiYgZmllbGRQYXRoLmluZGV4T2YoJ10nKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdGaWVsZFBhdGggPSBmaWVsZFBhdGgucmVwbGFjZSgvXFtcZCtcXS9nLCIiKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRvcExldmVsT25seSkgJiYgdG9wTGV2ZWxPbmx5ICYmIHRoaXMuZmllbGQucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLCBjb25maWdJZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBnZXR0aW5nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGNvbmZpZ1ZhbCBjb25maWd1cmF0aW9uIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWdJZCBjb25maWd1cmF0aW9uIGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gY29uZmlndXJhdGlvbiBtYXBwaW5nIHRvIHRoZSBnaXZlbiBpZAogICAgICAgICAqLwogICAgICAgIF9nZXRDb25maWdWYWwgOiBmdW5jdGlvbiAoY29uZmlnVmFsLCBjb25maWdJZCkgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZmlnSWQpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZ0lkLmxlbmd0aCAmJiAhQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnVmFsID0gY29uZmlnVmFsW2NvbmZpZ0lkW2ldXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICB9LAoKICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGZpZWxkLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyAmJiB0aGlzLmNhbGxiYWNrc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXS5jYWxsKGZpZWxkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5U3R5bGU6IGZ1bmN0aW9uKGlkLCBmaWVsZE9yRWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWwgPSBmaWVsZE9yRWw7CiAgICAgICAgICAgIGlmIChlbCAmJiBlbC5nZXRGaWVsZEVsKSB7CiAgICAgICAgICAgICAgICBlbCA9IGVsLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGVsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHlsZXMgJiYgdGhpcy5zdHlsZXNbaWRdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKHRoaXMuc3R5bGVzW2lkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTdHlsZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXNbaWRdID8gdGhpcy5zdHlsZXNbaWRdIDogIiI7CiAgICAgICAgfQoKCiAgICB9KTsKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZCA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBBYnN0cmFjdCBjbGFzcyB0aGF0IHNlcnZlZCBhcyBiYXNlIGZvciBhbGwgQWxwYWNhIGZpZWxkIGNsYXNzZXMgdGhhdCBwcm92aWRlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21FbCBUaGUgZG9tIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBmaWVsZCBpcyB1bHRpbWF0ZWx5IHJlbmRlcmluZy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmlld0lkIHZpZXcgaWQKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZG9tRWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlld0lkLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vIGRvbUVsCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICAvLyBjb25maWcKICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOwogICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBmaWVsZCByZW5kZXJpbmcgaXMgc2luZ2xlLWxldmVsIG9yIG5vdAogICAgICAgICAgICB0aGlzLnNpbmdsZUxldmVsUmVuZGVyaW5nID0gZmFsc2U7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gdGhpbmdzIHdlIGNhbiBkcmF3IG9mZiB0aGUgb3B0aW9ucwogICAgICAgICAgICB2YXIgbm9PcHRpb25zID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgIG5vT3B0aW9ucyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZDsKICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5vcHRpb25zLnR5cGU7CgogICAgICAgICAgICAvLyBzZXR1cCBkZWZhdWx0cwogICAgICAgICAgICBpZiAoIXRoaXMuaWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBub1NjaGVtYSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgbm9TY2hlbWEgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmxhYmVsICYmIHRoaXMuc2NoZW1hLnRpdGxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB0aGlzLnNjaGVtYS50aXRsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVyICYmIHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVyID0gdGhpcy5zY2hlbWEuZGVzY3JpcHRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0OiBvcHRpb25zLmhlbHBlciAtPiBjb252ZXJ0IHRvIG9wdGlvbnMuaGVscGVycwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5oZWxwZXJzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHRoaXMub3B0aW9ucy5oZWxwZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMucHVzaCh0aGlzLm9wdGlvbnMuaGVscGVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuaGVscGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcltpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsZWdhY3kgdmFsdWUKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuaGVscGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLnJlYWRvbmx5KSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEucmVhZG9ubHkpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVhZG9ubHkgPSB0aGlzLnNjaGVtYS5yZWFkb25seTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgZGF0YSBpcyBlbXB0eSwgdGhlbiB3ZSBjaGVjayB3aGV0aGVyIHdlIGNhbiBmYWxsIGJhY2sgdG8gYSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLmRhdGEpICYmICFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYVsiZGVmYXVsdCJdKSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5zY2hlbWFbImRlZmF1bHQiXTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd2luZ0RlZmF1bHREYXRhID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBwYXRoCiAgICAgICAgICAgIHRoaXMucGF0aCA9ICIvIjsKCiAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbiA9IHt9OwoKICAgICAgICAgICAgLy8gZXZlbnRzCiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9OwoKCgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIGluIGEgZGlzcGxheS1vbmx5IG1vZGUKICAgICAgICAgICAgdGhpcy5pc0Rpc3BsYXlPbmx5ID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmlldy50eXBlID09PSAidmlldyIgfHwgc2VsZi52aWV3LnR5cGUgPT0gImRpc3BsYXkiKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNjaGVtYSBpZCBjbGVhbnVwCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5pZCAmJiB0aGlzLnNjaGVtYS5pZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLmlkID0gdGhpcy5zY2hlbWEuaWQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYXMgdGhpcyBmaWVsZCBiZWVuIHByZXZpb3VzbHkgdmFsaWRhdGVkPwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gZmFsc2U7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvYnNlcnZhYmxlCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLnNldCh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmdldE9ic2VydmFibGVTY29wZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoIXRvcC5pc1RvcCgpKSB7CiAgICAgICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZVNjb3BlID0gdG9wLm9ic2VydmFibGVTY29wZTsKICAgICAgICAgICAgICAgIGlmICghb2JzZXJ2YWJsZVNjb3BlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGVTY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmVuc3VyZVByb3BlclR5cGUgPSBmdW5jdGlvbih2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgX2Vuc3VyZSA9IGZ1bmN0aW9uKHYsIHR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh2KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAibnVtYmVyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlRmxvYXQodik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImludGVnZXIiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gcGFyc2VJbnQodik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gIiIgfHwgdi50b0xvd2VyQ2FzZSgpID09PSAiZmFsc2UiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAiIiArIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gLTEgfHwgdiA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLml0ZW1zICYmIHNlbGYuc2NoZW1hLml0ZW1zLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gX2Vuc3VyZSh2YWxbaV0sIHNlbGYuc2NoZW1hLml0ZW1zLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh2YWwpIHx8IEFscGFjYS5pc051bWJlcih2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IF9lbnN1cmUodmFsLCBzZWxmLnNjaGVtYS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5vbkNvbnN0cnVjdCgpOwogICAgICAgIH0sCgogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBpc1RvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIGlkIG9mIHRoZSBvdXRlciBmaWVsZCB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEZvciBjb250cm9sIGZpZWxkcywgdGhpcyBpcyAiY29udHJvbCIuCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHRoaXMgaXMgImNvbnRhaW5lciIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGVtcGxhdGUgZGVzY3JpcHRvciBJRCB3YXMgbm90IHNwZWNpZmllZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdXAgZGVmYXVsdCByZW5kaXRpb24gdGVtcGxhdGUgZnJvbSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGluaXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLmdldFRlbXBsYXRlRGVzY3JpcHRvcklkKCksIHRoaXMpOwogICAgICAgICAgICB2YXIgZ2xvYmFsVGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldEdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcigpOwogICAgICAgICAgICB2YXIgbGF5b3V0ID0gdGhpcy52aWV3LmdldExheW91dCgpOwoKICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyB0aGUgZ2xvYmFsIG9yIGxheW91dCB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIHRvIHRoZSB0b3AtbW9zdCBmaWVsZAogICAgICAgICAgICB2YXIgdHJpcCA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcGxhdGVEZXNjcmlwdG9yKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXQgJiYgbGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihsYXlvdXQudGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICB0cmlwID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0cmlwICYmIHZpZXdUZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcGxhdGVEZXNjcmlwdG9yKHZpZXdUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlbnN1cmUgd2UgaGF2ZSBhIHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmdldFRlbXBsYXRlRGVzY3JpcHRvcigpOwogICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBmaWVsZCBpbnN0YW5jZSBpcyBjcmVhdGVkLiBJdCB3aWxsIGluaXRpYWxpemUKICAgICAgICAgKiB0aGUgZmllbGQgdG8gZ2V0IGl0IHJlYWR5IGZvciByZW5kaXRpb24uCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSBhIHRlbXBsYXRlIGRlc2NyaXB0b3IgcGlja2VkIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGVzY3JpcHRvcigpOwoKICAgICAgICAgICAgLy8gSlNPTiBTQ0hFTUEKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLnNjaGVtYS5yZXF1aXJlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnJlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZBTElEQVRJT04KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudmFsaWRhdGUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsaWRhdGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPUFRJT05TCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmRpc2FibGVkKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1FU1NBR0VTCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnNob3dNZXNzYWdlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXBGaWVsZDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGZuCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgb246IGZ1bmN0aW9uKG5hbWUsIGZuKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJBZGRpbmcgbGlzdGVuZXIgZm9yIGV2ZW50OiAiICsgbmFtZSk7CgogICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c1tuYW1lXSkgewogICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5wdXNoKGZuKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVW5yZWdpc3RlcnMgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqLwogICAgICAgIG9mZjogZnVuY3Rpb24obmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5sZW5ndGggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQgYW5kIHByb3BhZ2F0ZXMgdGhlIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGJlaGF2aW9yIGlzIHRvIHByb3BhZ2F0ZSB1cCB0byB0aGUgcGFyZW50IGNoYWluIChidWJibGUgdXApLgogICAgICAgICAqCiAgICAgICAgICogSWYgImRpcmVjdGlvbiIgaXMgc2V0IHRvICJkb3duIiBhbmQgdGhlIGZpZWxkIGlzIGEgY29udGFpbmVyLCB0aGVuIHRoZSBldmVudCBpcyBwcm9wYWdhdGVkIGRvd24KICAgICAgICAgKiB0byBjaGlsZHJlbiAodHJpY2tsZSBkb3duKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiYm90aCIsIHRoZW4gYm90aCB1cCBhbmQgZG93biBhcmUgdHJpZ2dlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKiBAcGFyYW0gZXZlbnQKICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIChvcHRpb25hbCkgc2VlIGFib3ZlCiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcldpdGhQcm9wYWdhdGlvbjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGRpcmVjdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YoZXZlbnQpID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gZXZlbnQ7CiAgICAgICAgICAgICAgICBldmVudCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAidXAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAidXAiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3ZSB0cmlnZ2VyIG91cnNlbHZlcyBmaXJzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwoKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgdHJpZ2dlciBwYXJlbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKHRoaXMucGFyZW50LCBuYW1lLCBldmVudCwgZGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICJkb3duIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZG8gYW55IGNoaWxkcmVuIGZpcnN0CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbChjaGlsZCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRvIG91cnNlbHZlcyBsYXN0CiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIuY2FsbCh0aGlzLCBuYW1lLCBldmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiYm90aCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCAiZG93biIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB0aGVuIGRvIG91cnNlbHZlcwogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwoKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgdHJpZ2dlciBwYXJlbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKHRoaXMucGFyZW50LCBuYW1lLCBldmVudCwgInVwIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbiBldmVudAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKiBAcGFyYW0gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIFJlbWFpbmRlciBvZiBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBldmVudCwgYXJnMSwgYXJnMiwgYXJnMykKICAgICAgICB7CiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgPT0gY29udHJvbAoKICAgICAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW25hbWVdOwogICAgICAgICAgICBpZiAoaGFuZGxlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihoYW5kbGVyKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRmlyaW5nIGV2ZW50OiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlRoZSBldmVudCBoYW5kbGVyIGNhdWdodCBhbiBleGNlcHRpb246ICIgKyBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIHRoZSBkYXRhIGludG8gdGhlIGZpZWxkLiAgQ2FsbGVkIGF0IHRoZSB2ZXJ5IGVuZCBvZiBjb25zdHJ1Y3Rpb24uCiAgICAgICAgICovCiAgICAgICAgYmluZERhdGE6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgbWV0aG9kIGludG8gdGhlIGZpZWxkLiAgSXQgaXMgY2FsbGVkIGJ5IEFscGFjYSBmb3IgZWFjaCBmaWVsZCBiZWluZyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIFJlbmRlcnMgdGhpcyBmaWVsZCBpbnRvIHRoZSBjb250YWluZXIgYW5kIGNyZWF0ZXMgYSBET00gZWxlbWVudCB3aGljaCBpcyBib3VuZCBpbnRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgVmlldyB0byBiZSB1c2VkIGZvciByZW5kZXJpbmcgZmllbGQgKG9wdGlvbmFsKS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBQb3N0LVJlbmRlciBjYWxsYmFjayAob3B0aW9uYWwpLgogICAgICAgICAqLwogICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmlldywgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodmlldyAmJiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpIHx8IEFscGFjYS5pc09iamVjdCh2aWV3KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlldy5zZXRWaWV3KHZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGNhbGxiYWNrKSAmJiBBbHBhY2EuaXNGdW5jdGlvbih2aWV3KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHZpZXc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxhc3QgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gcG9wdWxhdGUgdGhlIGxhYmVsIGZyb20gcHJvcGVydHlJZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhYmVsID09PSBudWxsICYmIHRoaXMucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5wcm9wZXJ0eUlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiBuYW1lIGZpZWxkCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5zZXR1cCgpOwoKICAgICAgICAgICAgdGhpcy5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB0aGUgcmVuZGVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJyZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY2FsY3VsYXRlTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm5hbWUgfHwgKHRoaXMubmFtZSAmJiB0aGlzLm5hbWVDYWxjdWxhdGVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGFzIHBhdGg/CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQubmFtZSAmJiB0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdGhpcy5wYXRoLnN1YnN0cmluZyh0aGlzLnBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgIT09IC0xICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudCA9IGxhc3RTZWdtZW50LnN1YnN0cmluZyhsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgKyAxLCBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5wYXJlbnQubmFtZSArICJfIiArIGxhc3RTZWdtZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbmFtZSBmcm9tIHRoZSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGF0aC5yZXBsYWNlKC9cLy9nLCIiKS5yZXBsYWNlKC9cWy9nLCJfIikucmVwbGFjZSgvXF0vZywiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgcHJvY2Vzc2luZyB0aGUgcmVuZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBQb3N0LXJlbmRlciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gYSBmb3JtCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZm9ybSAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmZvcm0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZm9ybS52aWV3VHlwZSA9IHRoaXMudmlldy50eXBlOwoKICAgICAgICAgICAgICAgIHZhciBmb3JtID0gc2VsZi5mb3JtOwogICAgICAgICAgICAgICAgaWYgKCFmb3JtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSBuZXcgQWxwYWNhLkZvcm0oc2VsZi5kb21FbCwgdGhpcy5vcHRpb25zLmZvcm0sIHNlbGYudmlldy5pZCwgc2VsZi5jb25uZWN0b3IsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JtLnJlbmRlcihmdW5jdGlvbihmb3JtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcm0gaXMgdGhlIGZvcm0gaW5zdGFuY2UgKG5vdCB0aGUganF1ZXJ5IGVsZW1lbnQpCgogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRmllbGRIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyIGl0CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzc1JlbmRlcih0ZW1wRmllbGRIb2xkZXIsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBmaWVsZCBiZWZvcmUgb3VyIGZvcm0gZmllbGRzIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZvcm1GaWVsZHNDb250YWluZXIuYmVmb3JlKHNlbGYuZmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmb3JtRmllbGRzQ29udGFpbmVyIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZvcm1GaWVsZHNDb250YWluZXIucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW5kIHRoZSB0b3AgZmllbGQgdG8gdGhlIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sID0gc2VsZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0gPSBmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWUgPSBzZWxmOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgYW55IHBvc3QtcmVuZGVyaW5nIGZhY2lsaXRpZXMgdG8ga2ljayBpbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRpYWxpemluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGZvciBmb3JtIHRvIGRvIHNvbWUgbGF0ZSB1cGRhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0uYWZ0ZXJJbml0aWFsaXplKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmllbGQgcmVtb3ZlcywgcmVtb3ZlIHRoZSBmb3JtIGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBBbHBhY2EuaXNGdW5jdGlvbihjYWxsYmFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1JlbmRlcihzZWxmLmRvbUVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkICJmaWVsZCIgZWxlbWVudCB0byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgICAgICAvLyQoc2VsZi5maWVsZCkuYXBwZW5kVG8oc2VsZi5kb21FbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCBpbml0aWFsaXppbmcKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBBbHBhY2EuaXNGdW5jdGlvbihjYWxsYmFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoZSBmaWVsZCBpbnRvIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgY2FsbGJhY2sgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIF9wcm9jZXNzUmVuZGVyOiBmdW5jdGlvbihwYXJlbnRFbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkIChvdXRlciBlbGVtZW50KQogICAgICAgICAgICBzZWxmLnJlbmRlckZpZWxkKHBhcmVudEVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImZpZWxkIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImZpZWxkIik7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyIGFueSBmaWVsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZEVsZW1lbnRzKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICByZW5kZXJGaWVsZERvbUVsZW1lbnQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgZmllbGQKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB0aGlzLm9wdGlvbnMsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICAgICAidmlldyI6IHRoaXMudmlldywKICAgICAgICAgICAgICAgICJwYXRoIjogdGhpcy5wYXRoLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgImZpZWxkIiBvdXRlciBlbGVtZW50LiAgVGhpcyBpcyB1c3VhbGx5IHRoZSBjb250cm9sIG9yIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwYXJlbnRFbAogICAgICAgICAqIEBwYXJhbSBvblN1Y2Nlc3MKICAgICAgICAgKi8KICAgICAgICByZW5kZXJGaWVsZDogZnVuY3Rpb24ocGFyZW50RWwsIG9uU3VjY2VzcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIHRoZSBkYXRhIHdlJ2xsIHJlbmRlcgogICAgICAgICAgICB2YXIgdGhlRGF0YSA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCBhbmQgdGhlRGF0YSBpcyBhbiBvYmplY3QsIGNvbnZlcnQgdG8gc3RyaW5nCiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YodGhlRGF0YSkgPT09ICJvYmplY3QiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGVEYXRhID0gSlNPTi5zdHJpbmdpZnkodGhlRGF0YSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZW5kZXJlZERvbUVsZW1lbnQgPSBzZWxmLnJlbmRlckZpZWxkRG9tRWxlbWVudCh0aGVEYXRhKTsKCiAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBiYWNrIG11bHRpcGxlIGVsZW1lbnRzLCB0cnkgdG8gcGljayBhdCB0aGUgZmlyc3QgRElWCiAgICAgICAgICAgIGlmICgkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNpbmdsZSA9IG51bGw7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQocmVuZGVyZWREb21FbGVtZW50KS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9ICQocmVuZGVyZWREb21FbGVtZW50KVtpXS5ub2RlTmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoImRpdiIgPT09IG5hbWUgfHwgInNwYW4iID09PSBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2luZ2xlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNpbmdsZSA9ICQoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxhc3QoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRG9tRWxlbWVudCA9IHNpbmdsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5maWVsZCA9IHJlbmRlcmVkRG9tRWxlbWVudDsKICAgICAgICAgICAgdGhpcy5maWVsZC5hcHBlbmRUbyhwYXJlbnRFbCk7CgogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGFueSBmaWVsZCBlbGVtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEZvciBjb250cm9scyBvciBjb250YWluZXJzLCB0aGlzIGhvb2sgaXMgdXNlZCB0byBpbmplY3QgYWRkaXRpb25hbCBkb20gZWxlbWVudHMgaW50byB0aGUgb3V0ZXIgZmllbGQKICAgICAgICAgKiBkb20gZWxlbWVudC4gIFNpbXBsZSBmaWVsZCB0eXBlcyBtYXkgY2hvb3NlIG5vdCB0byBpbXBsZW1lbnQgdGhpcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgdHlwaWNhbGx5IG9uY2UgcGVyIHJlbmRlci4gIElmIGEgRE9NIGVsZW1lbnQgaXMgbW92ZWQgd2l0aGluIGEgY29udGFpbmVyIGFuZCBpdCdzIGluZGV4aW5nCiAgICAgICAgICogY2hhbmdlcywgdGhpcyB3aWxsIGdldCBjYWxsZWQgYWdhaW5zdCB0byBlbnN1cmUgdGhhdCBET00gcHJvcGVydGllcyBhcmUga2VwdCBpbiBzeW5jLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIHBhdGgKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1wYXRoIiwgdGhpcy5nZXRQYXRoKCkpOwoKICAgICAgICAgICAgLy8gYWxsIGZpZWxkcyBnZXQgdGhlaXIgbmFtZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLW5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CgogICAgICAgICAgICAvLyBuYW1lIHNob3VsZCBub3QgYXBwZWFyIG9uIGZpZWxkCiAgICAgICAgICAgIHRoaXMuZmllbGQucmVtb3ZlQXR0cigibmFtZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBmaWVsZCByZW5kaXRpb24gaXMgY29tcGxldGUuIEl0IGlzIHNlcnZlZCBhcyBhIHdheSB0byBtYWtlIGZpbmFsCiAgICAgICAgICogbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9tIGVsZW1lbnRzIHRoYXQgd2VyZSBwcm9kdWNlZC4KICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZSAiYWxwYWNhLWZpZWxkIiBjbGFzcyB3aGljaCBtYXJrcyB0aGUgb3V0ZXIgZWxlbWVudAogICAgICAgICAgICB0aGlzLmZpZWxkLmFkZENsYXNzKCJhbHBhY2EtZmllbGQiKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IG1hcmtlZCBieSB0eXBlIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLSIgKyB0aGlzLmdldEZpZWxkVHlwZSgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IGZpZWxkIGlkIGRhdGEgYXR0cmlidXRlCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiLCB0aGlzLmdldElkKCkpOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVET01FbGVtZW50KCk7CgogICAgICAgICAgICAvLyB0cnkgdG8gYXZvaWQgYWRkaW5nIHVubmVjZXNzYXJ5IGluamVjdGlvbnMgZm9yIGRpc3BsYXkgdmlldy4KICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICE9PSAndmlldycpIHsKCiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZXF1aXJlZCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJyZXF1aXJlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1vcHRpb25hbCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogIm9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJvcHRpb25hbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBkb0Rpc2FibGVGaWVsZCA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYXJrICJkaXNhYmxlZCIgYXR0cmlidXRlIG9udG8gdW5kZXJseWluZyBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJ2lucHV0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdzZWxlY3QnLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpyYWRpbycsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnOmNoZWNrYm94Jywgc2VsZi5maWVsZCksIHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHJhZGlvIGJ1dHRvbnMgKHByZXZlbnQgY2xpY2tzKQogICAgICAgICAgICAgICAgICAgICQoIjpyYWRpbyIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCgiLnJhZGlvIGxhYmVsIiwgc2VsZi5maWVsZCkub2ZmKCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIChpbnB1dCBmaWVsZCkKICAgICAgICAgICAgICAgICAgICAkKCJpbnB1dCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgZGlzYWJsZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRpc2FibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcmVhZG9ubHkKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLXJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgICAgICQoJ2lucHV0JywgdGhpcy5maWVsZCkuYXR0cigncmVhZG9ubHknLCAncmVhZG9ubHknKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlYWRvbmx5IgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJyZWFkb25seSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1kaXNhYmxlZCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGRvRGlzYWJsZUZpZWxkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZGlzYWJsZWQiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYWxsb3cgc2luZ2xlIG9yIG11bHRpcGxlIGZpZWxkIGNsYXNzZXMgdG8gYmUgc3BlY2lmaWVkIHZpYSB0aGUgImZpZWxkQ2xhc3MiCiAgICAgICAgICAgICAgICAvLyBvciAiZmllbGRDbGFzc2VzIiBvcHRpb25zCiAgICAgICAgICAgICAgICB2YXIgYXBwbHlGaWVsZENsYXNzID0gZnVuY3Rpb24oZWwsIHRoaW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGluZykgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGluZy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRoaW5nW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5pbmRleE9mKCIsIikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRoaW5nLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0b2tlbnNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpbmcuaW5kZXhPZigiICIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXBwbHlGaWVsZENsYXNzKHRoaXMuZmllbGQsIHRoaXMub3B0aW9uc1siZmllbGRDbGFzcyJdKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3IgY3VzdG9tIHN0eWxlcyBwcm92aWRlZCBieSBjdXN0b20gdmlldwogICAgICAgICAgICAgICAgdmFyIGN1c3RvbVN0eWxlcyA9IHRoaXMudmlldy5nZXRTdHlsZXMoKTsKICAgICAgICAgICAgICAgIGlmIChjdXN0b21TdHlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgc3R5bGVDbGFzcyBpbiBjdXN0b21TdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHN0eWxlQ2xhc3MsIHRoaXMuZG9tRWwpLmNzcyhjdXN0b21TdHlsZXNbc3R5bGVDbGFzc10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgLy8gYWZ0ZXIgcmVuZGVyCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGUiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGUiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBiaW5kIGRhdGEgaWYgd2UncmUgaW4gImVkaXQiIG1vZGUKICAgICAgICAgICAgICAgIC8vIHR5cGljYWxseSwgd2UgZG9uJ3QgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJjcmVhdGUiIG9yIGFueSBvdGhlciBtb2RlCiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgJiYgdGhpcy52aWV3LnR5cGUgPT09ICdlZGl0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvbnRyb2wgaXMgc2hvd2luZyBkZWZhdWx0IGRhdGEsIHRoZW4gd2UgcmVuZGVyIHRoZSBjb250cm9sIGFueXdheQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZERhdGEoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGxvZ2dpbmcgdG8gYmUgdXNlZnVsCiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgPT09ICJjcmVhdGUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiU2tpcHBpbmcgZGF0YSBiaW5kaW5nIGZvciBmaWVsZDogIiArIHRoaXMuaWQgKyAiIHNpbmNlIHZpZXcgbW9kZSBpcyAnY3JlYXRlJyIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZG9tLWxldmVsIGV2ZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGRlbgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkZWZhdWx0SGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSAodGhpcy52aWV3LnR5cGUgPT09ICdjcmVhdGUnKSAmJiAhdGhpcy5yZWZyZXNoZWQ7CiAgICAgICAgICAgIHRoaXMuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLm9wdGlvbnMuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpID8gZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yIDogdGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yOwoKICAgICAgICAgICAgLy8gZm9yIGNyZWF0ZSB2aWV3LCBoaWRlIGFsbCByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXcuZGlzcGxheVJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtcmVhZG9ubHkiKS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHBvc3QgcmVuZGVyCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zdFJlbmRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc3RSZW5kZXIuY2FsbCh0aGlzLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWRyYXdzIHRoZSBmaWVsZCB1c2luZyB0aGUgY3VycmVudGx5IGJvdW5kIERPTSBlbGVtZW50IGFuZCB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGRhdGEKICAgICAgICAgICAgdmFyIF9kYXRhID0gc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhpcyBzdHVmZgogICAgICAgICAgICB2YXIgb2xkRG9tRWwgPSBzZWxmLmRvbUVsOwogICAgICAgICAgICB2YXIgb2xkRmllbGQgPSBzZWxmLmZpZWxkOwogICAgICAgICAgICAvL3ZhciBvbGRDb250cm9sID0gc2VsZi5jb250cm9sOwogICAgICAgICAgICAvL3ZhciBvbGRDb250YWluZXIgPSBzZWxmLmNvbnRhaW5lcjsKICAgICAgICAgICAgLy92YXIgb2xkRm9ybSA9IHNlbGYuZm9ybTsKCiAgICAgICAgICAgIC8vIGluc2VydCBtYXJrZXIgZWxlbWVudCBiZWZvcmUgY3VycmVudCBmaWVsZCB0byBtYXJrIHdoZXJlIHdlJ2xsIHJlbmRlcgogICAgICAgICAgICB2YXIgbWFya2VyRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAkKG9sZEZpZWxkKS5iZWZvcmUobWFya2VyRWwpOwoKICAgICAgICAgICAgLy8gdGVtcCBkb21FbAogICAgICAgICAgICBzZWxmLmRvbUVsID0gJCgiPGRpdiBzdHlsZT0nZGlzcGxheTogbm9uZSc+PC9kaXY+Iik7CiAgICAgICAgICAgIC8vIGNsZWFyIHRoaXMgc3R1ZmYgb3V0CiAgICAgICAgICAgIHNlbGYuZmllbGQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udHJvbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuZm9ybSA9IHVuZGVmaW5lZDsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgYWxsIGJ1dHRvbnMgb24gb3VyIGN1cnJlbnQgZmllbGQKICAgICAgICAgICAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIHJlcGVhdGVkIGNsaWNrcyBjb3VsZCBjYXVzZSB0cm91YmxlIHdoaWxlIHRoZSBmaWVsZCBpcyBpbiBzb21lIGhhbGYtc3RhdGUKICAgICAgICAgICAgLy8gZHVyaW5nIHJlZnJlc2gKICAgICAgICAgICAgJChvbGRGaWVsZCkuZmluZCgiYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKCiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vIHJlLXNldHVwIHRoZSBmaWVsZAogICAgICAgICAgICBzZWxmLnNldHVwKCk7CgogICAgICAgICAgICBzZWxmLnNldHVwRmllbGQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWhlYWQgb2YgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkuYmVmb3JlKHNlbGYuZmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgZG9tRWwKICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbUVsID0gb2xkRG9tRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgY2xhc3NlcyBmcm9tIG9sZEZpZWxkIG9udG8gZmllbGQKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkQ2xhc3NlcyA9ICQob2xkRmllbGQpLmF0dHIoImNsYXNzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENsYXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9sZENsYXNzZXMuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgIXYuaW5kZXhPZigiYWxwYWNhLSIpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcyh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBvbGQgZmllbGQKICAgICAgICAgICAgICAgICAgICAkKG9sZEZpZWxkKS5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAkKG1hcmtlckVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGF0IHdlJ3JlIHJlZnJlc2hlZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhcHBhcmVudGx5IG5lZWRlZCBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihfZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdChfZGF0YSkgfHwgQWxwYWNhLmlzQXJyYXkoX2RhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKF9kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZmlyZSB0aGUgInJlYWR5IiBldmVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoc2VsZik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndhcmRzLi4uCgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyBjbGVhbiB1cCBvbGQgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyaWdnZXIgdGhlIGJvdW5kICJkZXN0cm95ZWQiIGV2ZW50IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIG9sZCBkb20gZWwuCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhc29uIGlzIHRoYXQgd2UgaGF2ZSBvbGRGb3JtIC0+IEZpZWxkICh3aXRoIG9sZERvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZvcm0gLT4gRmllbGQgKHdpdGggZG9tRWwpCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmluZyB1cCAib2xkRG9tRWwiIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJvbGRGb3JtIiB0byBjbGVhbnVwCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY2F1c2VzICJGaWVsZCIgdG8gY2xlYW51cCB3aGljaCBjYXVzZXMgImRvbUVsIiB0byBjbGVhbiB1cCAoYW5kIGFsc28gImZvcm0iKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBqdXN0IHdhbnQgdG8gcmVtb3ZlIHRoZSBkb20gZWxlbWVudHMgZm9yICJvbGREb21FbCIgYW5kICJvbGRGb3JtIiB3aXRob3V0IHRyaWdnZXJpbmcKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lhbCBkZXN0cm95ZXIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcnMgdGhhdCB3ZSBjYW4gZG8gdGhpcyB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50Li4uPwogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkucmVtb3ZlKHVuZGVmaW5lZCwgewogICAgICAgICAgICAgICAgICAgICAgICAibm9kZXN0cm95IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbGllcyBhIHZpZXcgc3R5bGUgdG8gYSBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAgICAgKi8KICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmFwcGx5U3R5bGUoaWQsIHRhcmdldCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgYSB2aWV3IGNhbGxiYWNrIGZvciB0aGUgY3VycmVudCBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSBhcmcxCiAgICAgICAgICogQHBhcmFtIGFyZzIKICAgICAgICAgKiBAcGFyYW0gYXJnMwogICAgICAgICAqIEBwYXJhbSBhcmc0CiAgICAgICAgICogQHBhcmFtIGFyZzUKICAgICAgICAgKi8KICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGlkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmZpcmVDYWxsYmFjayh0aGlzLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBvdXRlciAiZmllbGQiIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRyb2wgZmllbGQgb3IgYSBjb250YWluZXIgZmllbGQsIHRoaXMgRE9NIGVsZW1lbnQgd2lsbCB3cmFwIHRoZSBpbm5lciAiY29udHJvbCIKICAgICAgICAgKiBhbmQgImNvbnRhaW5lciIgZWxlbWVudHMgcmVzcGVjdGl2ZWx5LiAgSW4gc29tZSBjYXNlcywgdGhlIHdyYXBwaW5nIG1pZ2h0IG5vdCBleGlzdCBpbiB3aGljaCBjYXNlIHRoaXMKICAgICAgICAgKiBmaWVsZCBtYXkgYmUgdGhlICJjb250cm9sIiBvciAiY29udGFpbmVyIiBmaWVsZCBpdHNlbGYuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVuZGVyZWQgRE9NIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRFbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIEZpZWxkIGlkLgogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGlzIGZpZWxkJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgcGFyZW50LgogICAgICAgICAqLwogICAgICAgIGdldFBhcmVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50IGluIHRoZSBncmFwaCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0aCB0byB0aGlzIGVsZW1lbnQKICAgICAgICAgKi8KICAgICAgICBnZXRQYXRoOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50IGF0IHRoZSBjdXJyZW50IGxldmVsIG9mIEpTT04gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldE5hbWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoaXMgZmllbGQgaXMgdG9wIGxldmVsLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBmaWVsZCBpcyB0aGUgdG9wIGxldmVsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVG9wTGV2ZWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzRW1wdHkodGhpcy5wYXJlbnQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdhbGtzIHVwIHRoZSBwYXJlbnQgY2hhaW4gYW5kIHJldHVybnMgdGhlIHRvcCBtb3N0IGNvbnRyb2wuICBJZiBubyBwYXJlbnRzLCB0aGVuIGN1cnJlbnQgY29udHJvbCBpcyB0b3AgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtDb250cm9sfSB0b3AgbW9zdCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgdG9wOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9wID0gdGhpczsKCiAgICAgICAgICAgIHdoaWxlICh0b3AucGFyZW50KSB7CiAgICAgICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdG9wOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIHZhbCA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0LgogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgLSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXkgbW9kZSBhbmQgbm90IGZpcnN0IHJlbmRlciwgdGhlbiBkbyBhIHJlZnJlc2ggaGVyZQogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgIXRoaXMuaW5pdGlhbGl6aW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50b3AgJiYgdGhpcy50b3AoKSAmJiB0aGlzLnRvcCgpLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSByZW5kZXJpbmcgdW5kZXIgYSB0b3AgbW9zdCBjb250cm9sIHRoYXQgaXNuJ3QgZmluaXNoZWQgaW5pdGlhbGl6aW5nLCB0aGVuIGRvbid0IHJlZnJlc2gKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB2YWx1ZSB0byBkZWZhdWx0LgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGZpZWxkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGZpZWxkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIHNldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yKSB7CiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVEZXNjcmlwdG9yID0gdGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZhbGlkYXRpb24gc3RhdGUgbWVzc2FnZXMgdG8gc2hvdyBmb3IgYSBnaXZlbiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBtZXNzYWdlcyBlaXRoZXIgYSBtZXNzYWdlIG9iamVjdCB7aWQsIG1lc3NhZ2V9IG9yIGFuIGFycmF5IG9mIG1lc3NhZ2Ugb2JqZWN0cwogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYmVmb3JlU3RhdHVzIFByZXZpb3VzIHZhbGlkYXRpb24gc3RhdHVzLgogICAgICAgICAqLwogICAgICAgIGRpc3BsYXlNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlcywgYmVmb3JlU3RhdHVzKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiBvYmplY3QsIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gW21lc3NhZ2VzXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgc3RyaW5nLCBjb252ZXJ0CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNTdHJpbmcobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFt7CiAgICAgICAgICAgICAgICAgICAgImlkIjogImN1c3RvbSIsCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlcwogICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgYWxwYWNhIG1lc3NhZ2VzIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLmNoaWxkcmVuKCIuYWxwYWNhLW1lc3NhZ2UiKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIG1heE1lc3NhZ2UKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcyAmJiBBbHBhY2EuaXNOdW1iZXIodGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKSAmJiB0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc2xpY2UoMCx0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlbW92ZU1lc3NhZ2VzIgogICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVtb3ZlTWVzc2FnZXMiKTsKCiAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIGFuZCBnZW5lcmF0ZSBpdAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgbWVzc2FnZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKG1lc3NhZ2VzLCBmdW5jdGlvbihpbmRleCwgbWVzc2FnZU9iamVjdCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG1lc3NhZ2UgdG8gdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJtZXNzYWdlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZUVsZW1lbnQgPSBBbHBhY2EudG1wbChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlT2JqZWN0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYWRkQ2xhc3MoImFscGFjYS1tZXNzYWdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZS1oaWRkZW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5hcHBlbmQobWVzc2FnZUVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJhZGRNZXNzYWdlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhZGRNZXNzYWdlIiwgaW5kZXgsIG1lc3NhZ2VPYmplY3QuaWQsIG1lc3NhZ2VPYmplY3QubWVzc2FnZSwgaGlkZGVuKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2VzIHRoZSB2YWxpZGF0aW9uIGZvciBhIGZpZWxkIHRvIGJlIHJlZnJlc2hlZCBvciByZWRyYXduIHRvIHRoZSBzY3JlZW4uCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0b2xkIHRvIGNoZWNrIGNoaWxkcmVuLCB0aGVuIGFsbCBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyIGZpZWxkIHdpbGwgYmUgcmVmcmVzaGVkIGFzIHdlbGwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZhbGlkYXRlQ2hpbGRyZW4gd2hldGhlciB0byByZWZyZXNoIHZhbGlkYXRpb24gZm9yIGNoaWxkcmVuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hlbiB2YWxpZGF0aW9uIGNvbXBsZXRlcwogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4sIGNiKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkNhbGwgcmVmcmVzaFZhbGlkYXRpb25TdGF0ZTogIiArIHRoaXMucGF0aCk7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBydW4gdmFsaWRhdGlvbiBjb250ZXh0IGNvbXBpbGF0aW9uIGZvciBvdXJzZWx2ZXMgYW5kIG9wdGlvbmFsbHkgYW55IGNoaWxkcmVuCiAgICAgICAgICAgIHZhciBjb250ZXh0cyA9IFtdOwogICAgICAgICAgICB2YXIgZnVuY3Rpb25zID0gW107CgogICAgICAgICAgICAvLyBjb25zdHJ1Y3RzIGFuIGFzeW5jIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZmllbGQKICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQnVpbGRlciA9IGZ1bmN0aW9uKGZpZWxkLCBjb250ZXh0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbiB0aGUgbmV4dCB0aWNrCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY29tcGlsZVZhbGlkYXRpb25Db250ZXh0KGZpZWxkLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcCB1cCBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gaW50byBhc3luYyBjYWxsYmFjayBtZXRob2RzCiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUNoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkZXB0aCBmaXJzdCBjcmF3bCBhY3Jvc3MgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICB2YXIgY3Jhd2wgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzVmFsaWRhdGlvblBhcnRpY2lwYW50KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaGFzIGNoaWxkcmVuLCBnbyBkZXB0aCBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bChmaWVsZC5jaGlsZHJlbltpXSwgY29udGV4dHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIoZmllbGQsIGNvbnRleHRzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNyYXdsKHRoaXMsIGNvbnRleHRzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIG91cnNlbHZlcyBpbiBsYXN0CiAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uQnVpbGRlcih0aGlzLCBjb250ZXh0cykpOwoKICAgICAgICAgICAgLy8gbm93IHJ1biBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiBwYXJhbGxlbAogICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwoZnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBjb250ZXh0cyBub3cgY29udGFpbnMgYWxsIG9mIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMKCiAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgY29udGV4dHMgaW50byBhIHNpbmdsZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICAgIHZhciBtZXJnZWRNYXAgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY29udGV4dHNbaV07CgogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGNvbnRleHQgaXMgYWxyZWFkeSBpbiBvcmRlciBbY2hpbGQsIHBhcmVudCwgLi4uXQoKICAgICAgICAgICAgICAgICAgICB2YXIgbUluZGV4ID0gbWVyZ2VkQ29udGV4dC5sZW5ndGg7CgogICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgZm9yd2FyZAogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udGV4dC5sZW5ndGg7IGorKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IGNvbnRleHRbal07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRNYXBbZW50cnkuaWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFkZCB0byBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbnRyeSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaWQgPSBlbnRyeS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnBhdGggPSBlbnRyeS5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuZG9tRWwgPSBlbnRyeS5kb21FbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmZpZWxkID0gZW50cnkuZmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS52YWxpZGF0ZWQgPSBlbnRyeS52YWxpZGF0ZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5pbnZhbGlkYXRlZCA9IGVudHJ5LmludmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWQgPSBlbnRyeS52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZENvbnRleHQuc3BsaWNlKG1JbmRleCwgMCwgbmV3RW50cnkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgaW4gbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRNYXBbbmV3RW50cnkuaWRdID0gbmV3RW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkudmFsaWRhdGVkICYmICFleGlzdGluZy5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWQgPSBlbnRyeS52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbm93IHJldmVyc2UgaXQgc28gdGhhdCBjb250ZXh0IGlzIG5vcm1hbGl6ZWQgd2l0aCBjaGlsZCBmaWVsZHMgZmlyc3QKICAgICAgICAgICAgICAgIG1lcmdlZENvbnRleHQucmV2ZXJzZSgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQoc2VsZi52aWV3LCBtZXJnZWRDb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoY2IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmlldyBhbmQgbG9jYWxlIGZyaWVuZGx5IHJldHJpZXZhbCBvZiBtZXNzYWdlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBrZXkKICAgICAgICAgKi8KICAgICAgICBnZXRNZXNzYWdlOiBmdW5jdGlvbihrZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldE1lc3NhZ2Uoa2V5LCB0aGlzLnZpZXcubG9jYWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgdGhpcyBmaWVsZCBhbmQgcmV0dXJucyB3aGV0aGVyIGl0IGlzIGluIGEgdmFsaWQgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gW0Jvb2xlYW5dIHZhbGlkYXRlQ2hpbGRyZW4gd2hldGhlciB0byBjaGlsZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsaWRhdGVDaGlsZHJlbikKICAgICAgICB7CiAgICAgICAgICAgIC8vIHNraXAgb3V0IGlmIHdlIGhhdmVuJ3QgeWV0IGJvdW5kIGFueSBkYXRhIGludG8gdGhpcyBjb250cm9sCiAgICAgICAgICAgIC8vIHRoZSBjb250cm9sIGNhbiBzdGlsbCBiZSBjb25zaWRlcmVkIHRvIGJlIGluaXRpYWxpemluZwogICAgICAgICAgICB2YXIgc3RhdHVzID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcgJiYgdGhpcy5vcHRpb25zLnZhbGlkYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWxpZGF0ZUNoaWxkcmVuLCB0aGVuIHdhbGsgcmVjdXJzaXZlbHkgZG93biBpbnRvIGNoaWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB2YWxpZGF0ZUNoaWxkcmVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC52YWxpZGF0ZSh2YWxpZGF0ZUNoaWxkcmVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBldmFsdWF0ZSBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuaGFuZGxlVmFsaWRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBzb21lIGRlYnVnZ2luZwogICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMgJiYgQWxwYWNhLmxvZ0xldmVsID09IEFscGFjYS5ERUJVRykgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gdGhpcy52YWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25bbWVzc2FnZUlkXVsic3RhdHVzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2godGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bIm1lc3NhZ2UiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVmFsaWRhdGlvbiBmYWlsdXJlIGZvciBmaWVsZCAoaWQ9IiArIHRoaXMuZ2V0SWQoKSArICIsIHBhdGg9IiArIHRoaXMucGF0aCArICIpLCBtZXNzYWdlczogIiArIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzbHlWYWxpZGF0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyB2YWxpZGF0aW9uLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVPcHRpb25hbCgpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RPcHRpb25hbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgibm90T3B0aW9uYWwiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGlzYWxsb3coKTsKICAgICAgICAgICAgdmFsSW5mb1siZGlzYWxsb3dWYWx1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgiZGlzYWxsb3dWYWx1ZSIpLCBbdGhpcy5zY2hlbWFbImRpc2FsbG93Il0uam9pbignLCAnKV0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIHZhbEluZm9bIm5vdE9wdGlvbmFsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHVzaW5nIHVzZXIgcHJvdmlkZWQgdmFsaWRhdG9yLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbGlkYXRvciAmJiBBbHBhY2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmFsaWRhdG9yKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRvci5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbEluZm8pIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHN0b3JlIGluICJjdXN0b20iCiAgICAgICAgICAgICAgICAgICAgX3RoaXMudmFsaWRhdGlvblsiY3VzdG9tIl0gPSB2YWxJbmZvOwoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgcmVxdWlyZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gRmFsc2UgaWYgdGhpcyBmaWVsZCB2YWx1ZSBpcyBlbXB0eSBidXQgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU9wdGlvbmFsOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSAmJiB0aGlzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzICYmIEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMud2hpdGVzcGFjZSwgdGhpcy5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpZWxkIHZhbHVlIGlzIGFsbG93ZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZpZWxkIHZhbHVlIGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEaXNhbGxvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5zY2hlbWEuZGlzYWxsb3cpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGRpc2FsbG93ID0gdGhpcy5zY2hlbWEuZGlzYWxsb3c7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoZGlzYWxsb3cpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQWxsb3dlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRpc2FsbG93LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChBbHBhY2EuaXNPYmplY3QodmFsKSB8fCAoQWxwYWNhLmlzQXJyYXkodmFsKSkgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQWxwYWNhLnBhcnNlSlNPTih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FsbG93ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0FsbG93ZWQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyhkaXNhbGxvdykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ID0gQWxwYWNhLnBhcnNlSlNPTihkaXNhbGxvdyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmNvbXBhcmVPYmplY3QodmFsLCBkaXNhbGxvdyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFueSBldmVudCBoYW5kbGVycyB0aGF0IGxpc3RlbnMgdG8gdGhlIHVwZGF0ZSBldmVudCBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQEVYVEVOU0lPTl9QT0lOVAogICAgICAgICAqCiAgICAgICAgICogRGlzYWJsZXMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkCiAgICAgICAgICovCiAgICAgICAgaXNEaXNhYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBlbmFibGVkCiAgICAgICAgICovCiAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZCgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBjb250cm9sIGZvY3VzZWQgdXBvbi4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCgogICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2VzIGFueSBldmVudCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGlzIGZpZWxkIGZyb20gdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIHJlbW92ZSBvYnNlcnZhYmxlCiAgICAgICAgICAgIEFscGFjYS5vYnNlcnZhYmxlKHRoaXMucGF0aCkuY2xlYXIoKTsKCiAgICAgICAgICAgIC8vIGNsZWFuIHVwIEFscGFjYS5maWVsZEluc3RhbmNlcyBzdGF0aWMgcmVmZXJlbmNlICh1c2VkIGZvciBjb252ZW5pZW5jZSBhY2Nlc3MgdG8gcHJldmlvdXMgcmVuZGVyZWQgZmllbGRzKQogICAgICAgICAgICBpZiAoQWxwYWNhICYmIEFscGFjYS5maWVsZEluc3RhbmNlcykgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5maWVsZEluc3RhbmNlc1t0aGlzLmdldElkKCldKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEFscGFjYS5maWVsZEluc3RhbmNlc1t0aGlzLmdldElkKCldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBET00KICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTaG93cyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgc2hvdzogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaGlkZGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaGlkZGVuIG9wdGlvbiBpcyBvbiwgd2UncmUgYWx3YXlzIGhpZGRlbgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgZmllbGQKICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuY3NzKHsKICAgICAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICIiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLm9uU2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAic2hvdyIKICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKCJzaG93Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvblNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhpZGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBoaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMub25IaWRlKCk7CgogICAgICAgICAgICAvLyBDQUxMQkFDSzogImhpZGUiCiAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKCJoaWRlIik7CiAgICAgICAgfSwKCiAgICAgICAgb25IaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBpc1ZhbGlkYXRpb25QYXJ0aWNpcGFudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTaG93bigpOwogICAgICAgIH0sCgogICAgICAgIGlzU2hvd246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Zpc2libGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTsKICAgICAgICB9LAoKICAgICAgICBpc0hpZGRlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoIm5vbmUiID09PSAkKHRoaXMuZmllbGQpLmNzcygiZGlzcGxheSIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmludHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHByaW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5wcmludEFyZWEoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBmaWVsZCBpcyBiZWluZyByZXZlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIHNob3duLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW50UmV2ZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgY29uY2VhbGVkIGFzIHRoZSByZXN1bHQgb2YgYSBkZXBlbmRlbmN5IG9yIGNvbmRpdGlvbmFsIGNhbGN1bGF0aW9uCiAgICAgICAgICogdGhhdCBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW50Q29uY2VhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVsb2FkcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuY2FsbGJhY2spKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMsIHRoaXMucmVuZGVyZWRDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcih0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmaWVsZCBhbmQgcmVzZXRzIHRoZSBmaWVsZCB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoaXMgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKGNoZWNrQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICBpZiAoY2hlY2tDaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5pc1ZhbGlkKGNoZWNrQ2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkLmlzRW1wdHlPYmplY3QodGhpcy52YWxpZGF0aW9uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YWxpZGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25ba2V5XS5zdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgZXZlbnQgaGFuZGxpbmcuCiAgICAgICAgICovCiAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU92ZXIuY2FsbChfdGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlcigibW91c2VvdmVyIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm1vdXNlb3V0KGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk1vdXNlT3V0LmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3V0IiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCAtIHNwZWNpZnkgZXZlbnRzIHZpYSBvcHRpb25zLm9uRmllbGQ8RmllbGROYW1lPiA9IGZuCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5vcHRpb25zLCBmdW5jdGlvbihrZXksIGZ1bmMpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5zdGFydHNXaXRoKGtleSwnb25GaWVsZCcpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0ga2V5LnN1YnN0cmluZyg3KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWVsZC5vbihldmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmdXR1cmUgc3VwcG9ydCAtIHNwZWNpZnkgZXZlbnRzIHZpYSBvcHRpb25zLmV2ZW50cy48ZXZlbnROYW1lPiA9IGZuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5ldmVudHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsIGZ1bmN0aW9uKGV2ZW50LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PT0gInJlbmRlciIgfHwgZXZlbnQgPT09ICJyZWFkeSIgfHwgZXZlbnQgPT09ICJibHVyIiB8fCBldmVudCA9PT0gImZvY3VzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbihldmVudCwgZnVuY3Rpb24oZSwgYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmNhbGwoX3RoaXMsIGUsIGEsIGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWVsZC5vbihldmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmNhbGwoX3RoaXMsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBmaWVsZCByZWNlaXZlcyBmb2N1cy4KICAgICAgICAgKgogICAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZSBlbnRpcmUgZmllbGQgdG8gaGlnaGxpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgZG9tIGV2ZW50CiAgICAgICAgICovCiAgICAgICAgb25Gb2N1czogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZW1wdHkiKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgbG9zZXMgZm9jdXMgKGJsdXJzKS4KICAgICAgICAgKgogICAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZSBlbnRpcmUgZmllbGQgdG8gdW4taGlnaGxpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgZG9tIGV2ZW50CiAgICAgICAgICovCiAgICAgICAgb25CbHVyOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgd2FzRm9jdXNlZCA9ICQodGhpcy5maWVsZCkuaGFzQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBVSSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgIGlmICh3YXNGb2N1c2VkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRibHVyIgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnRyaWdnZXIoImZpZWxkYmx1ciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBmaWVsZCdzIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVwZGF0ZSB0aGUgY29udHJvbCdzIHZhbHVlIGFuZCBub3RpZnkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZSBFdmVudC4KICAgICAgICAgKi8KICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGludG8gZGF0YSBlbGVtZW50CiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiZWFjayBmb3Igd2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciBhIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUKICAgICAgICAgKi8KICAgICAgICBvbk1vdXNlT3ZlcjogZnVuY3Rpb24oZSkgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgbW91c2UgbW92ZXMgb3V0IG9mIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU91dDogZnVuY3Rpb24oZSkgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBhIGZpZWxkIGNvbnRyb2wgYnkgaXRzIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBGaWVsZCBjb250cm9sIHBhdGguCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgY29udHJvbCBtYXBwZWQgdG8gdGhlIHBhdGguCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbEJ5UGF0aDogZnVuY3Rpb24ocGF0aCkgewoKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7CgogICAgICAgICAgICBpZiAocGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3RyaXAgb2ZmIHRoZSBsZWFkaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZigiLyIpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgIi8iIGlmIGl0IGlzIHRoZXJlCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmVuZHNXaXRoKHBhdGgsICIvIikpIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHBhdGhBcnJheSA9IHBhdGguc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXRoRWxlbWVudCA9IHBhdGhBcnJheVtpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIF9uYW1lID0gcGF0aEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9pbmRleCA9IC0xOwoKICAgICAgICAgICAgICAgICAgICB2YXIgejEgPSBwYXRoRWxlbWVudC5pbmRleE9mKCJbIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHoxID49IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgejIgPSBwYXRoRWxlbWVudC5pbmRleE9mKCJdIiwgejEgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHoyID49IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbmRleCA9IHBhcnNlSW50KHBhdGhFbGVtZW50LnN1YnN0cmluZyh6MSArIDEsIHoyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IHBhdGhFbGVtZW50LnN1YnN0cmluZygwLCB6MSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkW19uYW1lXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5kZXggPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRyZW5bX2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBBbHBhY2EgY29udHJvbHMgYnkgdGhlaXIgQWxwYWNhIGZpZWxkIHR5cGUgKGkuZS4gInRleHQiLCAiY2hlY2tib3giLCAiY2tlZGl0b3IiKQogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWVsZFR5cGUKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbHNCeUZpZWxkVHlwZTogZnVuY3Rpb24oZmllbGRUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChmaWVsZFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24ocGFyZW50LCBmaWVsZFR5cGUsIGFycmF5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbltpXS5nZXRGaWVsZFR5cGUoKSA9PT0gZmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhcmVudC5jaGlsZHJlbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZihwYXJlbnQuY2hpbGRyZW5baV0sIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYodGhpcywgZmllbGRUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIHNjaGVtYSB0eXBlIChpLmUuICJzdHJpbmciLCAibnVtYmVyIikuCiAgICAgICAgICogVGhpcyBkb2VzIGEgZGVlcCB0cmF2ZXJzYWwgYWNyb3NzIHRoZSBncmFwaCBvZiBBbHBhY2EgZmllbGQgaW5zdGFuY2VzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHNjaGVtYVR5cGUKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbHNCeVNjaGVtYVR5cGU6IGZ1bmN0aW9uKHNjaGVtYVR5cGUpIHsKCiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwoKICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24ocGFyZW50LCBzY2hlbWFUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0VHlwZSgpID09PSBzY2hlbWFUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhcmVudC5jaGlsZHJlbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZihwYXJlbnQuY2hpbGRyZW5baV0sIHNjaGVtYVR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIHNjaGVtYVR5cGUsIGFycmF5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIH0sCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIE9CU0VSVkFCTEVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc3Vic2NyaWJlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS51bnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5vYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGNsZWFyT2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCgogICAgICAgIC8vIFV0aWxpdHkgRnVuY3Rpb25zIGZvciBGb3JtIEJ1aWxkZXIKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBzY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gU2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmVxdWlyZWQKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGNvbnRyb2wgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB0eXBlIG9mIHRoZSBiYXNlIGNsYXNzIChvciBudWxsIGlmIG5vbmUpCiAgICAgICAgICovCiAgICAgICAgZ2V0QmFzZUZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VGaWVsZFR5cGUgPSBudWxsOwoKICAgICAgICAgICAgdmFyIHggPSB0aGlzLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgaWYgKHggJiYgeC5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJhc2VGaWVsZFR5cGUgPSB4LmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZUZpZWxkVHlwZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIG9mIG90aGVyIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0IGlzIGEgY29udGFpbmVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IGZpZWxkIGlzIHJlcXVpcmVkLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWVsZCBjYW4gYmUgc3BlY2lmaWVkIGFzIHJlcXVpcmVkIGJ5IGVpdGhlciBzcGVjaWZ5aW5nIHJlcXVpcmVkOiB0cnVlIG9uIHRoZSBzY2hlbWEgZm9yIGEgZmllbGQgb3IgYnkKICAgICAgICAgKiBzcGVjaWZ5aW5nIGEgcmVxdWlyZWQgYXJyYXkgb24gdGhlIHBhcmVudCBvYmplY3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgZmllbGQgKGFzIHBlciBqc29uIHNjaGVtYSB2IDA0KS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufQogICAgICAgICAqLwogICAgICAgIGlzUmVxdWlyZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGFzc3VtZSBub3QgcmVxdWlyZWQKICAgICAgICAgICAgdmFyIHJlcXVpcmVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hLnJlcXVpcmVkKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRoaXMuc2NoZW1hLnJlcXVpcmVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBqc29uLXNjaGVtYSBkcmFmdCAwNAogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuc2NoZW1hLnJlcXVpcmVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpcy5wYXJlbnQuc2NoZW1hLnJlcXVpcmVkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVxdWlyZWRBcnJheSA9IHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRBcnJheSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXlbaV0gPT09IHRoaXMucHJvcGVydHlJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB0aXRsZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHRpdGxlLgogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIGRlc2NyaXB0aW9uLgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBKU09OIHNjaGVtYSBvZiB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBKU09OIHNjaGVtYSBvZiB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mU2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIGlzIHJlYWQtb25seS4gIEEgcmVhZC1vbmx5IGZpZWxkIGNhbm5vdCBoYXZlIGl0J3MgdmFsdWUgY2hhbmdlZC4gIFJlYWQtb25seSBmaWVsZHMgcmVuZGVyIGluIGEgZ3JheWVkLW91dCBvciBkaXNhYmxlZCBjb250cm9sLiAgSWYgdGhlIGZpZWxkIGlzIHJlbmRlcmVkIHVzaW5nIGEgdmlldyB3aXRoIHRoZSA8Y29kZT5kaXNwbGF5UmVhZG9ubHk8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gZmFsc2UsIHRoZSByZWFkLW9ubHkgZmllbGQgd2lsbCBub3QgYXBwZWFyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQncyB2YWx1ZSBpcyByZXF1aXJlZC4gIElmIHNldCB0byB0cnVlLCB0aGUgZmllbGQgbXVzdCB0YWtlIG9uIGEgdmFsaWQgdmFsdWUgYW5kIGNhbm5ub3QgYmUgbGVmdCBlbXB0eSBvciB1bmFzc2lnbmVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlZmF1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgYXNzaWduZWQgZm9yIHRoaXMgcHJvcGVydHkuICBJZiB0aGUgZGF0YSBmb3IgdGhlIGZpZWxkIGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZCwgdGhpcyBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcGx1Z2dlZCBpbiBmb3IgeW91LiAgU3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgd2hlbiB5b3Ugd2FudCB0byBwcmUtcG9wdWxhdGUgdGhlIGZpZWxkJ3MgdmFsdWUgYWhlYWQgb2YgdGltZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0YSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgZm9ybWF0IG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3ciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvd2VkIFZhbHVlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGRpc2FsbG93ZWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVwZW5kZW5jaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgcHJvcGVydHkgZGVwZW5kZW5jaWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VHlwZSAmJiAhQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRUeXBlKCkpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFPZlNjaGVtYS5wcm9wZXJ0aWVzLnR5cGVbJ2RlZmF1bHQnXSA9IHRoaXMuZ2V0VHlwZSgpOwogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydlbnVtJ10gPSBbdGhpcy5nZXRUeXBlKCldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzY2hlbWFPZlNjaGVtYTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFscGFjYSBvcHRpb25zIGZvciB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2hvcnQgZGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRldGFpbGVkIGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgd2lsbCBiZSByZWFkIG9ubHkgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIlRoaXMgZmllbGQgaXMgcmVhZC1vbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBzZXQgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRlZmF1bHQgdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0YXJlYSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRhdGEgdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijoga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkRpc2FsbG93ZWQgdmFsdWVzIGZvciB0aGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbUxhYmVsIjoiVmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgRGVwZW5kZW5jaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSI6MywKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbiAoZmllbGQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQgJiYgZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wYXJlbnQuY2hpbGRyZW5CeVByb3BlcnR5SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50LnByb3BlcnR5SWQpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbnMgZm9yICIgKyB0aGlzLmdldFRpdGxlKCksCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB0aGlzLmdldERlc2NyaXB0aW9uKCkgKyAiIChPcHRpb25zKSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm0iOnt9LAogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIElkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVuaXF1ZSBmaWVsZCBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB0eXBlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5nZXRGaWVsZFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dNZXNzYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNob3cgTWVzc2FnZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGlzcGxheSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWJsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSBkaXNhYmxlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZWFkb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB3aWxsIGJlIHJlYWRvbmx5IGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSBoaWRkZW4gaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgbGFiZWwuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhlbHBlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBoZWxwIG1lc3NhZ2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIGZpZWxkIGhlbHAgbWVzc2FnZXMuICBFYWNoIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgb24gaXQncyBvd24gbGluZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZpZWxkQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDU1MgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIG9uZSBvciBtb3JlIENTUyBjbGFzc2VzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGRvbSBlbGVtZW50IGZvciB0aGlzIGZpZWxkIG9uY2UgaXQgaXMgcmVuZGVyZWQuICBTdXBwb3J0cyBhIHNpbmdsZSB2YWx1ZSwgY29tbWEtZGVsaW1pdGVkIHZhbHVlcywgc3BhY2UtZGVsaW1pdGVkIHZhbHVlcyBvciB2YWx1ZXMgcGFzc2VkIGluIGFzIGFuIGFycmF5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlSW5pdFZhbGlkYXRpb25FcnJvciIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIEluaXRpYWwgVmFsaWRhdGlvbiBFcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iIDogIkhpZGUgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9jdXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb2N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgaW5pdGlhbCBmb2N1cyBmb3IgdGhlIGZvcm0gd2lsbCBiZSBzZXQgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgKHVzdWFsbHkgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBmb3JtKS4gIElmIGEgZmllbGQgbmFtZSBvciBwYXRoIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBzcGVjaWZpZWQgY2hpbGQgZmllbGQgd2lsbCByZWNlaXZlIGZvY3VzLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBzZXQgZm9jdXMgdG8gJ25hbWUnIChzZWxlY3RpbmcgdGhlICduYW1lJyBmaWVsZCkgb3IgeW91IG1pZ2h0IHNldCBpdCB0byAnY2xpZW50L25hbWUnIHdoaWNoIHBpY2tzIHRoZSAnbmFtZScgZmllbGQgb24gdGhlICdjbGllbnQnIG9iamVjdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWUgTGFiZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIHN0cmluZyBsYWJlbHMgZm9yIGl0ZW1zIGluIHRoZSBlbnVtIGFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk92ZXJyaWRlIG9mIHRoZSB2aWV3IGZvciB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3IgdGhpcyBmaWVsZCB0byBiZSByZW5kZXJlZCB3aXRoIGEgZGlmZmVyZW50IHZpZXcgKHN1Y2ggYXMgJ2Rpc3BsYXknIG9yICdjcmVhdGUnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewoKICAgICAgICAgICAgICAgIHNjaGVtYU9mT3B0aW9ucy5wcm9wZXJ0aWVzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIGZvciByZW5kZXJpbmcgdGhlIEZPUk0gdGFnLiIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybSBBdHRyaWJ1dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIklkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVuaXF1ZSBmb3JtIGlkLiBBdXRvLWdlbmVyYXRlZCBpZiBub3QgcHJvdmlkZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gZW5kcG9pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZvcm0gc3VibWlzc2lvbiBtZXRob2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwb3N0IiwiZ2V0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydWJ5cmFpbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSdWJ5IE9uIFJhaWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJ1Ynkgb24gUmFpbHMgTmFtZSBTdGFuZGFyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJ0cnVlIiwgImZhbHNlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb2N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb2N1cyBTZXR0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImJ1dHRvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybSBCdXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb25maWd1cmF0aW9uIGZvciBmb3JtLWJvdW5kIGJ1dHRvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWJtaXQgQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlc2V0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb2dnbGUgU3VibWl0IFZhbGlkIFN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUb2dnbGUgdGhlIHZhbGlkaXR5IHN0YXRlIG9mIHRoZSBTdWJtaXQgYnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZPcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgQWxwYWNhIG9wdGlvbnMgZm9yIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnNGb3JPcHRpb25zID0gewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsaWRhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkVuZm9yY2UgdmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dNZXNzYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiJTaG93IHZhbGlkYXRpb24gbWVzc2FnZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiJEaXNhYmxlIHRoaXMgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGlzIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGVscGVycyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0YXJlYSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZpZWxkQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkF1dG8tZm9jdXMgZmlyc3QgY2hpbGQgZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3BMZXZlbCgpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zRm9yT3B0aW9ucy5maWVsZHMuZm9ybSA9IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRob2QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvcHRpb25zRm9yT3B0aW9uczsKICAgICAgICB9CiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gUmVnaXN0ZXJzIGFkZGl0aW9uYWwgbWVzc2FnZXMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gYXJlIGRpc2FsbG93ZWQgdmFsdWVzLiIsCiAgICAgICAgIm5vdE9wdGlvbmFsIjogIlRoaXMgZmllbGQgaXMgbm90IG9wdGlvbmFsLiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250cm9sRmllbGQgPSBBbHBhY2EuRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udHJvbEZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHNpZ25hbCB0aGF0IHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25Db25zdHJ1Y3Q6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB0aGlzLmlzQ29udHJvbEZpZWxkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyBoZWxwZXIgbWV0aG9kIGZvciBnZXR0aW5nIHZhbCgpIGZyb20gdGhlIGNvbnRyb2wKICAgICAgICAgICAgICAgIC8vIGhhbmRsZXMgY29udmVyc2lvbiB0byB0aGUgY29ycmVjdCBzY2FsYXIgdHlwZQogICAgICAgICAgICAgICAgdGhpcy5fZ2V0Q29udHJvbFZhbCA9IGZ1bmN0aW9uKGVuc3VyZVByb3BlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICQodGhpcy5jb250cm9sKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVQcm9wZXJUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfdGhpcy5lbnN1cmVQcm9wZXJUeXBlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xUZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250cm9sVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2xUZW1wbGF0ZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250cm9sOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGNvbnRyb2xUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgICAgIC8vIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVuZGVyQnV0dG9ucyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udmFsdWUgPSB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnN0eWxlcyA9IHRoaXMudmlldy5zdHlsZXMuYnV0dG9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZ2V0Q29udHJvbEVsOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICByZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICAgICAgdmFyIGZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udHJvbC0iICsgYi5nZXRGaWVsZFR5cGUoKSwgc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHlwZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uU2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewoKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGlzQXV0b0ZvY3VzYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRyb2wiIHRlbXBsYXRlIGFzIHRoZSBwcmltYXJ5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRyb2wiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFkZCBhICJjb250cm9sIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJGaWVsZEVsZW1lbnRzOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIG91ciBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sID0gJCh0aGlzLmZpZWxkKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVtb3ZlQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UUk9MX0ZJRUxEKTsKCiAgICAgICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgICAgIHNlbGYucHJlcGFyZUNvbnRyb2xNb2RlbChmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oY29udHJvbEZpZWxkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wucmVwbGFjZVdpdGgoY29udHJvbEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSBjb250cm9sRmllbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVFJPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250cm9sIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImNvbnRyb2wiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyUmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUHJlcGFyZXMgdGhlIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24obW9kZWwpCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IHt9OwogICAgICAgICAgICAgICAgbW9kZWwuaWQgPSB0aGlzLmdldElkKCk7CiAgICAgICAgICAgICAgICBtb2RlbC5uYW1lID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnNjaGVtYSA9IHRoaXMuc2NoZW1hOwogICAgICAgICAgICAgICAgbW9kZWwuZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgICAgICAgICAgIG1vZGVsLnJlcXVpcmVkID0gdGhpcy5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICBtb2RlbC52aWV3ID0gdGhpcy52aWV3OwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYmVmb3JlUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgcmVuZGVyZWQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZihzZWxmLmRhdGEpID09ICJ1bmRlZmluZWQiKSB8fCBzZWxmLmRhdGEgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBoYW5kbGUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdFVwZGF0ZU9ic2VydmFibGVGaXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtY29udHJvbC1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJidXR0b24tcHVzaGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBjbGljayBoYW5kbGVyPwogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEta2V5Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25Db25maWcgPSBzZWxmLm9wdGlvbnMuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oY29udHJvbCwgaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKGNvbnRyb2wsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFJlbmRlcnMgdGhlIGNvbnRyb2wgaW50byB0aGUgZmllbGQgY29udGFpbmVyLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNvbnRyb2wgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRyb2xEZXNjcmlwdG9yLCBtb2RlbCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soY29udHJvbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZSB0byB0aGUgbGFiZWwKICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRGl2ID0gJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCIpOwogICAgICAgICAgICAgICAgIHZhciBsYWJlbERpdiA9ICQoJy5hbHBhY2EtY29udHJvbGZpZWxkLWxhYmVsJywgdGhpcy5vdXRlckVsKTsKICAgICAgICAgICAgICAgICBpZiAobGFiZWxEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9IGxhYmVsRGl2OwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgdmFyIGhlbHBlckRpdiA9ICQoJy5hbHBhY2EtY29udHJvbGZpZWxkLWhlbHBlcicsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGhlbHBlckRpdi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICB0aGlzLmhlbHBlckRpdiA9IGhlbHBlckRpdjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSAibmFtZSIgcHJvcGVydHkgb24gdGhlIGNvbnRyb2wgaXMga2VwdCBpbiBzeW5jLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG5hbWUgZmllbGQKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5hdHRyKCJuYW1lIiwgdGhpcy5nZXROYW1lKCkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldERlZmF1bHQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldERlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGRlZmF1bHREYXRhID0gQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbJ2RlZmF1bHQnXSkgPyAiIiA6IHRoaXMuc2NoZW1hWydkZWZhdWx0J107CiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKGRlZmF1bHREYXRhKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5nZXRDb250cm9sVmFsdWUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGNvcnJlY3Rpb24gZm9yIHR5cGUKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lbnN1cmVQcm9wZXJUeXBlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIHZhbHVlLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBWYWxpZGF0ZSBhZ2FpbnN0IGVudW0gcHJvcGVydHkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBlbGVtZW50IHZhbHVlIGlzIHBhcnQgb2YgdGhlIGVudW0gbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0RW51bSgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCgpICYmIEFscGFjYS5pc1ZhbEVtcHR5KHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5nZXRFbnVtKCksIHZhbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRW51bSgpOwoKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdmFsdWVzIHByZXNlbnRlZCB0byB0aGUgdXNlciBpbiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZS4gSWYgdGhlcmUgYXJlIG9wdGlvbkxhYmVscywgdXNlIHRoZW0gaW4KICAgICAgICAgICAgICAgIC8vIHByZWZlcmVuY2UgdG8gdGhlIHJhdyBlbnVtIHZhbHVlcy4KICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVmFsdWVzID0gdGhpcy5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAvLyB1c2Ugb3B0aW9uIGxhYmVscyBpZiB0aG9zZSBhcmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTGFiZWxzID0gdGhpcy5nZXRPcHRpb25MYWJlbHMoKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMgJiYgb3B0aW9uTGFiZWxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVmFsdWVzID0gb3B0aW9uTGFiZWxzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRWYWx1ZU9mRW51bSJdID0gewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWRWYWx1ZU9mRW51bSIpLCBbbWVzc2FnZVZhbHVlcy5qb2luKCcsICcpLCB0aGlzLmdldFZhbHVlKCldKSwKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bImludmFsaWRWYWx1ZU9mRW51bSJdWyJzdGF0dXMiXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpbml0RXZlbnRzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW5pdENvbnRyb2xFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gdGhpcy5jb250cm9sOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2xpY2siLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgY29udHJvbCBsZXZlbCBoYW5kbGVycyBmb3IgdGhpbmdzIHRoYXQgaGFwcGVuIHRvIGlucHV0IGVsZW1lbnQKICAgICAgICAgICAgICAgIGNvbnRyb2wuY2hhbmdlKGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIHRvIHJ1biBBRlRFUiBjb250cm9sIGNsaWNrIGhhbmRsZXJzCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmZvY3VzKGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXNGb2N1c2VkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wuYmx1cihmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzQmx1cnJlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uQmx1ci5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXlwcmVzcyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5UHJlc3MuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXl1cChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYub25LZXlEb3duLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgcHJlc3MgZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciByZWZyZXNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gZWRpdCBtb2RlCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgJiYgc2VsZi52aWV3LnR5cGUgPT09ICdlZGl0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgY3VycmVudGx5IGludmFsaWQsIHRoZW4gd2UgcHJvdmlkZSBlYXJseSBmZWVkYmFjayB0byB0aGUgdXNlciBhcyB0byB3aGVuIHRoZXkgZW50ZXIKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgd2FzIHZhbGlkLCB3ZSBkb24ndCByZW5kZXIgaW52YWxpZGF0aW9uIGZlZWRiYWNrIHVudGlsIHRoZXkgYmx1ciB0aGUgZmllbGQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHRoZSBjb250cm9sIHZhbGlkIHByZXZpb3VzbHk/CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnY3JlYXRlJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd2FzVmFsaWQgPSB0aGlzLmlzVmFsaWQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc1ZhbGlkICYmIHNlbGYud2FzQmx1cnJlZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGJlY2F1c2UgYXQgdGhpcyBleGFjdCBtb21lbnQsIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpcyBzdGlsbCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgLy8galF1ZXJ5IHJhaXNlcyB0aGUga2V5cHJlc3MgZXZlbnQgYWhlYWQgb2YgdGhlIGlucHV0IHJlY2VpdmluZyB0aGUgbmV3IGRhdGEgd2hpY2ggd291bGQgaW5jb3Jwb3JhdGUKICAgICAgICAgICAgICAgICAgICAvLyB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGltZW91dCBwcm92aWRlcyB0aGUgYnJvd3NlciB3aXRoIGVub3VnaCB0aW1lIHRvIHBsdWcgdGhlIHZhbHVlIGludG8gdGhlIGlucHV0IGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aGUgdmFsaWRhdGlvbiBsb2dpYyB1c2VzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb250cm9sIGlzIG5vdyBpbiBhIHZhbGlkIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgZG93biBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleWRvd24gZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHVwIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5dXAgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIYW5kbGVyIGZvciBjbGljayBldmVudC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgQ2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzRGlzYWJsZWQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gdGhlIGVudW0gdmFsdWUgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXRzIHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge2FycmF5fSBlbnVtQXJyYXkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldEVudW06IGZ1bmN0aW9uKGVudW1BcnJheSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLnNhZmVTZXRPYmplY3RBcnJheSh0aGlzLnNjaGVtYSwgImVudW0iLCBlbnVtQXJyYXkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gdGhlIG9wdGlvbiBsYWJlbHMgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1sib3B0aW9uTGFiZWxzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXRzIHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gb3B0aW9uTGFiZWxzQXJyYXkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldE9wdGlvbkxhYmVsczogZnVuY3Rpb24ob3B0aW9uTGFiZWxzQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5vcHRpb25zLCAib3B0aW9uTGFiZWxzIiwgb3B0aW9uTGFiZWxzQXJyYXkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFNvcnRzIHRoZSBnaXZlbiBlbnVtZXJhdGVkIHZhbHVlcyB1c2luZyB0aGUgbG9jYWwgc29ydFNlbGVjdGFibGVPcHRpb25zIG1ldGhvZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNvcnRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gdGhpcy5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyAmJiBlbnVtVmFsdWVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RhYmxlT3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudW1WYWx1ZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gZW51bVZhbHVlc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMgJiYgb3B0aW9uTGFiZWxzLmxlbmd0aCA+PSBpICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZU9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdGV4dAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRTZWxlY3RhYmxlT3B0aW9ucyhzZWxlY3RhYmxlT3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyBzZXQgYmFjawogICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbnVtVmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0YWJsZU9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnVtVmFsdWVzLnB1c2goc2VsZWN0YWJsZU9wdGlvbnNbaV0udmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG9wdGlvbkxhYmVscykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wdGlvbkxhYmVscy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVudW0obmV3RW51bVZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25MYWJlbHMobmV3T3B0aW9uTGFiZWxzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyBhIHNlbGVjdCBvcHRpb25zIGFycmF5IGJ5IG9yZGVyIG9mIGRpc3BsYXlhYmxlIHRleHQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIElmIHlvdSdyZSBsb29raW5nIHRvIHByb3ZpZGUgYSBjdXN0b20gc29ydCBvcmRlciwgeW91IG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25zLnNvcnQgZnVuY3Rpb24gLSBmbihhLCBiKS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdGFibGVPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0U2VsZWN0YWJsZU9wdGlvbnM6IGZ1bmN0aW9uKHNlbGVjdGFibGVPcHRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gaWYgc29ydCBpcyBmYWxzZSwganVzdCByZXR1cm4KICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBhIGRlZmF1bHQgc29ydCBmdW5jdGlvbgogICAgICAgICAgICAgICAgdmFyIHNvcnRGbiA9IEFscGFjYS5kZWZhdWx0U29ydDsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGUgYSBjdXN0b20gc29ydCBmdW5jdGlvbiwgdXNlIHRoYXQgaW5zdGVhZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc29ydCkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZuID0gc2VsZi5vcHRpb25zLnNvcnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNvcnQgaXQKICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnNvcnQoc29ydEZuKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGEgZGF0YXNvdXJjZSBjb25maWd1cmVkIGZvciB0aGlzIGNvbnRyb2wuICBUaGUgcmVzdWx0cyBhcmUgd3JpdHRlbiBpbnRvIHRoZQogICAgICAgICAgICAgKiBnaXZlbiBhcnJheSBhbmQgdGhlIG9uRmluaXNoIG1ldGhvZCBpcyB0aGVuIGNhbGxlZCB3aXRoIChlcnIsIGFycmF5KS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICAgICAgICAqIEBwYXJhbSBvbkZpbmlzaAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW52b2tlRGF0YVNvdXJjZTogZnVuY3Rpb24oYXJyYXksIG1vZGVsLCBvbkZpbmlzaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkZpbmlzaChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlckxvYWREYXRhU291cmNlT3B0aW9ucyhhcnJheSwgbW9kZWwsIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkZpbmlzaChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBzb3J0aW5nIHRvIHdoYXRldmVyIHdlIHByb2R1Y2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoYXJyYXkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5pc2gobnVsbCwgYXJyYXkpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LmJpbmQoc2VsZik7CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1trXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1VyaShzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsZSA9IHNlbGYudmlldy5sb2NhbGU7CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAiIiArIHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICgodXJsLmluZGV4T2YoIj8iKSA9PT0gLTEpID8gIj8iIDogIiYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICJsb2NhbGU9IiArIGxvY2FsZTsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb25Eb2N1bWVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IGpzb25Eb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lciAmJiBBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHMgPSBzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lcihkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG9iamVjdHMsIHdlIHdhbGsgdGhyb3VnaCBvbmUga2V5IGF0IGEgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zZXJ0aW9uIG9yZGVyIGlzIHRoZSBvcmRlciBvZiB0aGUga2V5cyBmcm9tIHRoZSBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcHJlc2VydmUgb3JkZXIsIGNvbnNpZGVyIHVzaW5nIGFuIGFycmF5IGFzIGJlbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChkcywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShkcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXJyYXlzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGluZGV4IGF0IGEgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zZXJ0aW9uIG9yZGVyIGlzIGRpY3RhdGVkIGJ5IHRoZSBvcmRlciBvZiB0aGUgaW5kaWNlcyBpbnRvIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHByZXNlcnZlcyBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2YWx1ZS50ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiJVbmFibGUgdG8gbG9hZCBkYXRhIGZyb20gdXJpIDogIiArIHNlbGYub3B0aW9ucy5kYXRhU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBU09VUkNFX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianFYSFIiIDoganFYSFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclRocm93biIgOiBlcnJvclRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRzID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGRzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogZHNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogZHNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZHNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3IgPSBzZWxmLmNvbm5lY3RvcjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29ubmVjdG9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RvcklkID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29ubmVjdG9yLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbm5lY3RvckNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQsIGNvbm5lY3RvckNvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB1c2luZyBjb25uZWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLmxvYWREYXRhU291cmNlKGNvbmZpZywgZnVuY3Rpb24odmFsdWVzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZXNbaV0pID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2YWx1ZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBzdGFuZGFyZCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZVtrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnM6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGFycmF5KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICAgICAsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2Ygc3BlY2lmaWMgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbUxhYmVsIjoiVmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIE5hbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInNvcnQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU29ydCBGdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmaW5lcyBhbiBmKGEsYikgc29ydCBmdW5jdGlvbiBmb3IgdGhlIGFycmF5IG9mIGVudW1lcmF0ZWQgdmFsdWVzIFt7dGV4dCwgdmFsdWV9XS4gIFRoaXMgaXMgdXNlZCB0byBzb3J0IGVudW0gYW5kIG9wdGlvbkxhYmVscyBhcyB3ZWxsIGFzIHJlc3VsdHMgdGhhdCBjb21lIGJhY2sgZnJvbSBhbnkgZGF0YSBzb3VyY2VzIChmb3Igc2VsZWN0IGFuZCByYWRpbyBjb250cm9scykuICBCeSBkZWZhdWx0IHRoZSBpdGVtcyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiAgIERvbid0IGFwcGx5IGFueSBzb3J0aW5nIGlmIGZhbHNlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGluIHswfS4gIEN1cnJlbnQgdmFsdWUgaXM6IHsxfSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbnRhaW5lckZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Db250YWluZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHNpZ25hbCB0aGF0IHRoaXMgZmllbGQgaXMgYSBjb250YWluZXIgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgb25Db25zdHJ1Y3Q6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuaXNDb250YWluZXJGaWVsZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaXNDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBpc0NvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0Q29udGFpbmVyRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgY29udGFpbmVyIGZpZWxkcywgd2UgdXNlIHRoZSAiY29udGFpbmVyIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRlbXBsYXRlRGVzY3JpcHRvcklkCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCA6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImNvbnRhaW5lciI7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB3YWxrIHRoZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgZmluZCBhIHRlbXBsYXRlIHR5cGUKCiAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciBiID0gdGhpczsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFiLmdldEZpZWxkVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGIuZ2V0RmllbGRUeXBlKCksIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBiID0gYi5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHlwZTsKICAgICAgICB9LAoKICAgICAgICByZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB3YWxrIHRoZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgZmluZCBhIHRlbXBsYXRlIHR5cGUKCiAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciBiID0gdGhpczsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFiLmdldEZpZWxkVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGIuZ2V0RmllbGRUeXBlKCkgKyAiLWl0ZW0iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVyVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udGFpbmVyVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVyVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lcjogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lclRlbXBsYXRlVHlwZSwgc2VsZik7CgogICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGZhbHNlCiAgICAgICAgICAgIHZhciBjb2xsYXBzaWJsZSA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcuY29sbGFwc2libGUpKSB7CiAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZSA9IHRoaXMudmlldy5jb2xsYXBzaWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMuY29sbGFwc2libGUpKSB7CiAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZSA9IHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlID0gY29sbGFwc2libGU7CgogICAgICAgICAgICB2YXIgbGVnZW5kU3R5bGUgPSAiYnV0dG9uIjsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmxlZ2VuZFN0eWxlKSkgewogICAgICAgICAgICAgICAgbGVnZW5kU3R5bGUgPSB0aGlzLnZpZXcubGVnZW5kU3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlKSkgewogICAgICAgICAgICAgICAgbGVnZW5kU3R5bGUgPSB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSA9IGxlZ2VuZFN0eWxlOwoKICAgICAgICAgICAgLy9MYXp5IGxvYWRpbmcKICAgICAgICAgICAgdGhpcy5sYXp5TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZykpIHsKICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSB0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmc7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZGluZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kZWxldGUgdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGhvbGRlcnMgb2YgcmVmZXJlbmNlcyB0byBjaGlsZHJlbgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107CiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeUlkID0ge307CiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250YWluZXIgaXMgRE9NLXdyYXBwZWQgd2l0aCBhIGZvcm0sIHRoZW4gcmVsZWFzZSB0aGUgZm9ybQogICAgICAgICAgICBpZiAodGhpcy5mb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZGVzdHJveSh0cnVlKTsgLy8gcGFzcyBpbiB0cnVlIHNvIHRoYXQgd2UgZG9uJ3QgY2FsbCBiYWNrIHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5mb3JtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZXN0cm95IGFueSBjaGlsZCBjb250cm9scwogICAgICAgICAgICBBbHBhY2EuZWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZCBhICJjb250YWluZXIiIGRvbSBlbGVtZW50IGluc2lkZSBvZiB0aGUgZmllbGQgd2hpY2ggaG91c2VzIG91ciBjdXN0b20gY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjcmVuZGVyRmllbGQKICAgICAgICAgKi8KICAgICAgICByZW5kZXJGaWVsZEVsZW1lbnRzOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEKTsKCiAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICBzZWxmLnByZXBhcmVDb250YWluZXJNb2RlbChmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgICAgICAgc2VsZi5iZWZvcmVSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbihjb250YWluZXJGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5yZXBsYWNlV2l0aChjb250YWluZXJGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciA9IGNvbnRhaW5lckZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKEFscGFjYS5DTEFTU19DT05UQUlORVIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSBmb3JtIGZpZWxkIHdpdGggImFscGFjYS1ob3Jpem9udGFsIiBvciAiYWxwYWNhLXZlcnRpY2FsIgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3Lmhvcml6b250YWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtaG9yaXpvbnRhbCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIuYWRkQ2xhc3MoImFscGFjYS12ZXJ0aWNhbCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImNvbnRhaW5lciIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImNvbnRhaW5lciIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAqLwogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbW9kZWwgPSB7CiAgICAgICAgICAgICAgICAiaWQiOiB0aGlzLmdldElkKCksCiAgICAgICAgICAgICAgICAibmFtZSI6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgICJzY2hlbWEiOiB0aGlzLnNjaGVtYSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGxvYWQgaXRlbXMgaW50byBhcnJheSBhbmQgc3RvcmUgb24gbW9kZWwgZm9yIGZ1dHVyZSB1c2UKICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtcyhmdW5jdGlvbihpdGVtcykgewoKICAgICAgICAgICAgICAgIGlmICghaXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogYXNzdW1lIGNvbnRhaW5lckl0ZW1FbCA9IGZpZWxkRWwKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtc1tpXS5jb250YWluZXJJdGVtRWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uY29udGFpbmVySXRlbUVsID0gaXRlbXNbaV0uZ2V0RmllbGRFbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5pdGVtcyA9IGl0ZW1zOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250YWluZXIgaW50byB0aGUgZmllbGQgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IEFscGFjYS50bXBsKHRoaXMuY29udGFpbmVyRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjayhjb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhZnRlciB0aGUgY29udGFpbmVyIGlzIHJlbmRlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmVmb3JlQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgc2VsZi5hcHBseUNyZWF0ZWRJdGVtcyhtb2RlbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtcyhtb2RlbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5jb2xsYXBzaWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb2xsYXBzaWJsZSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbnkgc3ViLWl0ZW1zIGZvciB0aGlzIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb25fcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYmVmb3JlQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBsYXlvdXRCaW5kaW5ncyA9IG51bGw7CiAgICAgICAgICAgIGlmIChzZWxmLmlzVG9wTGV2ZWwoKSAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzID0gc2VsZi52aWV3LmdldExheW91dCgpLmJpbmRpbmdzOwoKICAgICAgICAgICAgICAgIC8vIGlmIGxheW91dCBhbmQgYmluZGluZ3Mgbm90IHByb3ZpZGVkLCBhc3N1bWUgYSBkZWZhdWx0IHN0cmF0ZWd5CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzICYmIHNlbGYudmlldy5nZXRMYXlvdXQoKS50ZW1wbGF0ZURlc2NyaXB0b3IgJiYgbW9kZWwuaXRlbXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBtb2RlbC5pdGVtc1tpXS5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3NbbmFtZV0gPSAiW2RhdGEtYWxwYWNhLWxheW91dC1iaW5kaW5nPSciICsgbmFtZSArICInXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBtb2RlbC5pdGVtcy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5yZW1vdmVBdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50ID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIlsiICsgQWxwYWNhLk1BUktFUl9EQVRBX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0tFWSArICI9JyIgKyBpdGVtLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmICghbGF5b3V0QmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGRlciA9ICQoaW5zZXJ0aW9uUG9pbnQpLnBhcmVudCgpOwoKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZXBsYWNlV2l0aChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGRvbUVsIHRvIGFsbG93IGZvciByZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9IGhvbGRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYSBsYXlvdXQKICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0lkID0gbGF5b3V0QmluZGluZ3NbaXRlbS5uYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0lkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGRlciA9ICQoYmluZGluZ0lkLCBzZWxmLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvbGRlci5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQsIGZhbGxiYWNrIHRvIElEIGJhc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9ICQoJyMnICsgYmluZGluZ0lkLCBzZWxmLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgd3JhcHBlciAod2hpY2ggd2lsbCBzZXJ2ZSBhcyB0aGUgZG9tRWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbS5kb21FbCkuYWRkQ2xhc3MoImFscGFjYS1sYXlvdXQtYmluZGluZy1ob2xkZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbS5kb21FbCkuYXR0cigiYWxwYWNhLWxheW91dC1iaW5kaW5nLWZpZWxkLW5hbWUiLCBpdGVtLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmFwcGVuZChpdGVtLmRvbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwuYXBwZW5kKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0iKTsKCiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBtb2RlbC5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiLCBpKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBpdGVtLm5hbWUpOwogICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkIiwgc2VsZi5nZXRJZCgpKTsKCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5jb2xsYXBzaWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb2xsYXBzaWJsZSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtczogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCBjaGlsZCBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbnRyb2x9IGNoaWxkIENoaWxkIGZpZWxkIHRvIGJlIGFkZGVkLgogICAgICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggSW5kZXggb2YgdGhlIG5ldyBjaGlsZC4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckNoaWxkOiBmdW5jdGlvbihjaGlsZCwgaW5kZXgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGluZGV4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkLmdldElkKCldID0gY2hpbGQ7CiAgICAgICAgICAgIGlmIChjaGlsZC5wcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdID0gY2hpbGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgICAgKi8KICAgICAgICB1bnJlZ2lzdGVyQ2hpbGQ6IGZ1bmN0aW9uKGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpbmRleF07CiAgICAgICAgICAgIGlmICghY2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkLmdldElkKCldOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbY2hpbGQucHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIsIHNlbGYuY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5yZW1vdmVBdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgLy8gc2V0IHBhdGggaWYgbm90IHNldAogICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpICsgIl0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgY2hpbGQucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2hpbGQuY2FsY3VsYXRlTmFtZSgpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0Iik7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0ta2V5Iik7CgogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0iKTsKCiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZSIsIGNoaWxkLm5hbWUpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDaGlsZERPTVdyYXBwZXJFbGVtZW50KGksIGNoaWxkKTsKCiAgICAgICAgICAgICAgICBjaGlsZC51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFWFRFTlNJT04gUE9JTlQgdGhhdCBhbGxvd3MgY29udGFpbmVycyB0byB1cGRhdGUgYW55IGN1c3RvbSB3cmFwcGVyIGVsZW1lbnRzIGZvciBjaGlsZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpCiAgICAgICAgICogQHBhcmFtIGNoaWxkCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudDogZnVuY3Rpb24oaSwgY2hpbGQpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGlzIGR5bmFtaWNhbGx5IGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBhIGNvbnRhaW5lci4gIFRoaXMgYWxsb3dzIGFsbCBvZiB0aGUKICAgICAgICAgKiBjb250YWluZXIgbWFya2VycyB0byByZWZyZXNoIG9uIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2g6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmdldFBhcmVudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZSBkb20gbWFya2VycyBmb3IgcGFyZW50IHdoaWNoIHdpbGwgdHJpY2tsZSBkb3duIHRvIHRvIGNvdmVyIHRoaXMgZmllbGQgYW5kIG91ciBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5nZXRQYXJlbnQoKS51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBqdXN0IG91cnNlbHZlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIHNpZ25hbCBkb3duIHRvIGFsbCBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIHNpZ25hbCBkb3duIHRvIGFsbCBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudENvbmNlYWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzIGFuIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4gIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBvciBpZiBubyBpbnZhbGlkIGVsZW1lbnRzLCBwaWNrCiAgICAgICAgICogdGhlIGZpcnN0IGNoaWxkLiAgSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIGlzIGZpcmVkIGFuZCBwYXNzZWQgdGhlIGNvbnRyb2wgZWxlbWVudAogICAgICAgICAqIHRoYXQgcmVjZWl2ZWQgdGhlIGZvY3VzLgogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW52YWxpZEluZGV4ID0gLTE7CgogICAgICAgICAgICAvLyB1c2UgdGhlIGRvbSB0byBjcmVhdGUgYW4gYXJyYXkgdGhhdCBvcmRlcnMgdGhpbmdzIGFzIHRoZXkgYXJlIGxhaWQgb3V0IG9uIHRoZSBwYWdlCiAgICAgICAgICAgIHZhciBwYWdlT3JkZXJlZENoaWxkcmVuID0gW107CiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0Q29udGFpbmVyRWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkgewogICAgICAgICAgICAgICAgZWwgPSB0aGlzLmZvcm0uZ2V0Rm9ybUVsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyB0aGlzLmdldElkKCkgKyAiJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkSW5kZXggPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4Iik7CiAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuLnB1c2goc2VsZi5jaGlsZHJlbltjaGlsZEluZGV4XSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gd2FsayB0aGUgb3JkZXJlZCBjaGlsZHJlbiBhbmQgZmluZCBmaXJzdCBpbnZhbGlkCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWdlT3JkZXJlZENoaWxkcmVuW2ldLmlzVmFsaWQodHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0NvbnRyb2xGaWVsZCAmJgogICAgICAgICAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuW2ldLmlzQXV0b0ZvY3VzYWJsZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlT3JkZXJlZENoaWxkcmVuW2ldLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGludmFsaWQsIGp1c3QgZm9jdXMgb24gZmlyc3QgaXRlbQogICAgICAgICAgICBpZiAoaW52YWxpZEluZGV4ID09PSAtMSAmJiBwYWdlT3JkZXJlZENoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludmFsaWRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIHRoZSBmb2N1cyBpZiB3ZSBmb3VuZCBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuW2ludmFsaWRJbmRleF0uZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhwYWdlT3JkZXJlZENoaWxkcmVuW2ludmFsaWRJbmRleF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0uZGlzYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmVuYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IHZhbHVlIEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldENvbnRhaW5lclZhbHVlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAiICAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludAogICAgICAgICAqLwogICAgICAgIGdldENvbnRhaW5lclZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBmaXJzdENoaWxkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5jaGlsZHJlblswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0sCgogICAgICAgIGxhc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJsYXp5TG9hZGluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhenkgTG9hZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDaGlsZCBmaWVsZHMgd2lsbCBvbmx5IGJlIHJlbmRlcmVkIHdoZW4gdGhlIGZpZWxkc2V0IGlzIGV4cGFuZGVkIGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2libGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzaWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBzZXQgaXMgY29sbGFwc2libGUgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbGxhcHNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBzZXQgaXMgaW5pdGlhbGx5IGNvbGxhcHNlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMZWdlbmQgU3R5bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGxlZ2VuZCBzdHlsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJidXR0b24iLCJsaW5rIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImJ1dHRvbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbmltYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQW5pbWF0ZSBtb3ZlbWVudHMgYW5kIHRyYW5zaXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVwIGFuZCBkb3duIHRyYW5zaXRpb25zIHdpbGwgYmUgYW5pbWF0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJsYXp5TG9hZGluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiTGF6eSBsb2FkaW5nIGNoaWxkIGZpZWxkcyA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJMYXp5IGxvYWRpbmcgd2lsbCBiZSBlbmFibGVkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2libGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkZpZWxkIHNldCBjb2xsYXBzaWJsZSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBzZXQgaXMgY29sbGFwc2libGUgaWYgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkZpZWxkIHNldCBpbml0aWFsbHkgY29sbGFwc2VkID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsZWdlbmRTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiQW5pbWF0ZSBtb3ZlbWVudHMgYW5kIHRyYW5zaXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZvcm0gPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Gb3JtLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBUaGlzIGNsYXNzIGlzIGZvciBtYW5hZ2luZyBIVE1MIGZvcm0gY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21FbCBGaWVsZCBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZG9tRWwsIG9wdGlvbnMsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICAvLyBjb250YWluZXIKICAgICAgICAgICAgdGhpcy5kb21FbCA9IGRvbUVsOwoKICAgICAgICAgICAgLy8gcGFyZW50CiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKCiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOwogICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrOwoKICAgICAgICAgICAgLy8gb3B0aW9ucwogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC50eXBlID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0Lm5hbWUgPSAnc3VibWl0JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnZhbHVlID0gJ1N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlID0gJ3Jlc2V0JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC5uYW1lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC52YWx1ZSA9ICdSZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNvbWUgZ2VuZXJhbCBjb3JyZWN0aW9uCiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50aXRsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmF0dHJpYnV0ZXMuaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzdWJtaXQgYnV0dG9uIHNwZWNpZmllZCwgYW5kIHRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUgaXNuJ3QgZGVmaW5lZCwgc2V0IHRvIHRydWUgYnkgZGVmYXVsdAogICAgICAgICAgICAvLyBkb24ndCBhbGxvdyB0aGUgZm9ybSB0byBzdWJtaXQgdW5sZXNzIHZhbGlkCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucyAmJiB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQgJiYgQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnZpZXdUeXBlID0gb3B0aW9ucy52aWV3VHlwZTsKCiAgICAgICAgICAgIC8vIHNldCBhIHJ1bnRpbWUgdmlldwogICAgICAgICAgICB0aGlzLnZpZXcgPSBuZXcgQWxwYWNhLlJ1bnRpbWVWaWV3KHZpZXdJZCwgdGhpcyk7CgogICAgICAgICAgICAvLyBmb3IgZWFjaCBidXR0b24sIG1ha2Ugc3VyZSB0aGF0IGNsYXNzZXMgaXMgc2V0IG1pbmltYWxseSB0byB2aWV3LnN0eWxlcy5idXR0b24KICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZm9ybSBpbnRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyIGl0CiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlbmRlcih0aGlzLmRvbUVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBiaW5kIG91ciBmaWVsZCBkb20gZWxlbWVudCBpbnRvIHRoZSBkb21FbAogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgIC8vIGFkZCBkZWZhdWx0IGNsYXNzCiAgICAgICAgICAgICAgICBzZWxmLmZvcm0uYWRkQ2xhc3MoImFscGFjYS1mb3JtIik7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmb3JtIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImZvcm0iKTsKCiAgICAgICAgICAgICAgICAvLyBleGVjdXRlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJJbml0aWFsaXplOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpIHsKCiAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgc3VibWl0IGJ1dHRvbiBzdGF0ZQogICAgICAgICAgICAgICAgc2VsZi5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRvcCBjb250cm9sIGlzIGVudGlyZWx5IHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBpc0Zvcm1WYWxpZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gcmUtY29tcHV0ZSB2YWxpZGF0aW9uIGZvciB0aGUgZnVsbCBjb250cm9sIHNldAogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wudmFsaWRhdGUodHJ1ZSk7CgogICAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnRvcENvbnRyb2wuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgLy90aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNGb3JtVmFsaWQoKTsKICAgICAgICB9LAoKICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24oY2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKGNoaWxkcmVuKTsKICAgICAgICB9LAoKICAgICAgICBlbmFibGVTdWJtaXRCdXR0b246IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYXR0clByb3AoImRpc2FibGVkIiwgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGVTdWJtaXRCdXR0b246IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYXR0clByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICBpZiAoJC5tb2JpbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyeSB7ICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYnV0dG9uKCdyZWZyZXNoJyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWRqdXN0U3VibWl0QnV0dG9uU3RhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVN1Ym1pdEJ1dHRvbigpOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNGb3JtVmFsaWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVTdWJtaXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlc3BvbnNpYmxlIGZvciBmZXRjaGluZyBhbnkgdGVtcGxhdGVzIG5lZWRlZCBzbyBhcyB0byByZW5kZXIgdGhlCiAgICAgICAgICogY3VycmVudCBtb2RlIGZvciB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogT25jZSBjb21wbGV0ZWQsIHRoZSBvblN1Y2Nlc3MgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRFbCBGaWVsZCBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBwcm9jZXNzUmVuZGVyOiBmdW5jdGlvbihwYXJlbnRFbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb29rdXAgdGhlIHRlbXBsYXRlIHdlIHNob3VsZCB1c2UgdG8gcmVuZGVyCiAgICAgICAgICAgIHRoaXMuZm9ybURlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJmb3JtIik7CiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDb3VsZCBub3QgZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yOiBmb3JtIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZW5kZXJlZERvbUVsZW1lbnQgPSBBbHBhY2EudG1wbCh0aGlzLmZvcm1EZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICBpZDogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgdGhpcy5mb3JtID0gcmVuZGVyZWREb21FbGVtZW50OwoKICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHNDb250YWluZXIgPSAkKHRoaXMuZm9ybSkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQpOwogICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHNDb250YWluZXIucmVtb3ZlQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmZvcm0uYXR0cigiaWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItZm9ybS1vdXRlciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmZvcm0uYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiLCB0aGlzLmdldElkKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgZm9ybSBmaWVsZAogICAgICAgICAgICAkKHBhcmVudEVsKS5maW5kKCJmb3JtIikuYXR0cih0aGlzLmF0dHJpYnV0ZXMpOwoKICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGJ1dHRvbnMgYXMgd2VsbAogICAgICAgICAgICB0aGlzLmJ1dHRvbnMgPSB7fTsKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJidXR0b24tcHVzaGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEta2V5Iik7CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25Db25maWcgPSBzZWxmLm9wdGlvbnMuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChidXR0b25Db25maWcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGZvcm0sIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChmb3JtLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIGJ1dHRvbkNvbmZpZy5jbGljaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGb3JtIGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZm9ybSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGlzIGZvcm0ncyBwYXJlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3JtIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgSlNPTiByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSBWYWx1ZSBvZiB0aGUgSlNPTiByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcENvbnRyb2wuZ2V0VmFsdWUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSlNPTiB0byBiZSByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0LgogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgZXZlbnRzIGhhbmRsaW5nIChGb3JtIFN1Ym1pc3Npb24pIGZvciB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmb3JtVGFnID0gJCh0aGlzLmRvbUVsKS5maW5kKCJmb3JtIik7CgogICAgICAgICAgICB2YXIgdiA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgJChmb3JtVGFnKS5zdWJtaXQodiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uU3VibWl0KGUsIF90aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGZpZWxkdXBkYXRlcyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvcm0gaXMgdmFsaWQuCiAgICAgICAgICAgIC8vIGlmIHNvLCBlbmFibGUgdGhlIHN1Ym1pdCBidXR0b24uLi4KICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBkaXNhYmxlIGl0CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGR1cGRhdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRrZXl1cCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkKF90aGlzLnRvcENvbnRyb2wuZ2V0RmllbGRFbCgpKS5iaW5kKCJmaWVsZGJsdXIiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0QnV0dG9uRWw6IGZ1bmN0aW9uKGJ1dHRvbklkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICQodGhpcy5kb21FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbi0iICsgYnV0dG9uSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgZm9ybSBzdWJtaXQgZXZlbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgU3VibWl0IGV2ZW50LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmb3JtIHRoZSBmb3JtCiAgICAgICAgICovCiAgICAgICAgb25TdWJtaXQ6IGZ1bmN0aW9uKGUsIGZvcm0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5zdWJtaXRIYW5kbGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5zdWJtaXRIYW5kbGVyKGUsIGZvcm0pOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh2KSkgewogICAgICAgICAgICAgICAgICAgIHYgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBzdWJtaXQgaGFuZGxlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmdW5jIFN1Ym1pdCBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJTdWJtaXRIYW5kbGVyOiBmdW5jdGlvbiAoZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRIYW5kbGVyID0gZnVuYzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc3BsYXlzIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gb2YgYWxsIGZpZWxkcyBvZiB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNoaWxkcmVuIHdoZXRoZXIgdG8gcmVuZGVyIHZhbGlkYXRpb24gc3RhdGUgZm9yIGNoaWxkIGZpZWxkcwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSB2YWxpZGF0aW9uIHN0YXRlLgogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKGNoaWxkcmVuLCBjYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGlzYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5kaXNhYmxlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRW5hYmxlcyB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZW5hYmxlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyBvbiB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGZvY3VzZWQgY29udHJvbC4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmZvY3VzKGZ1bmN0aW9uKGNvbnRyb2xXaXRoRm9jdXMpIHsKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKGNvbnRyb2xXaXRoRm9jdXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQdXJnZSBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhlIGZvcm0gZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBza2lwUGFyZW50IHdoZW4gdHJ1ZSwgdGhlIGZvcm0gY2xlYW5zIHVwIHdpdGhvdXQgdHJhdmVyc2luZyB0aHJvdWdoIHBhcmVudCBjaGlsZCBjb250cm9scwogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKHNraXBQYXJlbnQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldEZvcm1FbCgpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gd2UgYWxsb3cgZm9ybS5kZXN0cm95KCkgd2hpY2ggdGVsbHMgcGFyZW50IGNvbnRyb2wgdG8gZGVzdHJveQogICAgICAgICAgICAvLyBpZiBza2lwUGFyZW50ID09IHRydWUsIHRoZW4gd2UgZG8gbm90IGNhbGwgdXAgKGludm9rZWQgZnJvbSBjb250YWluZXIpCiAgICAgICAgICAgIGlmICghc2tpcFBhcmVudCAmJiB0aGlzLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgc2hvdzogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBoaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldEZvcm1FbCgpLmNzcyh7CiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIGZvcm0gYW5kIHJlc2V0cyB2YWx1ZXMgb2YgaXRzIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzdG9wVXBkYXRlVHJpZ2dlciBJZiBmYWxzZSwgdHJpZ2dlcnMgdGhlIHVwZGF0ZSBldmVudCBvZiB0aGlzIGV2ZW50LgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbihzdG9wVXBkYXRlVHJpZ2dlcikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5jbGVhcihzdG9wVXBkYXRlVHJpZ2dlcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGZvcm0gaXMgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9ybSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcENvbnRyb2wuaXNFbXB0eSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZm9ybS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSBhcmcxCiAgICAgICAgICogQHBhcmFtIGFyZzIKICAgICAgICAgKiBAcGFyYW0gYXJnMwogICAgICAgICAqIEBwYXJhbSBhcmc0CiAgICAgICAgICogQHBhcmFtIGFyZzUKICAgICAgICAgKi8KICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGlkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmZpcmVDYWxsYmFjayh0aGlzLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBmb3JtIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVuZGVyZWQgRE9NIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0Rm9ybUVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyBhIHJlZ3VsYXIgb2xkIHN1Ym1pdC4KICAgICAgICAgKi8KICAgICAgICBzdWJtaXQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZm9ybS5zdWJtaXQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyB0aGUgc3VibWl0IGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBoYW5kcyBiYWNrIHRoZSBqUXVlcnkgcHJvbWlzZS4KICAgICAgICAgKgogICAgICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBjYW4gYmUgcGFzc2VkIGluIHRvIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgalF1ZXJ5IGFqYXggWEhSLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgYWpheFN1Ym1pdDogZnVuY3Rpb24oY29uZmlnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25maWcudXJsID0gc2VsZi5vcHRpb25zLmF0dHJpYnV0ZXMuYWN0aW9uOwogICAgICAgICAgICBjb25maWcudHlwZSA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLm1ldGhvZDsKCiAgICAgICAgICAgIGlmICghY29uZmlnLmRhdGEpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhVHlwZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmRhdGFUeXBlID0gImpzb24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29uZmlnLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5oZWFkZXJzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgQ1NSRiBoZXJlCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVyc1tBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRV0gPSBjc3JmVG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkLmFqYXgoY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICBkZXRlcm1pbmVDc3JmVG9rZW46IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgZGlyZWN0IHRva2VuIHNwZWNpZmllZD8KICAgICAgICAgICAgdmFyIGNzcmZUb2tlbiA9IEFscGFjYS5DU1JGX1RPS0VOOwogICAgICAgICAgICBpZiAoIWNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBjb29raWUgdGhhdCB3ZSBjYW4gcHVsbCB0aGUgdmFsdWUgZnJvbT8KICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgQWxwYWNhLkNTUkZfQ09PS0lFX05BTUVTLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVOYW1lID0gQWxwYWNhLkNTUkZfQ09PS0lFX05BTUVTW3RdOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llVmFsdWUgPSBBbHBhY2EucmVhZENvb2tpZShjb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjc3JmVG9rZW4gPSBjb29raWVWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY3NyZlRva2VuOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTWVtb3J5Q2FjaGUgPSBmdW5jdGlvbihjb25maWcpCiAgICB7CiAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgfQoKICAgICAgICB2YXIgY2FjaGUgPSB7fTsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGssIHYsIHR0bCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKHYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZVtrXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdjogdgogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghdHRsICYmIGNvbmZpZy50dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHRsID0gY29uZmlnLnR0bDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVba10uZXhwaXJlcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgdHRsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yICJjbGVhciIgbWV0aG9kIC0gcmVtb3ZlcyBldmVyeXRoaW5nIGZyb20gY2FjaGUKICAgICAgICAgICAgaWYgKGsgPT0gImNsZWFyIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHphID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciB6IGluIGNhY2hlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHphLnB1c2goeik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHphLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVt6YVtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkID0gY2FjaGVba107CiAgICAgICAgICAgIGlmICghZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICBpZiAoZC5leHBpcmVzICYmIGQuZXhwaXJlcyA8IG5vdykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGQudjsKICAgICAgICB9OwogICAgfTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSgibWVtb3J5IiwgQWxwYWNhLk1lbW9yeUNhY2hlKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTnVsbENhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm51bGwiLCBBbHBhY2EuTnVsbENhY2hlKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29ubmVjdG9yID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIHJlbW90ZSBkYXRhIHN0b3Jlcy4KCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbm5lY3RvciBJRAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgQ29ubmVjdG9yIENvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihpZCwgY29uZmlnKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIHJlc291cmNlIGlzIGEgdXJpCiAgICAgICAgICAgIHRoaXMuaXNVcmkgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNFbXB0eShyZXNvdXJjZSkgJiYgQWxwYWNhLmlzVXJpKHJlc291cmNlKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVsbCIsCiAgICAgICAgICAgICAgICAgICAgImNvbmZpZyI6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlLnR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS50eXBlID0gIm51bGwiOwogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlLmNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNhY2hlID0gQWxwYWNhLmdldENhY2hlKGNvbmZpZy5jYWNoZS50eXBlKShjb25maWcuY2FjaGUuY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIGRhdGEgc291cmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIG9uU3VjY2VzcygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgdGVtcGxhdGUgKEhUTUwgb3IgVGV4dCkuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgc291cmNlIGlzIGEgVVJJLCB0aGVuIGl0IGlzIGxvYWRlZC4KICAgICAgICAgKiBJZiBpdCBpcyBub3QgYSBVUkksIHRoZW4gdGhlIHNvdXJjZSBpcyBzaW1wbHkgaGFuZGVkIGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNvdXJjZSBTb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRUZW1wbGF0ZTogZnVuY3Rpb24gKHNvdXJjZSwgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzb3VyY2UpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVXJpKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uKGxvYWRlZERhdGEpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvblN1Y2Nlc3MgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25TdWNjZXNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGxvYWRlZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChsb2FkRXJyb3IpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGxvYWRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3Moc291cmNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRXJyb3IoewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiRW1wdHkgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogIlRFTVBMQVRFX0xPQURJTkdfRVJST1IiCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiBzY2hlbWEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkVmlldzogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHNjaGVtYSwgZm9ybSwgdmlldyBhbmQgZGF0YSBpbiBhIHNpbmdsZSBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkQWxsOiBmdW5jdGlvbiAocmVzb3VyY2VzLCBvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgb25Db25uZWN0U3VjY2VzcyA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBkYXRhU291cmNlID0gcmVzb3VyY2VzLmRhdGFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hU291cmNlID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zU291cmNlID0gcmVzb3VyY2VzLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgdmlld1NvdXJjZSA9IHJlc291cmNlcy52aWV3U291cmNlOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJzY2hlbWEiIHRvIGNvbnRhaW4gYSBVUkkgYXMgd2VsbCAoYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpCiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYVNvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnNjaGVtYSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYWxsb3cgIm9wdGlvbnMiIHRvIGNvbnRhaW4gYSBVUkkgYXMgd2VsbCAoYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5vcHRpb25zKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJ2aWV3IiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCF2aWV3U291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMudmlldykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlldzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgbG9hZGVkID0ge307CgogICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIHZhciBpbnZvY2F0aW9uQ291bnQgPSAwOwoKICAgICAgICAgICAgICAgIHZhciBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudGVyID09PSBpbnZvY2F0aW9uQ291bnQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWQuZGF0YSwgbG9hZGVkLm9wdGlvbnMsIGxvYWRlZC5zY2hlbWEsIGxvYWRlZC52aWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIGVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbiAobG9hZEVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY291bnQgb3V0IHRoZSB0b3RhbCAjIG9mIGludm9rZXMgd2UncmUgZ29pbmcgdG8gZmlyZSBvZmYKICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpZXdTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaW52b2NhdGlvbkNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gaW52b2tlLCBzbyBqdXN0IGhhbmQgYmFjawogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9NZXJnZSA9IGZ1bmN0aW9uKHAsIHYxLCB2MikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHYyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YobG9hZGVkW3BdKSA9PT0gIm9iamVjdCIpICYmICh0eXBlb2YodjIpID09PSAib2JqZWN0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChsb2FkZWRbcF0sIHYyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZFtwXSA9IHYyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBmaXJlIG9mZiBhbGwgb2YgdGhlIGludm9rZXMKICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZERhdGEoZGF0YVNvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJkYXRhIiwgcmVzb3VyY2VzLmRhdGEsIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFNjaGVtYShzY2hlbWFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJzY2hlbWEiLCByZXNvdXJjZXMuc2NoZW1hLCBzY2hlbWEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRPcHRpb25zKG9wdGlvbnNTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24ob3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgib3B0aW9ucyIsIHJlc291cmNlcy5vcHRpb25zLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpZXdTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkVmlldyh2aWV3U291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHZpZXcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoInZpZXciLCByZXNvdXJjZXMudmlldywgdmlldyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgb25Db25uZWN0RXJyb3IgID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkgewogICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlbGYuY29ubmVjdChvbkNvbm5lY3RTdWNjZXNzLCBvbkNvbm5lY3RFcnJvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgYSBKU09OIHRocm91Z2ggQWpheCBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVyaSBsb2NhdGlvbiBvZiB0aGUganNvbiBkb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRKc29uIDogZnVuY3Rpb24odXJpLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5sb2FkVXJpKHVyaSwgdHJ1ZSwgb25TdWNjZXNzLCBvbkVycm9yKTsKICAgICAgICB9ICwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50LiAgU2V0IHVwIGRlZmF1bHQgYWpheCBjb25maWd1cmF0aW9uIGZvciBVUkwgcmV0cmlldmFsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHVyaQogICAgICAgICAqIEBwYXJhbSBpc0pzb24KICAgICAgICAgKiBAcmV0dXJucyB7e3VybDogKiwgdHlwZTogc3RyaW5nfX0KICAgICAgICAgKi8KICAgICAgICBidWlsZEFqYXhDb25maWc6IGZ1bmN0aW9uKHVyaSwgaXNKc29uKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFqYXhDb25maWcgPSB7CiAgICAgICAgICAgICAgICAidXJsIjogdXJpLAogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2V0IgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKGlzSnNvbikgewogICAgICAgICAgICAgICAgYWpheENvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAidGV4dCI7CiAgICAgICAgICAgICAgICBpZiAodXJpICYmIHVyaS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi5odG1sIikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhamF4Q29uZmlnOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgZ2VuZXJhbCBkb2N1bWVudCB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgdXNlcyBqUXVlcnkgdG8gcGVyZm9ybSB0aGUgQWpheCBjYWxsLiAgSWYgeW91IG5lZWQgdG8gY3VzdG9taXplIGNvbm5lY3Rpdml0eSB0byB5b3VyIG93biByZW1vdGUgc2VydmVyLAogICAgICAgICAqIHRoaXMgd291bGQgYmUgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIHRvIGRvIHNvLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVyaSB1cmkgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0pzb24gV2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBKU09OIG9yIG5vdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVXJpIDogZnVuY3Rpb24odXJpLCBpc0pzb24sIG9uU3VjY2Vzcywgb25FcnJvcikgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGFqYXhDb25maWcgPSBzZWxmLmJ1aWxkQWpheENvbmZpZyh1cmksIGlzSnNvbik7CgogICAgICAgICAgICBhamF4Q29uZmlnWyJzdWNjZXNzIl0gPSBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHVyaSwganNvbkRvY3VtZW50KTsKCiAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoanNvbkRvY3VtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgYWpheENvbmZpZ1siZXJyb3IiXSA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiJVbmFibGUgdG8gbG9hZCBkYXRhIGZyb20gdXJpIDogIiArIHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgInN0YWdlIjogIkRBVEFfTE9BRElOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHRTdGF0dXMiIDogdGV4dFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclRocm93biIgOiBlcnJvclRocm93bgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKHVyaSk7CgogICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQgJiYgb25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKICAgICAgICAgICAgICAgIG9uU3VjY2VzcyhjYWNoZWREb2N1bWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkLmFqYXgoYWpheENvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVMb2FkSnNvblJlc291cmNlOiBmdW5jdGlvbiAocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzVXJpKHJlc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5sb2FkSnNvbihyZXNvdXJjZSwgZnVuY3Rpb24obG9hZGVkUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobG9hZGVkUmVzb3VyY2UpOwogICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2socmVzb3VyY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBzb3VyY2UgKHZhbHVlL3RleHQpIHBhaXJzIGZyb20gYSByZW1vdGUgc291cmNlLgogICAgICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgZm9yIGNvbmZpZyB0byBiZSBhIHN0cmluZyBpZGVudGlmeWluZyBhIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcKICAgICAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YVNvdXJjZTogZnVuY3Rpb24gKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWREYXRhU291cmNlKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVybCA9IGNvbmZpZzsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh1cmwpKSB7CiAgICAgICAgICAgICAgICB1cmwgPSBjb25maWcudXJsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZSh1cmwsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckNvbm5lY3RvckNsYXNzKCJkZWZhdWx0IiwgQWxwYWNhLkNvbm5lY3Rvcik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yID0gQWxwYWNhLkNvbm5lY3Rvci5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBjbGFzcyBDb25uZWN0cyBBbHBhY2EgdG8gQ2xvdWQgQ01TCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IG90aGVyd2lzZSBjb25maWd1cmVkIHRvIHVzZSBhIGNhY2hlLCB3ZSBkZWZhdWx0IHRvIGEgbWVtb3J5IGNhY2hlIHdpdGggYSA1IG1pbnV0ZSBUVEwKICAgICAgICAgICAgaWYgKCFjb25maWcuY2FjaGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZSA9IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJtZW1vcnkiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0dGwiOiAxMDAwICogNjAgKiA1IC8vIGZpdmUgbWludXRlcwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShpZCwgY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIGRhdGEgc291cmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjZm4gPSBmdW5jdGlvbihlcnIsIGJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChicmFuY2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBDaGFpbihicmFuY2gpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmRIZWxwZXJGdW5jdGlvbnMoc2VsZi5icmFuY2gpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG9uU3VjY2VzcygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5nbG9iYWxDb250ZXh0ICYmIEFscGFjYS5nbG9iYWxDb250ZXh0LmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2ZuKG51bGwsIEFscGFjYS5nbG9iYWxDb250ZXh0LmJyYW5jaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmJyYW5jaCA9IG51bGw7CgogICAgICAgICAgICAgICAgc2VsZi5kb0Nvbm5lY3QoZnVuY3Rpb24gKGVyciwgYnJhbmNoKSB7CiAgICAgICAgICAgICAgICAgICAgY2ZuKGVyciwgYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9Db25uZWN0OiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5rZXkgPSAiZGVmYXVsdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEdpdGFuYS5jb25uZWN0KHRoaXMuY29uZmlnLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RHJpdmVyKCkuZ2V0T3JpZ2luYWxDb25maWd1cmF0aW9uKCkubG9hZEFwcEhlbHBlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzdG9yZSgiY29udGVudCIpLnJlYWRCcmFuY2goIm1hc3RlciIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGJpbmRIZWxwZXJGdW5jdGlvbnM6IGZ1bmN0aW9uKGJyYW5jaCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hID0gZnVuY3Rpb24oc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWREb2N1bWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCBjYWNoZWREb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2Evc2NoZW1hIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJpZCJdID0gc2NoZW1hSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUoc2NoZW1hSWRlbnRpZmllciwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYU9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKG9wdGlvbnNJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL29wdGlvbnMiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbInNjaGVtYUlkIl0gPSByZXNvdXJjZXMuc2NoZW1hU291cmNlOwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IG9wdGlvbnNJZGVudGlmaWVyOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbkdldFJlc3BvbnNlKHRoaXMsIHVyaUZ1bmN0aW9uLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllciwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FEYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYURhdGEgPSBmdW5jdGlvbihkYXRhSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IGRhdGFJZGVudGlmaWVyOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbkdldFJlc3BvbnNlKHRoaXMsIHVyaUZ1bmN0aW9uLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhU291cmNlID0gZnVuY3Rpb24oY29uZmlnLCBwYWdpbmF0aW9uLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY29weUludG8ocGFyYW1zLCBwYWdpbmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9kYXRhc291cmNlIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpblBvc3RSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zLCBjb25maWcpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZS5kYXRhc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBmcm9tIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBub2RlSWQgdGhlIG5vZGUgaWQgdG8gbG9hZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uobm9kZUlkLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBjbG91ZCBjbXMKICAgICAgICAgICAgc2VsZi5icmFuY2gubG9hZEFscGFjYURhdGEobm9kZUlkLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb2JqID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYmogPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob2JqKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMganNvbiBzY2hlbWEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNjaGVtYUlkZW50aWZpZXIgdGhlIGRlZmluaXRpb24gcW5hbWUgdG8gbG9hZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRTY2hlbWE6IGZ1bmN0aW9uIChzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBjbG91ZCBjbXMKICAgICAgICAgICAgc2VsZi5icmFuY2gubG9hZEFscGFjYVNjaGVtYShzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgc2NoZW1hCgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHNjaGVtYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gb3B0aW9ucyBmcm9tIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgdGhlIGZvcm0ga2V5IHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkT3B0aW9uczogZnVuY3Rpb24gKG9wdGlvbnNJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zKG9wdGlvbnNJZGVudGlmaWVyLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgb3B0aW9ucykgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBvcHRpb25zCgogICAgICAgICAgICAgICAgLy8gbWl4IGluIGJ1dHRvbnMgb250byBmb3JtCiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0uYnV0dG9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuYWpheFN1Ym1pdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhockZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhDcmVkZW50aWFscyI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9zc0RvbWFpbiI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NEYXRhIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnRUeXBlIjogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sLnRyaWdnZXIoImZvcm1TdWJtaXRTdWNjZXNzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sLnRyaWdnZXIoImZvcm1TdWJtaXRGYWlsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb2N1cyA9IEFscGFjYS5kZWZhdWx0Rm9jdXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBhY3Rpb24gaGFuZGxlciByZWxhdGl2ZSB0byBiYXNlVVJMCiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0uYXR0cmlidXRlcy5hY3Rpb24gPSBzZWxmLmNvbmZpZy5iYXNlVVJMICsgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uOwoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhvcHRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgYSByZWZlcmVuY2VkIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogU3VwcG9ydHMgcW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfQogICAgICAgICAqCiAgICAgICAgICogT3RoZXJ3aXNlLCBmYWxscyBiYWNrIHRvIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNjaGVtYUlkZW50aWZpZXIgc2NoZW1hIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9IiAod2hpY2ggaXMgdGhlIENsb3VkIENNUyBvZmZpY2lhbCBmb3JtYXQpCiAgICAgICAgICAgIC8vIHRoZW4gY29udmVydCB0byBiYXNpYyBRTmFtZSB3aGljaCB3ZSBzdXBwb3J0IGhlcmUgd2l0aGluIEFscGFjYSBDbG91ZCBDTVMgY29ubmVjdG9yCiAgICAgICAgICAgIGlmIChzY2hlbWFJZGVudGlmaWVyLmluZGV4T2YoInFuYW1lOi8vIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IHNjaGVtYUlkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgc2NoZW1hSWRlbnRpZmllciA9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgoc2NoZW1hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6Ly8iKSA9PT0gMCkgfHwgKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwczovLyIpID09PSAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbG9hZCBKU09OIGZyb20gZW5kcG9pbnQKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGFzc3VtZSBpdCBpcyBhIFFOYW1lCiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHJlZmVyZW5jZWQgSlNPTiBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogLy8gU3VwcG9ydHMgcW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfS97Zm9ybUtleX0KICAgICAgICAgKgogICAgICAgICAqIEF0IHByZXNlbnQsIHRoaXMgaWdub3JlcyBRTmFtZS4KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBvcHRpb25zSWRlbnRpZmllciBmb3JtIHRvIGxvYWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZU9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaXMgaXQgSFRUUCBvciBIVFRQUz8KICAgICAgICAgICAgaWYgKChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6Ly8iKSA9PT0gMCkgfHwgKG9wdGlvbnNJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShvcHRpb25zSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc291cmNlcyA9IG51bGw7CgogICAgICAgICAgICAvLyBpZiB0aGUgcmVmZXJlbmNlIGNvbWVzIGluIGZvcm0gInFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9IiAod2hpY2ggaXMgdGhlIENsb3VkIENNUyBvZmZpY2lhbCBmb3JtYXQpCiAgICAgICAgICAgIC8vIHRoZW4gY29udmVydCB0byBiYXNpYyBRTmFtZSB3aGljaCB3ZSBzdXBwb3J0IGhlcmUgd2l0aGluIEFscGFjYSBDbG91ZCBDTVMgY29ubmVjdG9yCiAgICAgICAgICAgIGlmIChvcHRpb25zSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBvcHRpb25zSWRlbnRpZmllci5zdWJzdHJpbmcoOCkuc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHFuYW1lCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0ge307CiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnNjaGVtYVNvdXJjZSA9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV07CgogICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gaWQKICAgICAgICAgICAgICAgICAgICBvcHRpb25zSWRlbnRpZmllciA9IHBhcnRzWzJdOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobnVsbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBzb3VyY2UgZWxlbWVudHMgYmFzZWQgb24gYSBjb250ZW50IHF1ZXJ5IHRvIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcKICAgICAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YVNvdXJjZTogZnVuY3Rpb24gKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHBhZ2luYXRpb24gPSBjb25maWcucGFnaW5hdGlvbjsKICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5wYWdpbmF0aW9uOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhU291cmNlKGNvbmZpZywgcGFnaW5hdGlvbiwgZnVuY3Rpb24oZXJyLCBhcnJheSkgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGFycmF5KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckNvbm5lY3RvckNsYXNzKCJjbG91ZGNtcyIsIEFscGFjYS5DbG91ZENtc0Nvbm5lY3Rvcik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNpemUpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaXplID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIGFzc3VtZSBodG1sNSBpbnB1dCB0eXBlID0gInRleHQiCiAgICAgICAgICAgIGlmICghdGhpcy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRleHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSB0aGlzLm9wdGlvbnMuaW5wdXRUeXBlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gZGF0YS0qIGF0dHJpYnV0ZXMgc3VwcG9ydAogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gImF1dG9jb21wbGV0ZSIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gIm9uIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInRydWUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZS50b0xvd2VyQ2FzZSgpID09PSAieWVzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuZGlzYWxsb3dPbmx5RW1wdHlTcGFjZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCB0eXBlYWhlYWQKICAgICAgICAgICAgaWYgKCB0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLnR5cGVhaGVhZCAmJiB0aGlzLm9wdGlvbnMudHlwZWFoZWFkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkudHlwZWFoZWFkKCdkZXN0cm95Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5QXV0b2NvbXBsZXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hc2sKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5TWFzaygpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0eXBlYWhlYWQKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5VHlwZUFoZWFkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlBdXRvY29tcGxldGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGF1dG9jb21wbGV0ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hdXRvY29tcGxldGUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLWF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoImF1dG9jb21wbGV0ZSIsIChzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlID8gIm9uIiA6ICJvZmYiKSk7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXV0b2NvbXBsZXRlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseU1hc2s6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIG1hc2sgaXQKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC5tYXNrICYmIHNlbGYub3B0aW9ucy5tYXNrU3RyaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wubWFzayhzZWxmLm9wdGlvbnMubWFza1N0cmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVR5cGVBaGVhZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC50eXBlYWhlYWQgJiYgc2VsZi5vcHRpb25zLnR5cGVhaGVhZCAmJiAhQWxwYWNhLmlzRW1wdHkoc2VsZi5vcHRpb25zLnR5cGVhaGVhZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0Q29uZmlnID0gc2VsZi5vcHRpb25zLnR5cGVhaGVhZC5jb25maWc7CiAgICAgICAgICAgICAgICBpZiAoIXRDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICB0Q29uZmlnID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHREYXRhc2V0cyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuZGF0YXNldHM7CiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cykgewogICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMubmFtZSA9IHNlbGYuZ2V0SWQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgdEV2ZW50cyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuZXZlbnRzOwogICAgICAgICAgICAgICAgaWYgKCF0RXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgdEV2ZW50cyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVhY2ggZGF0YXNldHMgKGxvY2FsLCByZW1vdGUsIHByZWZldGNoKQogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMuaW5pdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJsb2NhbCIgfHwgdERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiIHx8IHREYXRhc2V0cy50eXBlID09PSAicHJlZmV0Y2giKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJsb29kSG91bmRDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXR1bVRva2VuaXplcjogZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuaGFzT3duUHJvcGVydHkoaykgfHwgZFtrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9ICIgIiArIGRba107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlKHRva2Vucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsID0gW107CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodERhdGFzZXRzLnNvdXJjZSkgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IHREYXRhc2V0cy5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHREYXRhc2V0cy5zb3VyY2UubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxFbGVtZW50ID0gdERhdGFzZXRzLnNvdXJjZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihsb2NhbEVsZW1lbnQpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFbGVtZW50ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGxvY2FsRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnB1c2gobG9jYWxFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLmxvY2FsID0gbG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMubG9jYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IHREYXRhc2V0cy5sb2NhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5wcmVmZXRjaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2guZmlsdGVyID0gdERhdGFzZXRzLmZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gInJlbW90ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdERhdGFzZXRzLnNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy5maWx0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5yZW1vdGUuZmlsdGVyID0gdERhdGFzZXRzLmZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy5yZXBsYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLnJlcGxhY2UgPSB0RGF0YXNldHMucmVwbGFjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgYW55IGFkZGl0aW9uYWwgZGF0YXNldCBjb25maWcgcGFyYW1zIGluIHRoZSBCbG9vZGhvdW5kIGNvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godERhdGFzZXRzLCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAndHlwZScgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdzb3VyY2UnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnZmlsdGVyJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3JlcGxhY2UnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnbG9jYWwnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAndGVtcGxhdGVzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnW2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbmV3IEJsb29kaG91bmQoYmxvb2RIb3VuZENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5pbml0aWFsaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy5zb3VyY2UgPSBlbmdpbmUudHRBZGFwdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy5pbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHREYXRhc2V0cy50ZW1wbGF0ZXNba107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGVtcGxhdGUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLnRlbXBsYXRlc1trXSA9IEhhbmRsZWJhcnMuY29tcGlsZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0eXBlYWhlYWQKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS50eXBlYWhlYWQodENvbmZpZywgdERhdGFzZXRzKTsKCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yICJhdXRvY29tcGxldGVkIiBldmVudCBhbmQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yICJzZWxlY3RlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDpzZWxlY3RlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoZGF0dW0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0RXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0RXZlbnRzLmF1dG9jb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6YXV0b2NvbXBsZXRlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2ZW50cy5hdXRvY29tcGxldGVkKGV2ZW50LCBkYXR1bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDpzZWxlY3RlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2ZW50cy5zZWxlY3RlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlcywgY2hhbmdlIHRoZSBxdWVyeSBpbiB0eXBlYWhlYWQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8ga2VlcCB0aGUgdHlwZWFoZWFkIGNvbnRyb2wgc3luYydkIHdpdGggdGhlIGFjdHVhbCBkb20gdmFsdWUKICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB0aGUgcXVlcnkgZG9lc24ndCBhbHJlYWR5IG1hdGNoCiAgICAgICAgICAgICAgICB2YXIgZmkgPSAkKHNlbGYuY29udHJvbCk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSAkKGZpKS50eXBlYWhlYWQoJ3ZhbCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKGZpKS50eXBlYWhlYWQoJ3ZhbCcsIG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gc29tZSBVSSBjbGVhbnVwICh3ZSBkb24ndCB3YW50IHR5cGVhaGVhZCB0byByZXN0eWxlKQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIikuZmlyc3QoKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsgLy8gU1BBTiB0byBiZWhhdmUgbW9yZSBsaWtlIERJViwgbmV4dCBsaW5lCiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmZpbmQoInNwYW4udHdpdHRlci10eXBlYWhlYWQgaW5wdXQudHQtaW5wdXQiKS5maXJzdCgpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsICIiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuaW5wdXRUeXBlID0gc2VsZi5pbnB1dFR5cGU7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICB1cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3I6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlcnJTdGF0ZSA9IGZhbHNlOwoKICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIHNlbGYub3B0aW9ucy5zaG93TWF4TGVuZ3RoSW5kaWNhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwoKICAgICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5zY2hlbWEubWF4TGVuZ3RoIC0gdmFsLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChkaWZmID49IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJZb3UgaGF2ZSAiICsgZGlmZiArICIgY2hhcmFjdGVycyByZW1haW5pbmciOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91ciBtZXNzYWdlIGlzIHRvbyBsb25nIGJ5ICIgKyAoZGlmZiotMSkgKyAiIGNoYXJhY3RlcnMiOwogICAgICAgICAgICAgICAgICAgIGVyclN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgaW5kaWNhdG9yID0gJChzZWxmLmZpZWxkKS5maW5kKCIuYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IiKTsKICAgICAgICAgICAgICAgIGlmIChpbmRpY2F0b3IubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9ICQoIjxwIGNsYXNzPSdhbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvcic+PC9wPiIpOwogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hZnRlcihpbmRpY2F0b3IpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5odG1sKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLnJlbW92ZUNsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIGlmIChlcnJTdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuYWRkQ2xhc3MoImVyciIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwoKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC5tYXNrICYmIHNlbGYub3B0aW9ucy5tYXNrU3RyaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBnZXQgdW5tYXNrZWQgdmFsdWUKICAgICAgICAgICAgICAgIHZhciBmbiA9ICQodGhpcy5jb250cm9sKS5kYXRhKCQubWFzay5kYXRhTmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoZm4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmbigpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lbnN1cmVQcm9wZXJUeXBlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKCIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgdGhpcy51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVBhdHRlcm4oKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWRQYXR0ZXJuIiksIFt0aGlzLnNjaGVtYS5wYXR0ZXJuXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heExlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdUb29Mb25nIiksIFt0aGlzLnNjaGVtYS5tYXhMZW5ndGhdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluTGVuZ3RoKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdUb29TaG9ydCIpLCBbdGhpcy5zY2hlbWEubWluTGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgcGF0dGVybiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0IG1hdGNoZXMgdGhlIHBhdHRlcm4sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVQYXR0ZXJuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdmFsLm1hdGNoKHRoaXMuc2NoZW1hLnBhdHRlcm4pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgdGhlIHNjaGVtYSBtaW5MZW5ndGggcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdHMgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWluTGVuZ3RoLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluTGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1pbkxlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZih2YWwgIT09IHZhbCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgoIiIrdmFsKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWF4TGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgbGVzcyB0aGFuIG1heExlbmd0aCAsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhMZW5ndGg6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEubWF4TGVuZ3RoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoID4gdGhpcy5zY2hlbWEubWF4TGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmb2N1c2VzIHRoZSBjb250cm9sIGFuZCBhbHNvIHBvc2l0aW9ucyB0aGUgaW5wdXQgYXQgdGhlIGVuZAoKICAgICAgICAgICAgICAgIHZhciBlbCA9ICQodGhpcy5jb250cm9sKS5nZXQoMCk7CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbUxlbiA9IGVsLnZhbHVlID8gZWwudmFsdWUubGVuZ3RoIDogMDsKICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gZWxlbUxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgdHlwZSBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlnbm9yZSB0YWIgYW5kIGFycm93IGtleXMKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOSB8fCBlLmtleUNvZGUgPT09IDM3IHx8IGUua2V5Q29kZSA9PT0gMzggfHwgZS5rZXlDb2RlID09PSAzOSB8fCBlLmtleUNvZGUgPT09IDQwICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA4KSAvLyBiYWNrc3BhY2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5taW5MZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWluTGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID49IHNlbGYuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzIpIC8vIHNwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGlzYWxsb3dFbXB0eVNwYWNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgYXBwbGljYWJsZSwgdXBkYXRlIHRoZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRrZXl1cCIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGtleXVwIik7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2luZ2xlLUxpbmUgVGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3Igc2luZ2xlLWxpbmUgdGV4dC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW1hbCBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW1hbCBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIExlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgdmFsdWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5MZW5ndGgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFNpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2l6ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6NDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWFzayBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIHRoZSBmaWVsZCBtYXNrLiBGaWVsZCBtYXNraW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBub3QgZW1wdHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBsYWNlaG9sZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgUGxhY2Vob2xkZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgcGxhY2Vob2xkZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGVhaGVhZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlR5cGUgQWhlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvdmlkZXMgY29uZmlndXJhdGlvbiBmb3IgdGhlICQudHlwZWFoZWFkIHBsdWdpbiBpZiBpdCBpcyBhdmFpbGFibGUuICBGb3IgZnVsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3R3aXR0ZXIvdHlwZWFoZWFkLmpzIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFsbG93T3B0aW9uYWxFbXB0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFsbG93IE9wdGlvbmFsIEVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyB0aGlzIG5vbi1yZXF1aXJlZCBmaWVsZCB0byB2YWxpZGF0ZSB3aGVuIHRoZSB2YWx1ZSBpcyBlbXB0eSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIVE1MNSBJbnB1dCBUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3IgdGhlIG92ZXJyaWRlIG9mIHRoZSB1bmRlcmx5aW5nIEhUTUw1IGlucHV0IHR5cGUuICBJZiBub3Qgc3BlY2lmaWVkLCBhbiBhc3N1bWVkIHZhbHVlIGlzIHByb3ZpZGVkIGJhc2VkIG9uIHRoZSBraW5kIG9mIGlucHV0IGNvbnRyb2wgKGkuZS4gJ3RleHQnLCAnZGF0ZScsICdlbWFpbCcgYW5kIHNvIGZvcnRoKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0YSBhdHRyaWJ1dGVzIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBrZXkvdmFsdWUgbWFwIG9mIGRhdGEgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgYWRkZWQgYXMgRE9NIGF0dHJpYnVldHMgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wuICBUaGUgZGF0YSBhdHRyaWJ1dGVzIHdpbGwgYmUgYWRkZWQgYXMgZGF0YS17bmFtZX09J3t2YWx1ZX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhdXRvY29tcGxldGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIVE1MIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIERPTSBpbnB1dCBjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgYXV0b2NvbXBsZXRlIGF0dHJpYnV0ZSBmb3IgdGhlIHVuZGVybHlpbmcgaW5wdXQgY29udHJvbCB3aGV0aGVyIG9yIG5vdCBmaWVsZCBzaG91bGQgaGF2ZSBhdXRvY29tcGxldGUgZW5hYmxlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3dFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IEVtcHR5IFNwYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGRpc2FsbG93IHRoZSBlbnRyeSBvZiBlbXB0eSBzcGFjZXMgaW4gdGhlIHRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93T25seUVtcHR5U3BhY2VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3cgT25seSBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2Ygb25seSBlbXB0eSBzcGFjZXMgaW4gdGhlIHRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJhIC0gYW4gYWxwaGEgY2hhcmFjdGVyOzkgLSBhIG51bWVyaWMgY2hhcmFjdGVyOyogLSBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlucHV0VHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRoaXMgZmllbGQgc2hvdWxkIGhhdmUgcGF0dGVybiB7MH0iLAogICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IGxlYXN0IHswfSBudW1iZXJzIG9yIGNoYXJhY3RlcnMiLAogICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4gYXQgbW9zdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0IiwgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygic3RyaW5nIiwgInRleHQiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0ZXh0YXJlYSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJvd3MpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yb3dzID0gNTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29scykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHMgPSA0MDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgICAgICBpZiAodmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB3b3JkY291bnQgPSB2YWwuc3BsaXQoIiAiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRjb3VudCA+IHRoaXMub3B0aW9ucy53b3JkbGltaXQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNdWx0aS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dGFyZWEgZmllbGQgZm9yIG11bHRpcGxlIGxpbmUgdGV4dC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIHJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogNDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXb3JkIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpbWl0cyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFsbG93ZWQgaW4gdGhlIHRleHQgYXJlYS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIndvcmRMaW1pdEV4Y2VlZGVkIjogIlRoZSBtYXhpbXVtIHdvcmQgbGltaXQgb2YgezB9IGhhcyBiZWVuIGV4Y2VlZGVkLiIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRleHRhcmVhIiwgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY2hlY2tib3giOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Yoc2VsZi5zY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIG1vZGUKCiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgZW51bSB2YWx1ZXMsIGNvcHkgdGhlbSBpbnRvIGNoZWNrYm94IG9wdGlvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLmdldEVudW0oKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBlbnVtZXJhdGVkIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydEVudW0oKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgICAgICQuZWFjaChzZWxmLmdldEVudW0oKSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbkxhYmVscykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbdmFsdWVdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdGV4dAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkICJkYXRhc291cmNlIiwgd2UgY29weSB0byAiZGF0YVNvdXJjZSIKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZSAmJiAhc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgbW9kZQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmlnaHRMYWJlbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGVja2JveE9wdGlvbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuY2hlY2tib3hPcHRpb25zID0gc2VsZi5jaGVja2JveE9wdGlvbnM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIGlmICghdmFsdWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMuZW51bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5lbnVtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBPVkVSUklERQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbkxhYmVsczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaXRlbXMgJiYgdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVscykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLm9wdGlvbnMuaXRlbXMub3B0aW9uTGFiZWxzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXIgZm9yIHRoZSBldmVudCB0aGF0IHRoZSBjaGVja2JveCBpcyBjbGlja2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNiZWZvcmVSZW5kZXJDb250cm9sCiAgICAgICAgICovCiAgICAgICAgYmVmb3JlUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIG11bHRpcGxlIG1vZGUKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuY2hlY2tib3hPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5jaGVja2JveE9wdGlvbnMsIG1vZGVsLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGJ1aWxkIG91dCB0aGUgZW51bSBhbmQgb3B0aW9uTGFiZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2VudW0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3B0aW9uTGFiZWxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hlY2tib3hPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lbnVtLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLmNoZWNrYm94T3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEVudW0oX2VudW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25MYWJlbHMoX29wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhICYmIHR5cGVvZihzZWxmLmRhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHNlbGYuZGF0YSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZm9yIG11bHRpcGxlIG1vZGUsIG1hcmsgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG5vbmUgY2hlY2tlZAogICAgICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhQXJyYXkgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5kYXRhKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheSA9IHNlbGYuZGF0YS5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBkYXRhQXJyYXkubGVuZ3RoOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUFycmF5W2FdID0gJC50cmltKGRhdGFBcnJheVthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YUFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveFtkYXRhLWNoZWNrYm94LXZhbHVlPVwiIiArIGRhdGFBcnJheVtrXSArICJcIl0iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyB3aGVuZXZlciB0aGUgc3RhdGUgb2Ygb25lIG9mIG91ciBpbnB1dDpjaGVja2JveCBjb250cm9scyBpcyBjaGFuZ2VkIChlaXRoZXIgdmlhIGEgY2xpY2sgb3IgcHJvZ3JhbW1hdGljYWxseSksCiAgICAgICAgICAgICAgICAvLyB3ZSBzaWduYWwgdG8gdGhlIHRvcC1sZXZlbCBmaWVsZCB0byBmaXJlIHVwIGEgY2hhbmdlCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGRlcGVuZGVuY3kgc3lzdGVtIHRvIHJlY2FsY3VsYXRlIGFuZCBzdWNoCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3giKS5jaGFuZ2UoZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBzY2FsYXIgdmFsdWUKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgdmFsdWVzCiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hlY2tib3hPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dEZpZWxkID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC1pbmRleD0nIiArIGkgKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmNoZWNrZWQoaW5wdXRGaWVsZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9ICQoaW5wdXRGaWVsZCkuYXR0cigiZGF0YS1jaGVja2JveC12YWx1ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyB3ZSdyZSBnb2luZyB0byBoYW5kIHRoaXMgdmFsdWUgYmFjawoKICAgICAgICAgICAgICAgIC8vIGlmIHR5cGUgPT0gImFycmF5Iiwgd2UganVzdCBoYW5kIGJhY2sgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJzdHJpbmciLCB3ZSBidWlsZCBhIGNvbW1hLWRlbGltaXRlZCBsaXN0CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmpvaW4oIiwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4sIHN0cmluZyAoInRydWUiKSwgc3RyaW5nICgiYSxiLGMiKSBvciBhbiBhcnJheSBvZiB2YWx1ZXMKCiAgICAgICAgICAgIHZhciBhcHBseVNpbmdsZVZhbHVlID0gZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPT09ICJ0cnVlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQiKTsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgYXBwbHlNdWx0aVZhbHVlID0gZnVuY3Rpb24odmFsdWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgY29tbWEtZGVsaW1pdGVkIHN0cmluZ3MKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdHJpbSB0aGluZ3MgdG8gcmVtb3ZlIGFueSBleGNlc3Mgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IEFscGFjYS50cmltKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHZhbHVlcyBhbmQgYXNzaWduIGludG8gYXBwcm9wcmlhdGUgaW5wdXRzCiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dFtkYXRhLWNoZWNrYm94LXZhbHVlXSIpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dFtkYXRhLWNoZWNrYm94LXZhbHVlPVwiIiArIHZhbHVlc1tqXSArICJcIl0iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGxpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgdmFsdWUgbW9kZQoKICAgICAgICAgICAgICAgIC8vIGJvb2xlYW4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09PSAiYm9vbGVhbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YodmFsdWUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseVNpbmdsZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseU11bHRpVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFwcGxpZWQgJiYgdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2hlY2tib3hGaWVsZCBjYW5ub3Qgc2V0IHZhbHVlIGZvciBzY2hlbWEudHlwZT0iICsgc2VsZi5zY2hlbWEudHlwZSArICIgYW5kIHZhbHVlPSIgKyB2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5IGluIHRoZSBjYXNlIHRoYXQgdGhlIGNoZWNrYm94IGZpZWxkIGlzIGluIG11bHRpcGxlIG1vZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWwgPSBzZWxmLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CgogICAgICAgICAgICBpZiAoIXNlbGYuaXNSZXF1aXJlZCgpICYmIEFscGFjYS5pc1ZhbEVtcHR5KHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB2YWwgaXMgYSBzdHJpbmcsIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCIsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuYW55RXF1YWxpdHkodmFsLCBzZWxmLmdldEVudW0oKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CgogICAgICAgICAgICBzZWxmLmNvbnZlcnRUb0RhdGFWYWx1ZShzY2FsYXJWYWx1ZSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgICAgICAvLyBzdG9yZSBzY2FsYXIgdmFsdWUgb250byBjb250cm9sCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wudmFsKHNjYWxhclZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIG9ic2VydmFibGVzIGFuZCB1cGRhdGVzCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0sCgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNoZWNrYm94IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCBmb3IgYm9vbGVhbiAodHJ1ZS9mYWxzZSksIHN0cmluZyAoJ3RydWUnLCAnZmFsc2UnIG9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgb2YgdmFsdWVzKSBvciBkYXRhIGFycmF5LiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgcmlnaHQtaGFuZCBzaWRlIGxhYmVsIGZvciBzaW5nbGUgY2hlY2tib3ggZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byByZW5kZXIgbXVsdGlwbGUgY2hlY2tib3hlcyBmb3IgbXVsdGktdmFsdWVkIHR5cGUgKHN1Y2ggYXMgYW4gYXJyYXkgb3IgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhU291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgc291cmNlIGZvciBnZW5lcmF0aW5nIGxpc3Qgb2Ygb3B0aW9ucy4gIFRoaXMgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uICBJZiBhIHN0cmluZywgaXQgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB0byBhIHNlcnZpY2UgdGhhdCBwcm9kdWNlcyBhIG9iamVjdCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycyBvciBhbiBhcnJheSBvZiBlbGVtZW50cyBvZiBzdHJ1Y3R1cmUgeyd0ZXh0JzogJycsICd2YWx1ZSc6ICcnfS4gIFRoaXMgY2FuIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBwcm9kdWNlIHRoZSBzYW1lIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVzZURhdGFTb3VyY2VBc0VudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJVc2UgRGF0YSBTb3VyY2UgYXMgRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gdGhlIGZpZWxkJ3Mgc2NoZW1hIGVudW0gcHJvcGVydHkgdG8gdGhlIHZhbHVlcyB0aGF0IGNvbWUgYmFjayBmcm9tIHRoZSBkYXRhIHNvdXJjZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNoZWNrYm94IiwgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImJvb2xlYW4iLCAiY2hlY2tib3giKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImZpbGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICB9LAoKICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uSGFuZGxlcihlLnRhcmdldC5maWxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcm9jZXNzU2VsZWN0aW9uSGFuZGxlcjogZnVuY3Rpb24oZmlsZXMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgSFRNTDUgRmlsZVJlYWRlciwgd2UgY2FuIHB1bGwgaW4gdGhlIHN0cmVhbSBmb3IgcHJldmlldwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihGaWxlUmVhZGVyKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIGxvYWRlZCBkYXRhCiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRlZERhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZENvdW50ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVXJpID0gZXZlbnQudGFyZ2V0LnJlc3VsdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWREYXRhLnB1c2goZGF0YVVyaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnQrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZENvdW50ID09PSBmaWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQub3B0aW9ucy5zZWxlY3Rpb25IYW5kbGVyLmNhbGwoZmllbGQsIGZpbGVzLCBsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KS5jYWxsKHRoaXMpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciB1cGxvYWRpbmcgZmlsZXMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uSGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNlbGVjdGlvbiBIYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGZpbGVzIGFyZSBzZWxlY3RlZC4gIFJlcXVpcmVzIEhUTUw1LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uSGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImZpbGUiLCBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgIGlmIChzZWxmLmdldEVudW0oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgIHNlbGYuc29ydEVudW0oKTsKCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTGFiZWxzID0gc2VsZi5nZXRPcHRpb25MYWJlbHMoKTsKCiAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1tpbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbdmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQXV0byBhc3NpZ24gZGF0YSBpZiB3ZSBoYXZlIGRhdGEgYW5kIHRoZSBmaWVsZCBpcyByZXF1aXJlZCBhbmQgcmVtb3ZlRGVmYXVsdE5vbmUgaXMgZWl0aGVyIHVuc3BlY2lmaWVkIG9yIHRydWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZWxmLmlzUmVxdWlyZWQoKSAmJiAhc2VsZi5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZSA9PT0gdHJ1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudW1WYWx1ZXMgPSBzZWxmLmdldEVudW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyAmJiBlbnVtVmFsdWVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBlbnVtVmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZSAmJiAhc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhU291cmNlID0gc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdlIG9wdGlvbmFsbHkgYWxsb3cgdGhlIGRhdGEgc291cmNlIHJldHVybiB2YWx1ZXMgdG8gb3ZlcnJpZGUgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubm9uZUxhYmVsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm5vbmVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgibm9uZUxhYmVsIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuaGlkZU5vbmUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuaGlkZU5vbmUgPSBzZWxmLmlzUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRm4gPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5kYXRhKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGFyVmFsdWUgPT09IHNlbGYuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW52b2tlRGF0YVNvdXJjZShzZWxmLnNlbGVjdE9wdGlvbnMsIG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGJ1aWxkIG91dCB0aGUgZW51bSBhbmQgb3B0aW9uTGFiZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2VudW0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3B0aW9uTGFiZWxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29wdGlvbkxhYmVscy5wdXNoKHNlbGYuc2VsZWN0T3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEVudW0oX2VudW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25MYWJlbHMoX29wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GbigpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb1NjYWxhclZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvRGF0YVZhbHVlOiBmdW5jdGlvbihzY2FsYXJWYWx1ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGZpZWxkIHZhbHVlIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIERhdGFzb3VyY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0YXNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlbW92ZSBEZWZhdWx0IE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGRlZmF1bHQgJ05vbmUnIG9wdGlvbiB3aWxsIG5vdCBiZSBzaG93bi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm5vbmVMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5vbmUgTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxhYmVsIHRvIHVzZSBmb3IgdGhlICdOb25lJyBvcHRpb24gaW4gYSBsaXN0IChzZWxlY3QsIHJhZGlvIG9yIG90aGVyd2lzZSkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlTm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhpZGUgTm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGhpZGUgdGhlIE5vbmUgb3B0aW9uIGZyb20gYSBsaXN0IChzZWxlY3QsIHJhZGlvIG9yIG90aGVyd2lzZSkuICBUaGlzIHdpbGwgYmUgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVzZURhdGFTb3VyY2VBc0VudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJVc2UgRGF0YSBTb3VyY2UgYXMgRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gdGhlIGZpZWxkJ3Mgc2NoZW1hIGVudW0gcHJvcGVydHkgdG8gdGhlIHZhbHVlcyB0aGF0IGNvbWUgYmFjayBmcm9tIHRoZSBkYXRhIHNvdXJjZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm5vbmVMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlTm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIHRoZSAnTm9uZScgb3B0aW9uIGZyb20gdGhlIGxpc3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vbmVMYWJlbCI6ICJOb25lIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQgPSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInJhZGlvIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5uYW1lKQogICAgICAgICAgICB7CgkJCQl0aGlzLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTsKCQkJfQoJCQllbHNlIGlmICghdGhpcy5uYW1lKQogICAgICAgICAgICB7CgkJCQl0aGlzLm5hbWUgPSB0aGlzLmdldElkKCkgKyAiLW5hbWUiOwoJCQl9CgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHZlcnRpY2FsIG9yaWVudGF0aW9uCiAgICAgICAgICAgIC8vIGVtcHR5IHNlbGVjdCBmaXJzdCB0byBmYWxzZSBieSBkZWZhdWx0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZlcnRpY2FsKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZlcnRpY2FsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCI6Y2hlY2tlZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjbGVhciBhbGwKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQodGhpcyksIG51bGwpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIG1hcmsgc2VsZWN0ZWQgdmFsdWUKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXRbdmFsdWU9XCIiICsgdmFsICsgIlwiXSIpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub25lIHNlbGVjdGVkIGFuZCAiZW1wdHlTZWxlY3RGaXJzdCIsIHRoZW4gc2VsZWN0CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpjaGVja2VkIikubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoc2VsZi5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmZpcnN0KCksICJjaGVja2VkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciBpbnB1dHMgPSAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKTsKCiAgICAgICAgICAgIGlucHV0cy5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaW5wdXRzLmJsdXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC5zZWxlY3RPcHRpb25zID0gc2VsZi5zZWxlY3RPcHRpb25zOwogICAgICAgICAgICAgICAgbW9kZWwucmVtb3ZlRGVmYXVsdE5vbmUgPSBzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmU7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CgogICAgICAgICAgICAgICAgICAgIGlmICgkKCJpbnB1dDpyYWRpbzpjaGVja2VkIiwgc2VsZi5jb250cm9sKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW9bdmFsdWU9XCIiICsgc2VsZi5kYXRhICsgIlwiXSIpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdGFjayByYWRpbyBzZWxlY3RvcnMgdmVydGljYWxseQogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy52ZXJ0aWNhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSAibmFtZSIgcHJvcGVydHkgb24gdGhlIGNvbnRyb2wgaXMga2VwdCBpbiBzeW5jLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvIikuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25DbGljawogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoImlucHV0IikudmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB2YWwpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIGZvciByYWRpbyBidXR0b25zLCB3ZSBhbHNvIG1hcmsgdGhlIG91dGVyIERJViBhcyBkaXNhYmxlZCB0byBwcmV2ZW50IGxhYmVsIGNsaWNrcwogICAgICAgICAgICAvLyBhbmQgYXBwbHkgc29tZSBDU1Mgc3R5bGluZwogICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJhZGlvIEdyb3VwIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCB3aXRoIGxpc3Qgb2Ygb3B0aW9ucy4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KCQlnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJInByb3BlcnRpZXMiOiB7CgkJCQkJIm5hbWUiOiB7CgkJCQkJCSJ0aXRsZSI6ICJGaWVsZCBuYW1lIiwKCQkJCQkJImRlc2NyaXB0aW9uIjogIkZpZWxkIG5hbWUuIiwKCQkJCQkJInR5cGUiOiAic3RyaW5nIgoJCQkJCX0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBvc2l0aW9uIHRoZSByYWRpbyBzZWxlY3RvciBpdGVtcyB2ZXJ0aWNhbGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkJ5IGRlZmF1bHQsIHJhZGlvIGNvbnRyb2xzIGFyZSBzdGFja2VkIHZlcnRpY2FsbHkuICBTZXQgdG8gZmFsc2UgaWYgeW91J2QgbGlrZSByYWRpbyBjb250cm9scyB0byBsYXkgb3V0IGhvcml6b250YWxseS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQoJCQkJfQoJCQl9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAKICAgIH0pOwogICAgCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJyYWRpbyIsIEFscGFjYS5GaWVsZHMuUmFkaW9GaWVsZCk7CiAgICAKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQgPSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gInNlbGVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYVsidHlwZSJdICYmIHNlbGYuc2NoZW1hWyJ0eXBlIl0gPT09ICJhcnJheSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgdHVybiBvbiAiaGlkZU5vbmUiIGlmIHdlJ3JlIGluIG11bHRpc2VsZWN0IG1vZGUgYW5kIGhhdmUgdGhlIG11bHRpc2VsZWN0IHBsdWdpbgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMgYW5kIG1pbkl0ZW1zIG9uIHRoZSBzY2hlbWEuaXRlbXMgc3Vib2JqZWN0LgogICAgICAgICAgICAvLyBpZiBub3QgZGVmaW5lZCBwcm9wZXJseSwgd2Ugb2ZmZXIgc29tZSBhdXRvbWF0aWMgZm9yd2FyZCBtaWdyYXRpb24gb2YgdGhlc2UgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLm1heEl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLm1heEl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5taW5JdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5taW5JdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCAmJiB0eXBlb2Yoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0LmRpc2FibGVJZkVtcHR5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBuZXdTY2FsYXJWYWwgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CiAgICAgICAgICAgIHZhciBjdXJyZW50U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZShzZWxmLmdldFZhbHVlKCkpOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGVuIHNldAogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuY29tcGFyZUFycmF5Q29udGVudChuZXdTY2FsYXJWYWwsIGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkobmV3U2NhbGFyVmFsKSAmJiB0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKG5ld1NjYWxhclZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcHBseSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgQWxwYWNhLmlzRW1wdHkoY3VycmVudFNjYWxhclZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3U2NhbGFyVmFsICE9PSBjdXJyZW50U2NhbGFyVmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYXBwbHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCAmJiB0eXBlb2YobmV3U2NhbGFyVmFsKSAhPT0gInVuZGVmaW5lZCIgJiYgbmV3U2NhbGFyVmFsICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5MaXN0RmllbGQjZ2V0RW51bQogICAgICAgICAqLwogICAgICAgIGdldEVudW06IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjaGVtYVsidHlwZSJdICYmIHRoaXMuc2NoZW1hWyJ0eXBlIl0gPT09ICJhcnJheSIgJiYgdGhpcy5zY2hlbWFbIml0ZW1zIl0gJiYgdGhpcy5zY2hlbWFbIml0ZW1zIl1bImVudW0iXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFbIml0ZW1zIl1bImVudW0iXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBidXR0b24gPSB0aGlzLmNvbnRyb2wucGFyZW50KCkuZmluZCgiYnV0dG9uLm11bHRpc2VsZWN0Iik7CgogICAgICAgICAgICAgICAgYnV0dG9uLmZvY3VzKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgYnV0dG9uLmJsdXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24gKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgb3V0ICJkaXNwbGF5YWJsZVRleHQiCiAgICAgICAgICAgICAgICB2YXIgZGlzcGxheWFibGVUZXh0cyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5zZWxlY3RPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hcFttb2RlbC5zZWxlY3RPcHRpb25zW2ldLnZhbHVlXSA9IG1vZGVsLnNlbGVjdE9wdGlvbnNbaV0udGV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkobW9kZWwuZGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtYXBbbW9kZWwuZGF0YVtpXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZVRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtYXBbbW9kZWwuZGF0YV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZVRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vZGVsLmRpc3BsYXlhYmxlVGV4dCA9IGRpc3BsYXlhYmxlVGV4dHMuam9pbigiLCAiKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIGVtcHR5U2VsZWN0Rmlyc3QgYW5kIG5vdGhpbmcgY3VycmVudGx5IGNoZWNrZWQsIHRoZW4gcGljayBmaXJzdCBpdGVtIGluIHRoZSB2YWx1ZSBsaXN0CiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgdmlzdWFsbHkgc2VsZWN0IGl0CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHNlbGYuZGF0YSkgJiYgc2VsZi5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QgJiYgc2VsZi5zZWxlY3RPcHRpb25zICYmIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuc2VsZWN0T3B0aW9uc1swXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyB0aGlzIGxpdHRsZSB0cmljayBzbyB0aGF0IGlmIHdlIGhhdmUgYSBkZWZhdWx0IHZhbHVlLCBpdCBnZXRzIHNldCBkdXJpbmcgZmlyc3QgcmVuZGVyCiAgICAgICAgICAgICAgICAvLyB0aGlzIGNhdXNlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wKICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBpbiBtdWx0aXBsZSBtb2RlIGFuZCB0aGUgYm9vdHN0cmFwIG11bHRpc2VsZWN0IHBsdWdpbiBpcyBhdmFpbGFibGUsIGJpbmQgaXQgaW4KICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgJiYgJC5mbi5tdWx0aXNlbGVjdCAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzID0gc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCA9ICJOb25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5ub25lTGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCA9IHNlbGYub3B0aW9ucy5ub25lTGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250cm9sRWwoKSkubXVsdGlzZWxlY3Qoc2V0dGluZ3MpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBhZ2FpbnN0IGVudW0gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh2YWwpICYmICFBbHBhY2EuaXNPYmplY3QodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFt2YWxdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHZhbCwgZnVuY3Rpb24oaSx2KSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbkFycmF5ID0gQWxwYWNhLmluQXJyYXkoX3RoaXMuc2NoZW1hWyJlbnVtIl0sIHNjYWxhclZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugd2UncmUgYW4gYXJyYXkgbW9kZWxlZCBvbiBhIHNpbmdsZSBzZWxlY3QsIGp1c3QgdXNlIHRoZSAwdGggZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbFswXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IF90aGlzLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5BcnJheSh0aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CgogICAgICAgICAgICBzZWxmLmNvbnZlcnRUb0RhdGFWYWx1ZShzY2FsYXJWYWx1ZSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgICAgICAvLyBzdG9yZSBzY2FsYXIgdmFsdWUgb250byBjb250cm9sCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wudmFsKHNjYWxhclZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIG9ic2VydmFibGVzIGFuZCB1cGRhdGVzCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluSXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5taW5JdGVtcyAmJiB0aGlzLnNjaGVtYS5taW5JdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJCgiOnNlbGVjdGVkIix0aGlzLmNvbnRyb2wpLmxlbmd0aCA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJCgiOnNlbGVjdGVkIix0aGlzLmNvbnRyb2wpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heEl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZXQgZm9jdXMgb250byB0aGUgc2VsZWN0CiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIGVsLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250cm9sRWwoKSkubXVsdGlzZWxlY3QoImRpc2FibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJlbmFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlbGVjdCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bGl0cGxlIFNlbGVjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNwbGF5ZWQgT3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2Ygb3B0aW9ucyB0byBiZSBzaG93bi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1wdHlTZWxlY3RGaXJzdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVtcHR5IFNlbGVjdCBGaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0aGUgZGF0YSBpcyBlbXB0eSwgdGhlbiBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlzZWxlY3QgUGx1Z2luIFNldHRpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk11bHRpc2VsZWN0IHBsdWdpbiBwcm9wZXJ0aWVzIC0gaHR0cDovL2Rhdmlkc3R1dHouZ2l0aHViLmlvL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFsbG93IG11bHRpcGxlIHNlbGVjdGlvbiA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1wdHlTZWxlY3RGaXJzdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlzZWxlY3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIk11bHRpc2VsZWN0IHBsdWdpbiBwcm9wZXJ0aWVzIC0gaHR0cDovL2Rhdmlkc3R1dHouZ2l0aHViLmlvL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInNlbGVjdCIsIEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJudW1iZXIiOwogICAgICAgICAgICAvLyBUT0RPOiB3ZSBjYW4ndCBkbyB0aGlzIGJlY2F1c2UgQ2hyb21lIHNjcmV3cyB1cCBpdCdzIGhhbmRsaW5nIG9mIG51bWJlciB0eXBlCiAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB1cyBmcm9tIHZhbGlkYXRpbmcgcHJvcGVybHkKICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE2NDIwODI4L2pxdWVyeS12YWwtcmVmdXNlcy10by1yZXR1cm4tbm9uLW51bWVyaWMtaW5wdXQtZnJvbS1hLW51bWJlci1maWVsZC11bmRlci1jaHJvbWUKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5udW1lcmljRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZSB8fCAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubnVtZXJpY0VudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIChrZXkgPj0gNDggJiYga2V5IDw9IDU3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBldmVuIGFsbG93IGVudHJ5IG9mIGludmFsaWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PSAidW5kZWZpbmVkIiB8fCAiIiA9PSB2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTnVtYmVyKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoInN0cmluZ05vdEFOdW1iZXIiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGl2aXNpYmxlQnkoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ0RpdmlzaWJsZUJ5IiksIFt0aGlzLnNjaGVtYS5kaXZpc2libGVCeV0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhpbXVtKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIiIsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICghc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXVsibWVzc2FnZSJdID0gQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIiksIFt0aGlzLnNjaGVtYS5tYXhpbXVtXSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXVsibWVzc2FnZSJdID0gQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdWYWx1ZVRvb0xhcmdlIiksIFt0aGlzLnNjaGVtYS5tYXhpbXVtXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluaW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWluaW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29TbWFsbCIpLCBbdGhpcy5zY2hlbWEubWluaW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU11bHRpcGxlT2YoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIiksIFt0aGlzLnNjaGVtYS5tdWx0aXBsZU9mXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmQgYmFjayBhIHRydWUvZmFsc2UKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdEaXZpc2libGVCeSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vU21hbGwiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb0xvbmciXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vU2hvcnQiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgcmVxdWlyZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gRmFsc2UgaWYgdGhpcyBmaWVsZCB2YWx1ZSBpcyBlbXB0eSBidXQgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU9wdGlvbmFsOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSgkKHRoaXMuY29udHJvbCkudmFsKCkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgZmxvYXQgbnVtYmVyLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgZmxvYXQgbnVtYmVyCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTnVtYmVyOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBhcyB0ZXh0CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGV4dFZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRleHRWYWx1ZSA9ICIiICsgdGV4dFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbGxvdyBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbGlkIG51bWJlciBmb3JtYXQKICAgICAgICAgICAgdmFyIHZhbGlkTnVtYmVyID0gQWxwYWNhLnRlc3RSZWdleChBbHBhY2EucmVnZXhwcy5udW1iZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBkaXZpc2libGVCeSBjb25zdHJhaW50LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IHBhc3NlcyB0aGUgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEaXZpc2libGVCeTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLmRpdmlzaWJsZUJ5KSkgewoKICAgICAgICAgICAgICAgIC8vIG1vZAogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJSB0aGlzLnNjaGVtYS5kaXZpc2libGVCeSAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhpbXVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heGltdW0pKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA+IHRoaXMuc2NoZW1hLm1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09IHRoaXMuc2NoZW1hLm1heGltdW0gJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG1pbmltdW0gY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5pbXVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1pbmltdW0pKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA8IHRoaXMuc2NoZW1hLm1pbmltdW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09IHRoaXMuc2NoZW1hLm1pbmltdW0gJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG11bHRpcGxlT2YgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG11bHRpcGxlT2YgY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNdWx0aXBsZU9mOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm11bHRpcGxlT2YpKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSAmJiB0aGlzLnNjaGVtYS5tdWx0aXBsZU9mICE9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmKEFscGFjYS5pc051bWJlcihuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoIDw9IHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1heExlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmKEFscGFjYS5pc051bWJlcihuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID49IHNlbGYuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzIpIC8vIHNwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGlzYWxsb3dFbXB0eVNwYWNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgYXBwbGljYWJsZSwgdXBkYXRlIHRoZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRrZXl1cCIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGtleXVwIik7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlT2YiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWx0aXBsZSBPZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2Ygc2NoZW1hIHByb3BlcnR5IHN1Y2ggdGhhdCBkaXZpc2lvbiBieSB0aGlzIHZhbHVlIHlpZWxkcyBhbiBpbnRlcmdlciAobW9kIHplcm8pLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFeGNsdXNpdmUgTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBjYW4gbm90IGVxdWFsIHRoZSBudW1iZXIgZGVmaW5lZCBieSB0aGUgbWluaW11bSBzY2hlbWEgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNYXhpbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1heGltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc1NjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHZhbHVlIG11c3QgYmUgYSBpbnRlZ3JhbCBtdWx0aXBsZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRXhjbHVzaXZlIG1pbmltdW0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gYnV0IG5vdCBlcXVhbCB0byB0aGlzIG51bWJlciBpZiBjaGVja2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRXhjbHVzaXZlIE1heGltdW0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gYnV0IG5vdCBlcXVhbCB0byB0aGlzIG51bWJlciBpZiBjaGVja2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibnVtZXJpY0VudHJ5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTnVtZXJpYyBFbnRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGNvbnN0cmFpbiBkYXRhIGVudHJ5IGtleSBwcmVzc2VzIHRvIG51bWVyaWMgdmFsdWVzICgwLTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTnVtYmVyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBmbG9hdCBudW1iZXJzLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJUaGUgbWluaW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIHswfSIsCiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmFsdWUgb2YgdGhpcyBmaWVsZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBsZXNzIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAiVGhlIHZhbHVlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHswfSIsCiAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIiwKICAgICAgICAic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgezB9IgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJudW1iZXIiLCBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm51bWJlciIsICJudW1iZXIiKTsKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQgPSBBbHBhY2EuQ29udGFpbmVyRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBpdGVtOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY29udGFpbmVySXRlbVRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci0iICsgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSArICItaXRlbSIsIHNlbGYpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJTdHlsZSkgPyAiYnV0dG9uIiA6IHRoaXMudmlldy50b29sYmFyU3R5bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSBBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcuYWN0aW9uYmFyU3R5bGUpID8gInRvcCIgOiB0aGlzLnZpZXcuYWN0aW9uYmFyU3R5bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSA9ICJ0b3AiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24gPSBBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclBvc2l0aW9uKSA/ICJ0b3AiIDogdGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24gPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5pdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvZmZlciBzb21lIGJhY2t3YXJkIGNvbXBhYmlsaXR5IGhlcmUgYXMgb2xkZXIgdmVyc2lvbiBvZiBBbHBhY2EgdXNlZCB0byBpbmNvcnJlY3RseSBsb29rIGZvcgogICAgICAgICAgICAvLyBtYXhJdGVtcywgbWluSXRlbXMgYW5kIHVuaXF1ZUl0ZW1zIG9uIHRoZSBzY2hlbWEuaXRlbXMgc3Vib2JqZWN0LgogICAgICAgICAgICAvLyBpZiBub3QgZGVmaW5lZCBwcm9wZXJseSwgd2Ugb2ZmZXIgc29tZSBhdXRvbWF0aWMgZm9yd2FyZCBtaWdyYXRpb24gb2YgdGhlc2UgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLm1heEl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLm1heEl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5taW5JdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5taW5JdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIHVzaW5nICJydWJ5IG9uIHJhaWxzIiBjb21wYXRpYmlsaXR5IG1vZGUKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub3B0aW9ucyAmJiB0aGlzLnBhcmVudC5vcHRpb25zLmZvcm0gJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMucnVieXJhaWxzKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucnVieXJhaWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRvb2xiYXJTdGlja3kgPSBBbHBhY2EuZGVmYXVsdFRvb2xiYXJTdGlja3k7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3RpY2t5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9vbGJhclN0aWNreSA9IHRoaXMudmlldy50b29sYmFyU3RpY2t5OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9vbGJhclN0aWNreSA9IHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSA9IHRvb2xiYXJTdGlja3k7CgogICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBoaWRlIHRvb2xiYXIgd2hlbiBjaGlsZHJlbi5jb3VudCA+IDAKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuaGlkZVRvb2xiYXJXaXRoQ2hpbGRyZW4pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRW5hYmxlIGZvcmNlUmV2YWxpZGF0aW9uIG9wdGlvbiBzbyB0aGF0IGFueSBjaGFuZ2UgaW4gY2hpbGRyZW4gd2lsbCB0cmlnZ2VyIHBhcmVudCdzIHJldmFsaWRhdGlvbi4KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuZGF0YSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIiIgPT0gdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdG8gYmUgYSBzZXJpYWxpemVkIGFycmF5IG9yIG9iamVjdCwgY29udmVydAogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlZEpTT04gPSBBbHBhY2EucGFyc2VKU09OKHRoaXMuZGF0YSk7CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkocGFyc2VkSlNPTikgJiYgIUFscGFjYS5pc09iamVjdChwYXJzZWRKU09OKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIHBhcnNlZCBzdHJpbmcgZGF0YSBidXQgaXQgd2FzIG5vdCBhbiBhcnJheTogIiArIHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHBhcnNlZEpTT047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUganVzdCBhIHN0cmluZyB2YWx1ZSwgcHV0IGludG8gYXJyYXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbdGhpcy5kYXRhXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLmRhdGEpICYmICFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIkFycmF5RmllbGQgZGF0YSBpcyBub3QgYW4gYXJyYXk6ICIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQUNUSU9OUwogICAgICAgICAgICAvLwogICAgICAgICAgICB2YXIgYXBwbHlBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25zLCBrZXksIGFjdGlvbkNvbmZpZykgewogICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNlbGYuZmluZEFjdGlvbihhY3Rpb25zLCBrZXkpOwogICAgICAgICAgICAgICAgaWYgKCFhY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJjb3JlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGFjdGlvbkNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGlmICghYWN0aW9uW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbltrXSA9IGFjdGlvbkNvbmZpZ1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjbGVhbnVwQWN0aW9ucyA9IGZ1bmN0aW9uKGFjdGlvbnMsIHNob3dMYWJlbHMpIHsKICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgIGRvIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYWN0aW9uc1tpXS5lbmFibGVkKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1tpXS5lbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgbGFiZWwgaWYgZ2xvYmFsIGRpc2FibGUKICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dMYWJlbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFjdGlvbnNbaV0ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbnNbaV0uZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBhY3Rpb25zLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgLy8gc29ydCBzbyB0aGF0IGNvcmUgYWN0aW9ucyBhcHBlYXIgZmlyc3QKICAgICAgICAgICAgICAgIGFjdGlvbnMuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEuY29yZSAmJiAhYi5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmNvcmUgJiYgYi5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc2V0IHVwIGRlZmF1bHQgYWN0aW9ucyBmb3IgdGhlIHRvcCBhcnJheSB0b29sYmFyCiAgICAgICAgICAgIHNlbGYudG9vbGJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRvb2xiYXIpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXJba10gPSBBbHBhY2EuY29weU9mKHNlbGYub3B0aW9ucy50b29sYmFyW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYudG9vbGJhci5zaG93TGFiZWxzKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNlbGYudG9vbGJhci5zaG93TGFiZWxzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYudG9vbGJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuYWN0aW9ucyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCAiYWRkIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJhZGRJdGVtQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlVG9vbEJhckFkZEl0ZW1DbGljayhmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYudG9vbGJhci5hY3Rpb25zLCBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyk7CgogICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBhZGQgaW50byB0aGUgcGVyLWl0ZW0gYWN0aW9uYmFyCiAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyID0ge307CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrMiBpbiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25iYXJbazJdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMuYWN0aW9uYmFyW2syXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYuYWN0aW9uYmFyLmFjdGlvbnMpIHsKICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAiYWRkIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJhZGRCdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJhZGQiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgiYWRkSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhckFkZEl0ZW1DbGljayhpdGVtSW5kZXgsIGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgInJlbW92ZSIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgicmVtb3ZlQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicmVtb3ZlIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoInJlbW92ZUljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJSZW1vdmVJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJ1cCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgidXBCdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJ1cCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJ1cEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImRvd24iLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoImRvd25CdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJkb3duIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImRvd25JY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYW51cEFjdGlvbnMoc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscyk7CgogICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGRhdGEgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5kYXRhKTsKICAgICAgICAgICAgZGF0YS5sZW5ndGggPSBsZW47CgogICAgICAgICAgICB0aGlzLmRhdGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkYXRhKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhcGFydCB0aGUgYXJyYXkgYW5kIHNldCBvbnRvIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFBbHBhY2EuaXNBcnJheShkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgZmllbGRzCiAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IGkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEZpZWxkLnNldFZhbHVlKGRhdGFbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlSXRlbShpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkYXRhIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGNoaWxkIGVsZW1lbnRzCiAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBhZGQgdGhlIG5ldyBmaWVsZHMKICAgICAgICAgICAgaWYgKGkgPCBkYXRhLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbVNjaGVtYSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVW5hYmxlIHRvIHJlc29sdmUgc2NoZW1hIGZvciBpdGVtOiAiICsgaSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHdhdGVyZmFsbCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gKGZ1bmN0aW9uKGksIGRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaSwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGRhdGFbaV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaSwgZGF0YSk7CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jcy5wdXNoKGYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UncmUgZW1wdHkgYW5kIHdlJ3JlIGFsc28gbm90IHJlcXVpcmVkLCB0aGVuIHdlIGhhbmQgYmFjayBlbXB0eSBzZXQKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGNvbnN0cnVjdCBhbiBhcnJheSBhbmQgaGFuZCBpdCBiYWNrCiAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYodiAhPT0gdikgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIHYgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgby5wdXNoKHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqCiAgICAgICAgICogQ3JlYXRlcyBzdWItaXRlbXMgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5kYXRhICYmIHNlbGYuZGF0YS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdG90YWxJdGVtQ291bnQgPSBzZWxmLmRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGl0ZW1zQnlJbmRleCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vIGFsbCBpdGVtcyB3aXRoaW4gdGhlIGFycmF5IGhhdmUgdGhlIHNhbWUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBvbmx5IG5lZWQgdG8gbG9hZCB0aGlzIG9uY2UKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHdhdGVyZmFsbCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2VsZi5kYXRhLmxlbmd0aDsgaW5kZXgrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuZGF0YVtpbmRleF07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGYgPSAoZnVuY3Rpb24oaW5kZXgsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKGluZGV4LCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgdmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlJbmRleFtpbmRleF0gPSBpdGVtOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB9KShpbmRleCwgdmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChwZik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwoZnVuY3MsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBpbnRlbmRlZCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsSXRlbUNvdW50OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNCeUluZGV4W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBjcmVhdGVJdGVtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICogQHBhcmFtIGl0ZW1TY2hlbWEKICAgICAgICAgKiBAcGFyYW0gaXRlbU9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0gaXRlbURhdGEKICAgICAgICAgKiBAcGFyYW0gcG9zdFJlbmRlckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWF4SXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBmb3JtRWwuYWxwYWNhKHsKICAgICAgICAgICAgICAgICAgICAiZGF0YSIgOiBpdGVtRGF0YSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgICAgICJzY2hlbWEiIDogaXRlbVNjaGVtYSwKICAgICAgICAgICAgICAgICAgICAidmlldyIgOiB0aGlzLnZpZXcuaWQgPyB0aGlzLnZpZXcuaWQgOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKGVycikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAicmVuZGVyIjogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhcmVudCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIGl0ZW0gcGF0aAogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArICJbIiArIGluZGV4ICsgIl0iOwogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpZWxkQ29udHJvbC5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscGFjYSBmaW5pc2hlZAoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1FbCA9IEFscGFjYS50bXBsKHNlbGYuY29udGFpbmVySXRlbVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHNlbGYub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSwKCQkJCQkJCSJ0b29sYmFyTG9jYXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhckxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblBvaW50RWwgPSAkKGNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiQ2Fubm90IGZpbmQgaW5zZXJ0aW9uIHBvaW50IGZvciBmaWVsZDogIiArIHNlbGYuZ2V0SWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW50byBwbGFjZQogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnRFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNvbnRhaW5lckl0ZW1FbCA9IGNvbnRhaW5lckl0ZW1FbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgYWZ0ZXIgcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihjb250cm9sLCBmdW5jdGlvbihfY29udHJvbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUjogaHR0cHM6Ly9naXRodWIuY29tL2dpdGFuYS9hbHBhY2EvcHVsbC8xMjQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLml0ZW1zLnBvc3RSZW5kZXIuY2FsbChjb250cm9sLCBpbnNlcnRpb25Qb2ludEVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlbmRlckNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMgdG8gdXRpbGl6ZSBmb3IgaXRlbXMgd2l0aGluIHRoaXMgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhdmVhdDogIGlmIHdlJ3JlIGluIHJlYWQtb25seSBtb2RlLCB0aGUgY2hpbGQgbXVzdCBhbHNvIGJlIGluIHJlYWQtb25seSBtb2RlCiAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkSXRlbVNjaGVtYSwgcmVzb2x2ZWRJdGVtT3B0aW9ucywgY2lyY3VsYXIpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGl0ZW1PcHRpb25zOwogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCBmb3Igb3B0aW9ucy5maWVsZHMuaXRlbQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbSkgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLmZpZWxkcy5pdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXRlbU9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zLml0ZW1zKSB7CiAgICAgICAgICAgICAgICBpdGVtT3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuaXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGl0ZW1TY2hlbWE7CiAgICAgICAgICAgIGlmIChfdGhpcy5zY2hlbWEgJiYgX3RoaXMuc2NoZW1hLml0ZW1zKSB7CiAgICAgICAgICAgICAgICBpdGVtU2NoZW1hID0gX3RoaXMuc2NoZW1hLml0ZW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAoaXRlbVNjaGVtYSAmJiBpdGVtU2NoZW1hWyIkcmVmIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzY2hlbWFSZWZlcmVuY2VJZCA9IGl0ZW1TY2hlbWFbIiRyZWYiXTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnNbIiRyZWYiXSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNSZWZlcmVuY2VJZCA9IGl0ZW1PcHRpb25zWyIkcmVmIl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWVsZENoYWluID0gW3RvcEZpZWxkXTsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRDaGFpbi5wdXNoKHRvcEZpZWxkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtU2NoZW1hID0gaXRlbVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEl0ZW1PcHRpb25zID0gaXRlbU9wdGlvbnM7CgogICAgICAgICAgICAgICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zKHRvcEZpZWxkLCBzY2hlbWFSZWZlcmVuY2VJZCwgb3B0aW9uc1JlZmVyZW5jZUlkLCBmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmaWVsZCBjaGFpbiB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2lyY3VsYXJpdHkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRDaGFpbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZENoYWluW2ldLnNjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09IHNjaGVtYVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHNjaGVtYVJlZmVyZW5jZUlkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChmaWVsZENoYWluW2ldLnNjaGVtYVsiJHJlZiJdID09PSBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgaGlnaGVyIGxpbWl0IGZvciBhcnJheXMsIHBlcmhhcHMgMTAKICAgICAgICAgICAgICAgICAgICAvL3ZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEwKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkSXRlbVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEl0ZW1TY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgb3JpZ2luYWxJdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtU2NoZW1hLCBpdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc29sdmVkSXRlbVNjaGVtYS5pZDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkSXRlbU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgb3JpZ2luYWxJdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1PcHRpb25zLCBpdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubmV4dFRpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZVVuaXF1ZUl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJ2YWx1ZU5vdFVuaXF1ZSIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWF4SXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluSXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoIm5vdEVub3VnaEl0ZW1zIiksIFt0aGlzLnNjaGVtYS5taW5JdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidmFsdWVOb3RVbmlxdWUiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl1bInN0YXR1cyJdICYmIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWF4SXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNYXhJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1heEl0ZW1zICYmIHRoaXMuc2NoZW1hLm1heEl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA+PSB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFcXVhbE1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpIDw9IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpIDwgdGhpcy5zY2hlbWEubWluSXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIG92ZXIgbWF4SXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIG92ZXIgbWF4SXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1heEl0ZW1zICYmIHRoaXMuc2NoZW1hLm1heEl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA+IHRoaXMuc2NoZW1hLm1heEl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGFsbCBpdGVtcyBhcmUgdW5pcXVlLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGFsbCBpdGVtcyBhcmUgdW5pcXVlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVVuaXF1ZUl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBoYXNoID0ge307CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaFtrZXldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGFzaFtrZXldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgZmluZEFjdGlvbjogZnVuY3Rpb24oYWN0aW9uc0FycmF5LCBhY3Rpb25LZXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYWN0aW9uID0gbnVsbDsKCiAgICAgICAgICAgICQuZWFjaChhY3Rpb25zQXJyYXksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgIGlmICh2LmFjdGlvbiA9PT0gYWN0aW9uS2V5KSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBhY3Rpb247CiAgICAgICAgfSwKCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGFyZSB6ZXJvIGNoaWxkcmVuLCBzaG93IHRoZSBhcnJheSB0b29sYmFyCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qCiAgICAgICAgYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtczogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGFyZSB6ZXJvIGNoaWxkcmVuLCBzaG93IHRoZSBhcnJheSB0b29sYmFyCiAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBjaGlsZHJlbi4KICAgICAgICAgKi8KICAgICAgICBnZXRTaXplOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBPVkVSUklERQogICAgICAgICAqCiAgICAgICAgICogQWRqdXN0IHRoZSBwYXRoIGFuZCBuYW1lIGFoZWFkIG9mIHJlZnJlc2hpbmcgdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnVwZGF0ZVBhdGhBbmROYW1lKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGludm9rZWQgYWZ0ZXIgaXRlbXMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkLCByZW1vdmVkIG9yIG1vdmVkIGFyb3VuZCBpbiB0aGUgY2hpbGQgY2hhaW4uCiAgICAgICAgICogSXQgYWRqdXN0cyBjbGFzc2VzIG9uIGNoaWxkIERPTSBlbGVtZW50cyB0byBtYWtlIHN1cmUgdGhleSdyZSBjb3JyZWN0LgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBhdGhBbmROYW1lOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdXBkYXRlQ2hpbGRyZW5QYXRoQW5kTmFtZSA9IGZ1bmN0aW9uKHBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2gocGFyZW50LmNoaWxkcmVuLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZVBhdGggJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5wYXRoLCBwYXJlbnQucHJlUGF0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlUGF0aCA9IHYucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucGF0aCA9IHYucGF0aC5yZXBsYWNlKHBhcmVudC5wcmVQYXRoLCBwYXJlbnQucGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQucHJlTmFtZSAmJiBBbHBhY2Euc3RhcnRzV2l0aCh2Lm5hbWUsIHBhcmVudC5wcmVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5uYW1lLnJlcGxhY2UocGFyZW50LnByZU5hbWUsIHBhcmVudC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodi5maWVsZCkuYXR0cigibmFtZSIsIHYubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUodik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSB2LnBhdGgubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdFNlZ21lbnQgPSB2LnBhdGguc3Vic3RyaW5nKGlkeCsxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50LmluZGV4T2YoIlsiKSA+IDAgJiYgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHBhcnNlSW50KGxhc3RTZWdtZW50LnN1YnN0cmluZyhsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgKyAxLCBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggIT09IGkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHYucGF0aCA9IHYucGF0aC5zdWJzdHJpbmcoMCwgaWR4KSArICIvIiArIGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBsYXN0U2VnbWVudC5pbmRleE9mKCJbIikpICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgKHYubmFtZUNhbGN1bGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZU5hbWUgPSB2Lm5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5wYXJlbnQgJiYgdi5wYXJlbnQubmFtZSAmJiB2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYucGFyZW50Lm5hbWUgKyAiXyIgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhdGgucmVwbGFjZSgvXC8vZywgIiIpLnJlcGxhY2UoL1xbL2csICJfIikucmVwbGFjZSgvXF0vZywgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQub3B0aW9ucy5ydWJ5cmFpbHMgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2LnBhcmVudC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodi5maWVsZCkuYXR0cigibmFtZSIsIHYubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXYucHJlUGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlUGF0aCA9IHYucGF0aDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUodik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHN0YXR1cyBvZiBhcnJheSBpdGVtIGFjdGlvbiB0b29sYmFyIGJ1dHRvbnMuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlVG9vbGJhcnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXkgbW9kZSwgd2UgZG8gbm90IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiZGlzcGxheSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gcmVhZG9ubHkgbW9kZSwgZG9uJ3QgZG8gdGhpcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyZSBjYWxsYmFja3MgdG8gdmlldyB0byByZW1vdmUgYW5kIGNyZWF0ZSB0b29sYmFyCiAgICAgICAgICAgIGlmIChzZWxmLnRvb2xiYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheVRvb2xiYXIiLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheVRvb2xiYXIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyZSBjYWxsYmFja3MgdG8gdmlldyB0byByZW1vdmUgYW5kIGNyZWF0ZSBhbiBhY3Rpb25iYXIgZm9yIGVhY2ggaXRlbQogICAgICAgICAgICBpZiAoc2VsZi5hY3Rpb25iYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheUFjdGlvbmJhcnMiLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheUFjdGlvbmJhcnMiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVE9PTEJBUgogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdmFyIHRvb2xiYXJFbCA9ICQodGhpcy5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktdG9vbGJhcltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgIiddIik7CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaG93IHRvb2xiYXIKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5zaG93KCk7CgogICAgICAgICAgICAgICAgLy8gQ0xJQ0s6IGFycmF5IHRvb2xiYXIgYnV0dG9ucwogICAgICAgICAgICAgICAgJCh0b29sYmFyRWwpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uS2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi50b29sYmFyLmFjdGlvbnMsIGFjdGlvbktleSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykub2ZmKCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmNsaWNrLmNhbGwoc2VsZiwgYWN0aW9uS2V5LCBhY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTkJBUgogICAgICAgICAgICAvLwoKICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHVzaW5nIHRoZSAic3RpY2t5IiB0b29sYmFyLCB0aGVuIHNob3cgYW5kIGhpZGUgdGhlIGl0ZW0gYWN0aW9uIGJ1dHRvbnMgd2hlbiBob3ZlcmVkCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpID09PSAidW5kZWZpbmVkIiB8fCB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSA9PT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCBlYWNoIGl0ZW0KICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0RmllbGRFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpOwogICAgICAgICAgICAgICAgJChpdGVtcykuZWFjaChmdW5jdGlvbihpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgYWN0aW9uYmFyIGZvciB0aGlzIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGZyb20gY29udGFpbmVySXRlbUVsCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVsID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ11bZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXg9JyIgKyBpdGVtSW5kZXggKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uYmFyRWwgJiYgYWN0aW9uYmFyRWwubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWx3YXlzIHNob3cgdGhlIGFjdGlvbmJhcnMKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddIikuY3NzKCJkaXNwbGF5IiwgImlubGluZS1ibG9jayIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWx3YXlzIGhpZGUgdGhlIGFjdGlvbmJhcnMKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddIikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDTElDSzogYWN0aW9uYmFyIGJ1dHRvbnMKICAgICAgICAgICAgLy8gTk9URTogYWN0aW9uYmFyRWxzIHNpemUgc2hvdWxkIGJlIDAgb3IgMQogICAgICAgICAgICB2YXIgYWN0aW9uYmFyRWxzID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SW5kZXggPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4Iik7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRhcmdldEluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJpbmQgYnV0dG9uIGNsaWNrIGhhbmRsZXJzCiAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uS2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNlbGYuZmluZEFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGF0IG1heCBjYXBhY2l0eSwgZGlzYWJsZSAiYWRkIiBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtaW4gY2FwYWNpdHksIGRpc2FibGUgInJlbW92ZSIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNaW5JdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3JlbW92ZSddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBmaXJzdCBhY3Rpb25iYXIgaGFzIGl0cyAibW92ZSB1cCIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5maXJzdCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ndXAnXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gbGFzdCBhY3Rpb25iYXIgaGFzIGl0cyAibW92ZSBkb3duIiBidXR0b24gZGlzYWJsZWQKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmxhc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2Rvd24nXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gRFlOQU1JQyBNRVRIT0RTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBob3cgbWFueSBjaGlsZHJlbiBkbyB3ZSBoYXZlIGN1cnJlbnRseT8KICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOwoKICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZShpdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgIHNlbGYuYWRkSXRlbShpbnNlcnRpb25Qb2ludCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAvLyBvciB0aGUgc2NoZW1hIGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNjaGVtYTogIiArIEpTT04uc3RyaW5naWZ5KGl0ZW1TY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBhcnJheVZhbHVlcyA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaXRlbUluZGV4ICsgMSwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSB1bmRlcmx5aW5nIGZpZWxkcyByZXF1aXJlIHRoZWlyIGRhdGEgdG8gYmUgcmVzZXQKICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciBmb3IgdGhlIGRpc3BsYXkgdG8gd29yayBvdXQgcHJvcGVybHkgKHJhZGlvIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlcy5zcGxpY2UoaXRlbUluZGV4ICsgMSwgMCwgaXRlbS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5VmFsdWVzKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJSZW1vdmVJdGVtQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZUFjdGlvbkJhck1vdmVJdGVtVXBDbGljazogZnVuY3Rpb24oaXRlbUluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuc3dhcEl0ZW0oaXRlbUluZGV4LCBpdGVtSW5kZXggLSAxLCBzZWxmLm9wdGlvbnMuYW5pbWF0ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbURvd25DbGljazogZnVuY3Rpb24oaXRlbUluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuc3dhcEl0ZW0oaXRlbUluZGV4LCBpdGVtSW5kZXggKyAxLCBzZWxmLm9wdGlvbnMuYW5pbWF0ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhZGRJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoYWRkSXRlbUNvbnRhaW5lcikuYXBwZW5kKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluc2VydCBhdCBhIHNwZWNpZmljIGluZGV4CiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdFbGVtZW50ID0gYWRkSXRlbUNvbnRhaW5lci5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgKGluZGV4LTEpICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gdGhlIHRvb2xiYXIgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdmlhIHRoZSB1c2VyIGludGVyZmFjZS4gIFRoZSBtZXRob2QgY2FuIGFsc28KICAgICAgICAgKiBiZSBjYWxsZWQgcHJvZ3JhbW1hdGljYWxseSB0byBpbnNlcnQgaXRlbXMgb24gdGhlIGZseS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggdGhlIGluZGV4IHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgdGhlIGpzb24gc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIGpzb24gb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbmV3bHkgaW5zZXJ0ZWQgaXRlbQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWF4SXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKGluZGV4LCBzY2hlbWEsIG9wdGlvbnMsIGRhdGEsIGZ1bmN0aW9uKGl0ZW0pIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RlckNoaWxkKGl0ZW0sIGluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb0FkZEl0ZW0oaW5kZXgsIGl0ZW0sIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IGFkZAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGl0ZW0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb1JlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBjaGlsZEluZGV4ICsgIiddIikucmVtb3ZlKCk7CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJSZW1vdmVJdGVtKGNoaWxkSW5kZXgsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBzZXRWYWx1ZSgpIHdoZW4gdGhlIG51bWJlciBvZiBpdGVtcyBiZWluZyBzZXQgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIKICAgICAgICAgKiBvZiBmaWVsZCBlbGVtZW50cy4KCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGNoaWxkSW5kZXggaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHJlbW92ZWQKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIHJlbW92ZWQKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdW5yZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYudW5yZWdpc3RlckNoaWxkKGNoaWxkSW5kZXgpOwoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdGVtQ29udGFpbmVyRWwgZnJvbSBET00KICAgICAgICAgICAgICAgIHNlbGYuZG9SZW1vdmVJdGVtKGNoaWxkSW5kZXgsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogcmVtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJyZW1vdmUiLCBjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBtb3ZpbmcgYW4gaXRlbSBpbiB0aGUgYXJyYXkgdG8gYSBuZXcgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gYmUgbW92ZWQgdG8KICAgICAgICAgKiBAcGFyYW0gW0Jvb2xlYW5dIGFuaW1hdGUgd2hldGhlciB0byBhbmltYXRlCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZCBhbmQgcmVmcmVzaCBvY2N1cnMKICAgICAgICAgKi8KICAgICAgICBtb3ZlSXRlbTogZnVuY3Rpb24oc291cmNlSW5kZXgsIHRhcmdldEluZGV4LCBhbmltYXRlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhbmltYXRlOwogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGUgPyBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA6IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc291cmNlSW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc291cmNlSW5kZXggPSBwYXJzZUludChzb3VyY2VJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRhcmdldEluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBzZWxmLmNoaWxkcmVuLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIHRhcmdldCBpbmRleAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IHRhcmdldEluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0YXJnZXRDaGlsZCA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICBpZiAoIXRhcmdldENoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB0YXJnZXQgY2hpbGQgbm90IGZvdW5kCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYWRqdXN0ZWRUYXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFRhcmdldEluZGV4LS07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3BsaWNlIG91dCBjaGlsZAogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gc2VsZi5jaGlsZHJlbi5zcGxpY2Uoc291cmNlSW5kZXgsIDEpWzBdOwogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5zcGxpY2UoYWRqdXN0ZWRUYXJnZXRJbmRleCwgMCwgY2hpbGQpOwoKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCByZWZyZXNoCiAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigibW92ZSIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IDA7CiAgICAgICAgICAgIGlmIChhbmltYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcmVudEZpZWxkSWQgPSBzZWxmLmdldElkKCk7CgogICAgICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgc291cmNlSW5kZXggKyAiJ11bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgcGFyZW50RmllbGRJZCArICInXSIpOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ11bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgcGFyZW50RmllbGRJZCArICInXSIpOwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0d28gdGVtcCBlbGVtZW50cyBhcyBtYXJrZXJzIGZvciBzd2l0Y2gKICAgICAgICAgICAgICAgIHZhciB0ZW1wU291cmNlTWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjEnPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgICAgIHZhciB0ZW1wVGFyZ2V0TWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjInPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmJlZm9yZSh0ZW1wVGFyZ2V0TWFya2VyKTsKCiAgICAgICAgICAgICAgICAvLyBtb3ZlcyBkaXYgdmlzdWFsbHkKICAgICAgICAgICAgICAgIEFscGFjYS5hbmltYXRlZE1vdmUoc291cmNlQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIGR1cmF0aW9uLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBzd2FwcGluZyBhbiBpdGVtIGZyb20gb25lIGluZGV4IGluIHRoZSBhcnJheSB0byBhbm90aGVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgc3dhcEl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNoaWxkID0gc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF07CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKCiAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuW3NvdXJjZUluZGV4XSA9IHRhcmdldENoaWxkOwogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF0gPSBzb3VyY2VDaGlsZDsKCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9LAoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFycmF5IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgbGlzdCBvZiBpdGVtcyB3aXRoIHNhbWUgZGF0YSB0eXBlIG9yIHN0cnVjdHVyZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQXJyYXkgSXRlbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2NoZW1hIGZvciBhcnJheSBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gSXRlbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBudW1iZXIgb2YgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSXRlbXMgVW5pcXVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkl0ZW0gdmFsdWVzIHNob3VsZCBiZSB1bmlxdWUgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW5bMF0pIHsKICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZShwcm9wZXJ0aWVzLnByb3BlcnRpZXMuaXRlbXMucHJvcGVydGllcywgdGhpcy5jaGlsZHJlblswXS5nZXRTY2hlbWFPZlNjaGVtYSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3RpY2t5IFRvb2xiYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLiAgSWYgZmFsc2UsIHRoZSB0b29sYmFyIGlzIGFsd2F5cyBkaXNhYmxlZC4gIElmIHVuZGVmaW5lZCBvciBudWxsLCB0aGUgdG9vbGJhciB3aWxsIGFwcGVhciB3aGVuIGhvdmVyZWQgb3Zlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBraW5kIG9mIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICdidXR0b24nIG9yICdsaW5rJy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclBvc2l0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBQb3NpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMb2NhdGlvbiBvZiB0aGUgdG9wLWxldmVsIHRvb2xiYXIgdG8gcmVuZGVyIGZvciB0aGUgYXJyYXkgZmllbGQuICBFaXRoZXIgJ3RvcCcgb3IgJ2JvdHRvbScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidG9wIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uYmFyIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBraW5kIG9mIGFjdGlvbmJhciB0byByZW5kZXIgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuICBFaXRoZXIgJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsIG9yICdyaWdodCcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidG9wIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93TGFiZWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIEFjdGlvbnMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gS2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBMYWJlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENTUyBDbGFzc2VzIGZvciBJY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpY2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENsaWNrIEhhbmRsZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXaGV0aGVyIHRvIHNob3cgbGFiZWxzIG5leHQgdG8gYWN0aW9ucyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbnMgQmFyIEFjdGlvbnMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gS2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBMYWJlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENTUyBDbGFzc2VzIGZvciBJY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpY2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENsaWNrIEhhbmRsZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVUb29sYmFyV2l0aENoaWxkcmVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhpZGUgVG9vbGJhciB3aXRoIENoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB3aGV0aGVyIHRvIGhpZGUgdGhlIHRvcCB0b29sYmFyIHdoZW4gY2hpbGQgZWxlbWVudHMgYXJlIGF2YWlsYWJsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdGlja3kiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInRvb01hbnlJdGVtcyI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaXMgezB9IiwKICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVmFsdWVzIGFyZSBub3QgdW5pcXVlIiwKICAgICAgICAibm90QW5BcnJheSI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhbiBBcnJheSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYXJyYXkiLCBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygiYXJyYXkiLCAiYXJyYXkiKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZGQgTmV3IEl0ZW0iLAogICAgICAgICJhZGRCdXR0b25MYWJlbCI6ICJBZGQiLAogICAgICAgICJyZW1vdmVCdXR0b25MYWJlbCI6ICJSZW1vdmUiLAogICAgICAgICJ1cEJ1dHRvbkxhYmVsIjogIlVwIiwKICAgICAgICAiZG93bkJ1dHRvbkxhYmVsIjogIkRvd24iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCi8qanNoaW50IC1XMDgzICovIC8vIGlubGluZSBmdW5jdGlvbnMgYXJlIHVzZWQgc2FmZWx5CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQgPSBBbHBhY2EuQ29udGFpbmVyRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5yZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzU3RyaW5nKHRoaXMuZGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiT2JqZWN0RmllbGQgcGFyc2VkIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gb2JqZWN0OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGRhdGEgb2JqZWN0IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBhbiBvYmplY3QgYnkgdGhpcyBwb2ludCwgd2UgZG9uJ3QgaGFuZGxlIGl0CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzT2JqZWN0KGRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNvcnQgZXhpc3RpbmcgZmllbGRzIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIHRoaXMuY2hpbGRyZW5CeUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBuZXcgZGF0YSBtYXBwZWQgYnkgcHJvcGVydHkgaWQKICAgICAgICAgICAgdmFyIG5ld0RhdGFCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhQnlQcm9wZXJ0eUlkW2tdID0gZGF0YVtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIG5ldyBwcm9wZXJ0eSBpZHMKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBleGlzdHMsIHNldCB2YWx1ZSBvbnRvIGl0IGFuZCByZW1vdmUgZnJvbSBuZXdEYXRhQnlQcm9wZXJ0eUlkIGFuZCBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZAogICAgICAgICAgICAvLyBpZiBhIGZpZWxkIGRvZXNuJ3QgZXhpc3QsIGxldCBpdCByZW1haW4gaW4gbGlzdAogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIG5ld0RhdGFCeVByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKGZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG5ld0RhdGFCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pOwoKICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld0RhdGFCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFueXRoaW5nIGxlZnQgaW4gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgZGVzY3JpYmVzIGRhdGEgdGhhdCBpcyBtaXNzaW5nLCBudWxsIG9yIGVtcHR5CiAgICAgICAgICAgIC8vIHdlIG51bGwgb3V0IHRob3NlIHZhbHVlcwogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIG5ld0RhdGFCeVByb3BlcnR5SWQgaXMgbmV3IHN0dWZmIHRoYXQgd2UgbmVlZCB0byBhZGQKICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBmaWVsZCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBzaW5jZSBpdCBydW5zIGFnYWluc3QgYSBzY2hlbWEKICAgICAgICAgICAgLy8gc28gd2UgZHJvcCB0aGlzIG9mZgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlY29uc3RydWN0cyB0aGUgZGF0YSBvYmplY3QgZnJvbSB0aGUgY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIGVtcHR5IG9iamVjdAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaGFuZCBiYWNrIGFuIG9iamVjdCB3aXRoIG91ciBjaGlsZCBwcm9wZXJ0aWVzIGluIGl0CiAgICAgICAgICAgIHZhciBvID0ge307CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9iamVjdAogICAgICAgICAgICAvLyBmb3IgZWFjaCBwcm9wZXJ0eSwgd2UgaW5zZXJ0IGl0IGludG8gYSBKU09OIG9iamVjdCB0aGF0IHdlJ2xsIGhhbmQgYmFjayBhcyB0aGUgcmVzdWx0CgogICAgICAgICAgICAvLyBpZiB0aGUgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdGhlbiB3ZSBldmFsdWF0ZSB0aG9zZSBkZXBlbmRlbmNpZXMgZmlyc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCiAgICAgICAgICAgIC8vIHJlc3VsdGluZyBwcm9wZXJ0eSBzaG91bGQgYmUgaW5jbHVkZWQKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGtleSBhbmQgdmxhdWUKICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkVmFsdWUgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYoZmllbGRWYWx1ZSAhPT0gZmllbGRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXNzaWduZWRWYWx1ZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGZpZWxkVmFsdWUpID09PSAiYm9vbGVhbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSAoZmllbGRWYWx1ZT8gdHJ1ZTogZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGZpZWxkVmFsdWUpIHx8IEFscGFjYS5pc09iamVjdChmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNOdW1iZXIoZmllbGRWYWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkVmFsdWUgfHwgZmllbGRWYWx1ZSA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRWYWx1ZSA9IGZpZWxkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc3NpZ25lZFZhbHVlICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW3Byb3BlcnR5SWRdID0gYXNzaWduZWRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlcyB3aXphcmQgaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHNlbGYudmlldy5nZXRXaXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLndpemFyZENvbmZpZ3MpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYud2l6YXJkQ29uZmlncyB8fCBzZWxmLndpemFyZENvbmZpZ3MgPT09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmRDb25maWdzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi53aXphcmRDb25maWdzICYmIEFscGFjYS5pc09iamVjdChzZWxmLndpemFyZENvbmZpZ3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheW91dFRlbXBsYXRlRGVzY3JpcHRvciB8fCBzZWxmLndpemFyZENvbmZpZ3MuYmluZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHRoZSBhdXRvbWF0aWMgd2l6YXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdXRvV2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFudWFsIHdpemFyZCBiYXNlZCBvbiBsYXlvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqCiAgICAgICAgICogQ3JlYXRlcyBzdWItaXRlbXMgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CgogICAgICAgICAgICAvLyB3ZSBrZWVwIGEgbWFwIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiBvdXIgb3JpZ2luYWwgZGF0YSBvYmplY3QKICAgICAgICAgICAgLy8gYXMgd2UgcmVuZGVyIGVsZW1lbnRzIG91dCBvZiB0aGUgc2NoZW1hLCB3ZSByZW1vdmUgZnJvbSB0aGUgZXh0cmFEYXRhUHJvcGVydGllcyBtYXAKICAgICAgICAgICAgLy8gd2hhdGV2ZXIgaXMgbGVmdG92ZXIgYXJlIHRoZSBkYXRhIHByb3BlcnRpZXMgdGhhdCB3ZXJlIE5PVCByZW5kZXJlZCBiZWNhdXNlIHRoZXkgd2VyZSBub3QgcGFydAogICAgICAgICAgICAvLyBvZiB0aGUgc2NoZW1hCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJpbWFyaWx5IG1haW50YWluZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgc28gYXMgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIgb2YgbWlzbWF0Y2hlcwogICAgICAgICAgICB2YXIgZXh0cmFEYXRhUHJvcGVydGllcyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBkYXRhS2V5IGluIHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgZXh0cmFEYXRhUHJvcGVydGllc1tkYXRhS2V5XSA9IGRhdGFLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gc2VsZi5kYXRhOwogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEgJiYgc2VsZi5zY2hlbWEucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNlbGYuc2NoZW1hLnByb3BlcnRpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjZiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjaGVtYSBhbmQgdGhlIGRhdGEgbGluZSB1cCBwZXJmZWN0bHksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBwcm9wZXJ0aWVzIGluIHRoZSBkYXRhIHRoYXQgYXJlCiAgICAgICAgICAgICAgICAvLyBub3QgYWxzbyBpbiB0aGUgc2NoZW1hLCBhbmQgdGh1cywgZXh0cmFEYXRhUHJvcGVydGllcyB3aWxsIGJlIGVtcHR5LgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSBhcmUgc29tZSBwcm9wZXJ0aWVzIGluIGRhdGEgdGhhdCB3ZXJlIG5vdCBpbiBzY2hlbWEsIHRoZW4gdGhleSB3aWxsCiAgICAgICAgICAgICAgICAvLyByZW1haW4gaW4gZXh0cmFEYXRhUHJvcGVydGllcyBhbmQgd2UgY2FuIGluZm9ybSBkZXZlbG9wZXJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICB2YXIgZXh0cmFEYXRhS2V5cyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgZXh0cmFEYXRhS2V5IGluIGV4dHJhRGF0YVByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgICAgICBleHRyYURhdGFLZXlzLnB1c2goZXh0cmFEYXRhS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChleHRyYURhdGFLZXlzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlRoZXJlIHdlcmUgIiArIGV4dHJhRGF0YUtleXMubGVuZ3RoICsgIiBleHRyYSBkYXRhIGtleXMgdGhhdCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBzY2hlbWEgIiArIEpTT04uc3RyaW5naWZ5KGV4dHJhRGF0YUtleXMpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBlYWNoIHByb3BlcnR5IGluIHRoZSBvYmplY3QgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2NoZW1hIGFuZCBvcHRpb25zIHNvIHdlIG5lZWQgdG8gcHJvY2VzcwogICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBhbmQgd2FpdCBmb3IgYWxsIHRvIGNvbXBsZXRlCgogICAgICAgICAgICB2YXIgaXRlbXNCeVByb3BlcnR5SWQgPSB7fTsKCiAgICAgICAgICAgIC8vIHdyYXAgaW50byB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUZ1bmN0aW9ucyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGF0YSA9IHNlbGYuZGF0YVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYWxsb3cgdGhpcyBpZiB3ZSBoYXZlIGRhdGEsIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlUHJvcGVydHlTY2hlbWFPcHRpb25zKHByb3BlcnR5SWQsIGZ1bmN0aW9uIChzY2hlbWEsIG9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNjaGVtYTogIiArIEpTT04uc3RyaW5naWZ5KHNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZUl0ZW0ocHJvcGVydHlJZCwgc2NoZW1hLCBvcHRpb25zLCBpdGVtRGF0YSwgbnVsbCwgZnVuY3Rpb24gKGFkZGVkSXRlbUNvbnRyb2wpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSBhZGRlZEl0ZW1Db250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBleHRyYURhdGFQcm9wZXJ0aWVzIGhlbHBlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleHRyYURhdGFQcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgfSkocHJvcGVydHlJZCwgaXRlbURhdGEsIGV4dHJhRGF0YVByb3BlcnRpZXMpOwoKICAgICAgICAgICAgICAgIHByb3BlcnR5RnVuY3Rpb25zLnB1c2gocGYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwocHJvcGVydHlGdW5jdGlvbnMsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGl0ZW1zIGFycmF5IGluIGNvcnJlY3QgcHJvcGVydHkgb3JkZXIKICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gcHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYW55IG9yZGVyIGluZm9ybWF0aW9uIGluIHRoZSBpdGVtcz8KICAgICAgICAgICAgICAgIHZhciBoYXNPcmRlckluZm9ybWF0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihpdGVtc1tpXS5vcHRpb25zLm9yZGVyKSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaGFzT3JkZXJJbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckEgPSBhLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJBKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZGVyQSAtIG9yZGVyQik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2YoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBzdWItaXRlbSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcG9zdFJlbmRlckNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gcG9zdFJlbmRlckNhbGxiYWNrIGNhbGxlZCBvbmNlIHRoZSBpdGVtIGhhcyBiZWVuIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbTogZnVuY3Rpb24ocHJvcGVydHlJZCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBpbnNlcnRBZnRlcklkLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybUVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAiZGF0YSIgOiBpdGVtRGF0YSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogaXRlbU9wdGlvbnMsCiAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAidmlldyIgOiB0aGlzLnZpZXcuaWQgPyB0aGlzLnZpZXcuaWQgOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAiY29ubmVjdG9yIjogdGhpcy5jb25uZWN0b3IsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXN0cm95KCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdFRvcExldmVsIjp0cnVlLAogICAgICAgICAgICAgICAgInJlbmRlciIgOiBmdW5jdGlvbihmaWVsZENvbnRyb2wsIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhcmVudCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBwcm9wZXJ0eSBJZAogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wcm9wZXJ0eUlkID0gcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYXRoICE9PSAiLyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiLyIgKyBwcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnJlbmRlcihudWxsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiBmdW5jdGlvbihjb250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFscGFjYSBmaW5pc2hlZAoKICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIgdGhlIG91dGVyIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGNvbnRyb2wubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHNlbGYub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogaXRlbURhdGEKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKGNvbnRhaW5lckl0ZW1FbCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChjb250YWluZXJJdGVtRWwpLmhhc0NsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW50byBwbGFjZQogICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnRFbCkuYmVmb3JlKGNvbnRyb2wuZ2V0RmllbGRFbCgpKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNvbnRhaW5lckl0ZW1FbCA9IGNvbnRhaW5lckl0ZW1FbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5LCBhcyBwZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWlyY2FsL2FscGFjYS9jb21taXQvNDA2MWMzMzc4N2JkN2EyYjg2ZmI2MTMzMTczNzRkMzY1ZDlhY2M5MgogICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihjb250cm9sLCBmdW5jdGlvbihfY29udHJvbCkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlbmRlckNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIHN1Yi1vYmplY3RzIHdpdGhpbiB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9uczogZnVuY3Rpb24ocHJvcGVydHlJZCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGNvbXBsZXRpb25GdW5jdGlvbiA9IGZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3BlcnR5T3B0aW9ucy5yZWFkb25seSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2socmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eVNjaGVtYSA9IG51bGw7CiAgICAgICAgICAgIGlmIChfdGhpcy5zY2hlbWEgJiYgX3RoaXMuc2NoZW1hLnByb3BlcnRpZXMgJiYgX3RoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5U2NoZW1hID0gX3RoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zLmZpZWxkcyAmJiBfdGhpcy5vcHRpb25zLmZpZWxkc1twcm9wZXJ0eUlkXSkgewogICAgICAgICAgICAgICAgcHJvcGVydHlPcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmRsZSAkcmVmCiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVNjaGVtYSAmJiBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlSZWZlcmVuY2VJZCA9IHByb3BlcnR5U2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5U2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlPcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZmVyZW5jZUlkID0gcHJvcGVydHlPcHRpb25zWyIkcmVmIl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWVsZENoYWluID0gW3RvcEZpZWxkXTsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRDaGFpbi5wdXNoKHRvcEZpZWxkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnR5U2NoZW1hOwogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zID0gcHJvcGVydHlPcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgcHJvcGVydHlSZWZlcmVuY2VJZCwgZmllbGRSZWZlcmVuY2VJZCwgZnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmaWVsZCBjaGFpbiB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2lyY3VsYXJpdHkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRDaGFpbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZENoYWluW2ldLnNjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpIHx8IChmaWVsZENoYWluW2ldLnNjaGVtYS5pZCA9PT0gIiMiICsgcHJvcGVydHlSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gcHJvcGVydHlSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIGNpcmN1bGFyID0gKHJlZkNvdW50ID4gMSk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5U2NoZW1hID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlTY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIG9yaWdpbmFsIGlkCiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgJiYgb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3BlcnR5U2NoZW1hLmlkID0gb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYS5pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9kZWxldGUgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkUHJvcGVydHlPcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgb3JpZ2luYWxQcm9wZXJ0eU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBwcm9wZXJ0eU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihwcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBtb2RlbC5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gbW9kZWwuaXRlbXNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gaXRlbS5wcm9wZXJ0eUlkOwoKICAgICAgICAgICAgICAgICAgICAvLyBIQU5ETEUgUFJPUEVSVFkgREVQRU5ERU5DSUVTIChJRiBUSEUgUFJPUEVSVFkgSEFTIFRIRU0pCgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgc2hvdyBvciBoaWRlIHRoaXMgYWRkZWQgaXRlbSByaWdodCBhd2F5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIGJpbmQgdXBkYXRlIGhhbmRsZXJzIHRvIGRlcGVuZGVudCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudChwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCB0cmlnZ2VyIHRob3NlIHRvIGVuc3VyZSBpdCBpcyBpbiB0aGUgcmlnaHQgc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hEZXBlbmRlbnRGaWVsZFN0YXRlcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYoMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlQcm9wZXJ0aWVzIiksIFt0aGlzLnNjaGVtYS5tYXhQcm9wZXJ0aWVzXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pblByb3BlcnRpZXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5taW5Qcm9wZXJ0aWVzXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55UHJvcGVydGllcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJ0b29GZXdQcm9wZXJ0aWVzIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIG1heFByb3BlcnRpZXMgc2NoZW1hIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgbWF4UHJvcGVydGllcyBpcyBzYXRpc2ZpZWQKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhQcm9wZXJ0aWVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hWyJtYXhQcm9wZXJ0aWVzIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1heFByb3BlcnRpZXMgPSB0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdOwoKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgICAgdmFyIHByb3BlcnR5Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvcGVydHlDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlDb3VudCA8PSBtYXhQcm9wZXJ0aWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIG1heFByb3BlcnRpZXMgc2NoZW1hIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgbWF4UHJvcGVydGllcyBpcyBzYXRpc2ZpZWQKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hWyJtaW5Qcm9wZXJ0aWVzIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1pblByb3BlcnRpZXMgPSB0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdOwoKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgICAgdmFyIHByb3BlcnR5Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvcGVydHlDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlDb3VudCA+PSBtaW5Qcm9wZXJ0aWVzOwogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBERVBFTkRFTkNJRVMKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3Mgb3IgaGlkZXMgYSBwcm9wZXJ0eSdzIGZpZWxkIGJhc2VkIG9uIGhvdyBpdHMgZGVwZW5kZW5jaWVzIGV2YWx1YXRlLgogICAgICAgICAqIElmIGEgcHJvcGVydHkgZG9lc24ndCBoYXZlIGRlcGVuZGVuY2llcywgdGhpcyBuby1vcHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIHNob3dPckhpZGVQcm9wZXJ0eUJhc2VkT25EZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy5kZXRlcm1pbmVBbGxEZXBlbmRlbmNpZXNWYWxpZChwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLnNob3coKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRSZXZlYWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW0uaGlkZSgpOwogICAgICAgICAgICAgICAgaXRlbS5vbkRlcGVuZGVudENvbmNlYWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlbS5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlc29sdmluZyBkZXBlbmRlbmNpZXMgZm9yIGEgY2hpbGQgcHJvcGVydHkuCiAgICAgICAgICogVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgSlNPTiBTY2hlbWEgdjQgYW5kIGFsc28gcHJvdmlkZXMgZm9yIGxlZ2FjeSB2MyBzdXBwb3J0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBnZXRDaGlsZERlcGVuZGVuY2llczogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGZpcnN0LCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIHdpdGhpbiB0aGUgb2JqZWN0IChjb250YWluZXIpCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gbnVsbDsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmRlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbURlcGVuZGVuY2llcyA9IHRoaXMuc2NoZW1hLmRlcGVuZGVuY2llc1twcm9wZXJ0eUlkXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBvbiB0aGUgaXRlbSBpdHNlbGYKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBzY2hlbWEKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSBpdGVtLnNjaGVtYS5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtRGVwZW5kZW5jaWVzOwogICAgICAgIH0sCgogICAgICAgIGdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXRlbUNvbmRpdGlvbmFsRGVwZW5kZW5jaWVzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIHNlY29uZCwgY2hlY2sgZm9yIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBvbiB0aGUgaXRlbSBpdHNlbGYKICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBzdXBwb3J0IGxlZ2FjeSB2MyBqc29uIG9wdGlvbnMKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbmFsRGVwZW5kZW5jaWVzID0gaXRlbS5vcHRpb25zLmRlcGVuZGVuY2llczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlcGVuZGVuY2llcyBmb3IgYSBwcm9wZXJ0eSBwYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBkZXRlcm1pbmVBbGxEZXBlbmRlbmNpZXNWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIHdpdGhpbiB0aGUgb2JqZWN0IChjb250YWluZXIpCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTs7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyB5ZXMsIHdlIHBhc3MKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxpZCA9IHNlbGYuZGV0ZXJtaW5lU2luZ2xlRGVwZW5kZW5jeVZhbGlkKHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIGZpZWxkIHVwZGF0ZXMgdG8gYW55IGZpZWxkIGRlcGVuZGVuY2llcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgYmluZERlcGVuZGVuY3lGaWVsZFVwZGF0ZUV2ZW50OiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIGJpbmRFdmVudCA9IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmN5UHJvcGVydHlJZCBpcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHByb3BlcnR5IHRoYXQgdGhlIGZpZWxkICJwcm9wZXJ0eUlkIiBpcyBkZXBlbmRlbnQgb24KCiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRGaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkuYmluZCgiZmllbGR1cGRhdGUiLCAoZnVuY3Rpb24ocHJvcGVydHlGaWVsZCwgZGVwZW5kZW5jeUZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgImRlcGVuZGVuY3lQcm9wZXJ0eUlkIiBjaGFuZ2VkIGFuZCBhZmZlY3RzIHRhcmdldCBwcm9wZXJ0eSAoInByb3BlcnR5SWQiKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBVSSBzdGF0ZSBmb3IgdGFyZ2V0IHByb3BlcnR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3dPckhpZGVQcm9wZXJ0eUJhc2VkT25EZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgfSkoaXRlbSwgZGVwZW5kZW50RmllbGQsIHByb3BlcnR5SWQsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgZmllbGQgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiaW5kRXZlbnQocHJvcGVydHlJZCwgaXRlbURlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtRGVwZW5kZW5jaWVzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBiaW5kRXZlbnQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgcHJvcGVydHlGaWVsZCA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghcHJvcGVydHlGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGl0ZW1EZXBlbmRlbmNpZXMgPSBzZWxmLmdldENoaWxkRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28gc2ltcGxlIHJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbgogICAgICAgICAgICB2YXIgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkgPSBmdW5jdGlvbihvdGhlclByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBkZXBlbmRlbnRGaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgb3RoZXJQcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRGaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkoaXRlbURlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtRGVwZW5kZW5jaWVzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRmllbGRVcGRhdGVGb3JQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIGEgc2luZ2xlIHByb3BlcnR5J3MgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogSW4gb3JkZXIgdG8gYmUgdmFsaWQsIHRoZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgbXVzdCBleGlzdCAoSlNPTiBzY2hlbWEpIGFuZCBvcHRpb25hbGx5IG11c3Qgc2F0aXNmeQogICAgICAgICAqIGFueSBkZXBlbmRlbmN5IG9wdGlvbnMgKHZhbHVlIG1hdGNoZXMgdXNpbmcgYW4gQU5EKS4gIEZpbmFsbHksIHRoZSBkZXBlbmRlbmN5IGZpZWxkIG11c3QgYmUgc2hvd2luZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eUlkIEZpZWxkIHByb3BlcnR5IGlkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXBlbmRlbnRPblByb3BlcnR5SWQgUHJvcGVydHkgaWQgb2YgdGhlIGRlcGVuZGVuY3kgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBhbGwgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBzYXRpc2ZpZWQgYW5kIHRoZSBmaWVsZCBuZWVkcyB0byBiZSBzaG93biwKICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lU2luZ2xlRGVwZW5kZW5jeVZhbGlkOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbnRPblByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVja3MgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkICJkZXBlbmRlbnQtb24iIHByb3BlcnR5IGhhcyBhIHZhbHVlCiAgICAgICAgICAgIC8vIGJhc2ljIEpTT04tc2NoZW1hIHN1cHBvcnRzIHRoaXMgKGlmIGl0IGhhcyBBTlkgdmFsdWUsIGl0IGlzIGNvbnNpZGVyZWQgdmFsaWQKICAgICAgICAgICAgLy8gc3BlY2lhbCBjb25zaWRlcmF0aW9uIGZvciBib29sZWFuIGZhbHNlCiAgICAgICAgICAgIHZhciBkZXBlbmRlbnRPbkZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbnRPblByb3BlcnR5SWQpOwogICAgICAgICAgICBpZiAoIWRlcGVuZGVudE9uRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVudC1vbiBmaWVsZCBmb3VuZCwgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkZXBlbmRlbnRPbkRhdGEgPSBkZXBlbmRlbnRPbkZpZWxkLmRhdGE7CgogICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXNuJ3QgdmFsaWQKICAgICAgICAgICAgdmFyIHZhbGlkID0gZmFsc2U7CgogICAgICAgICAgICAvLyBnbyBvbmUgb2YgdHdvIGRpcmVjdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgb3Igbm90CiAgICAgICAgICAgIHZhciBjb25kaXRpb25hbERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0Q2hpbGRDb25kaXRpb25hbERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFjb25kaXRpb25hbERlcGVuZGVuY2llcyB8fCBjb25kaXRpb25hbERlcGVuZGVuY2llcy5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBCQVNJQyBERVBFTkVOREVOQ1kgQ0hFQ0tJTkcgKENPUkUgSlNPTiBTQ0hFTUEpCiAgICAgICAgICAgICAgICAvLwoKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogaWYgdGhlIGZpZWxkIGlzIGEgYm9vbGVhbiBmaWVsZCBhbmQgd2UgaGF2ZSBubyBjb25kaXRpb25hbCBkZXBlbmRlbmN5IGNoZWNraW5nLAogICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBzZXQgdmFsaWQgPSBmYWxzZSBpZiB0aGUgZmllbGQgZGF0YSBpcyBhIGJvb2xlYW4gZmFsc2UKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICF0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdLm9wdGlvbnMuZGVwZW5kZW5jaWVzICYmICFkZXBlbmRlbnRPbkRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9ICFBbHBhY2EuaXNWYWxFbXB0eShkZXBlbmRlbnRPbkZpZWxkLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIENPTkRJVElPTkFMIERFUEVOREVOQ1kgQ0hFQ0tJTkcgKEFMUEFDQSBFWFRFTlNJT04gVklBIE9QVElPTlMpCiAgICAgICAgICAgICAgICAvLwoKICAgICAgICAgICAgICAgIC8vIEFscGFjYSBleHRlbmRzIEpTT04gc2NoZW1hIGJ5IGFsbG93aW5nIGRlcGVuZGVuY2llcyB0byB0cmlnZ2VyIG9ubHkgZm9yIHNwZWNpZmljIHZhbHVlcyBvbiB0aGUKICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVudCBmaWVsZHMuICBJZiBvcHRpb25zIGFyZSBzcGVjaWZpZWQgdG8gZGVmaW5lIHRoaXMsIHdlIHdhbGsgdGhyb3VnaCBhbmQgcGVyZm9ybSBhbgogICAgICAgICAgICAgICAgLy8gQU5EIG9wZXJhdGlvbiBhY3Jvc3MgYW55IGZpZWxkcwoKICAgICAgICAgICAgICAgIC8vIGRvIHNvbWUgZGF0YSBzYW5pdHkgY2xlYW51cAogICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVudE9uRmllbGQuZ2V0VHlwZSgpID09PSAiYm9vbGVhbiIgJiYgIWRlcGVuZGVudE9uRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudE9uRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25hbERhdGEgPSBjb25kaXRpb25hbERlcGVuZGVuY2llc1tkZXBlbmRlbnRPblByb3BlcnR5SWRdOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBvcHRpb24gaXMgYSBmdW5jdGlvbiwgdGhlbiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2hvdwogICAgICAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIGV2YWx1YXRlcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNjaGVtYS1iYXNlZCBmYWxsYmFjayBkZXRlcm1pbmVkIHdlIHNob3VsZCBzaG93CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY29uZGl0aW9uYWxEYXRhKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGNvbmRpdGlvbmFsRGF0YS5jYWxsKHRoaXMsIGRlcGVuZGVudE9uRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRydWUKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25kaXRpb25hbCBkYXRhIGlzIGFuIGFycmF5IG9mIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShjb25kaXRpb25hbERhdGEpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhcnJheSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5hbnlFcXVhbGl0eShkZXBlbmRlbnRPbkRhdGEsIGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb2JqZWN0IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZGl0aW9uYWxEYXRhKSAmJiAhQWxwYWNhLmFueUVxdWFsaXR5KGNvbmRpdGlvbmFsRGF0YSwgZGVwZW5kZW50T25EYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gTkVTVEVEIEhJRERFTlMgREVQRU5ERU5DWSBISURFUyAoQUxQQUNBIEVYVEVOU0lPTikKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGZpbmFsIGNoZWNrOiBvbmx5IHNldCB2YWxpZCBpZiB0aGUgZGVwZW5kZW50T25Qcm9wZXJ0eUlkIGlzIHNob3dpbmcKICAgICAgICAgICAgaWYgKGRlcGVuZGVudE9uRmllbGQgJiYgZGVwZW5kZW50T25GaWVsZC5pc0hpZGRlbigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjaGlsZCBpbmRleC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqLwogICAgICAgIGdldEluZGV4OiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHByb3BlcnR5SWQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcGlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgaWYgKHBpZCA9PSBwcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gRFlOQU1JQyBNRVRIT0RTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhbiBpdGVtIHRvIHRoZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVNjaGVtYSBzY2hlbWEKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPcHRpb25zIENoaWxkIGZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIENoaWxkIGZpZWxkIHZhbHVlCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGluc2VydEFmdGVySWQgTG9jYXRpb24gd2hlcmUgdGhlIGNoaWxkIGl0ZW0gd2lsbCBiZSBpbnNlcnRlZC4KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGFkZEl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmNyZWF0ZUl0ZW0ocHJvcGVydHlJZCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBpbnNlcnRBZnRlcklkLCBmdW5jdGlvbihjaGlsZCkgewoKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QWZ0ZXJJZCAmJiBzZWxmLmNoaWxkcmVuQnlJZFtpbnNlcnRBZnRlcklkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyB6KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlblt6XS5nZXRJZCgpID09IGluc2VydEFmdGVySWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gejsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RlckNoaWxkKGNoaWxkLCAoKGluZGV4ICE9IG51bGwpID8gaW5kZXggKyAxIDogMCkpOwoKICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgc2VsZi5kb0FkZEl0ZW0oaW5kZXgsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAvL3NlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IGFkZAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYWRkIiwgY2hpbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyICJyZWFkeSIKICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsICJyZWFkeSIsICJkb3duIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluc2VydCBmaXJzdCBpbnRvIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucHJlcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgaW5kZXggKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGFmdGVyCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LmFmdGVyKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyQWRkSXRlbShpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHJlYWR5CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KGl0ZW0pOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbW92ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoY2hpbGRGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9ICQuZ3JlcCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAodmFsLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsLnByb3BlcnR5SWQgIT09IHByb3BlcnR5SWQpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jaGlsZHJlbkJ5SWRbY2hpbGRGaWVsZC5nZXRJZCgpXTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEZpZWxkKTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb1JlbW92ZUl0ZW06IGZ1bmN0aW9uKGl0ZW0pCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgcmVtb3ZlSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgcmVtb3ZlSXRlbUNvbnRhaW5lci5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lPSciICsgaXRlbS5uYW1lICsgIiddIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBkZXN0cm95IGNoaWxkIGZpZWxkIGl0c2VsZgogICAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBXSVpBUkQKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogV3JhcHMgdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gYSB3aXphcmQgY29udGFpbmVyIGFuZCB3aXJlcyB1cCB0aGUgbmF2aWdhdGlvbiBhbmQgYnV0dG9ucyBzbyB0aGF0CiAgICAgICAgICogd2l6YXJkIGVsZW1lbnRzIGZsaXAgbmljZWx5LgogICAgICAgICAqLwogICAgICAgIHdpemFyZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY29uZmlnLWRyaXZlbgogICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0b3JzID0gdGhpcy53aXphcmRDb25maWdzLnN0ZXBzOwogICAgICAgICAgICBpZiAoIXN0ZXBEZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3JzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdpemFyZFRpdGxlID0gdGhpcy53aXphcmRDb25maWdzLnRpdGxlOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSB0aGlzLndpemFyZENvbmZpZ3MuZGVzY3JpcHRpb247CiAgICAgICAgICAgIHZhciBidXR0b25EZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5idXR0b25zOwogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9ycyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdID0ge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSA9ICJQcmV2aW91cyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24gPSAibGVmdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdID0ge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udGl0bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udGl0bGUgPSAiTmV4dCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLmFsaWduKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLmFsaWduID0gInJpZ2h0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy53aXphcmRDb25maWdzLmhpZGVTdWJtaXRCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdID0ge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnRpdGxlID0gIlN1Ym1pdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS5hbGlnbikgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgYnV0dG9uS2V5IGluIGJ1dHRvbkRlc2NyaXB0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzW2J1dHRvbktleV0udHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1N0ZXBzID0gdGhpcy53aXphcmRDb25maWdzLnNob3dTdGVwczsKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93U3RlcHMpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzaG93UHJvZ3Jlc3NCYXIgPSB0aGlzLndpemFyZENvbmZpZ3Muc2hvd1Byb2dyZXNzQmFyOwogICAgICAgICAgICB2YXIgcGVyZm9ybVZhbGlkYXRpb24gPSB0aGlzLndpemFyZENvbmZpZ3MudmFsaWRhdGlvbjsKICAgICAgICAgICAgaWYgKHR5cGVvZihwZXJmb3JtVmFsaWRhdGlvbikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXRpdGxlIik7CiAgICAgICAgICAgIHZhciB3aXphcmREZXNjcmlwdGlvbiA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWRlc2NyaXB0aW9uIik7CiAgICAgICAgICAgIHZhciBfd2l6YXJkVmFsaWRhdGlvbiA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXZhbGlkYXRpb24iKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkVmFsaWRhdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uID0gX3dpemFyZFZhbGlkYXRpb24gPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF93aXphcmRTaG93U3RlcHMgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zaG93LXN0ZXBzIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFNob3dTdGVwcykgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNob3dTdGVwcyA9IF93aXphcmRTaG93U3RlcHMgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF93aXphcmRTaG93UHJvZ3Jlc3NCYXIgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zaG93LXByb2dyZXNzLWJhciIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93UHJvZ3Jlc3NCYXIpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFsbCBvZiB0aGUgc3RlcHMKICAgICAgICAgICAgdmFyIHN0ZXBFbHMgPSAkKHRoaXMuZmllbGQpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIik7CgogICAgICAgICAgICAvLyBET00tZHJpdmVuIGNvbmZpZ3VyYXRpb24gb2Ygc3RlcCBkZXNjcmlwdG9ycwogICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGVwRWxzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0b3IgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBUaXRsZSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtdGl0bGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBUaXRsZSkgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9IHN0ZXBUaXRsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci50aXRsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLnRpdGxlID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0aW9uID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc3RlcC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RlcERlc2NyaXB0aW9uKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gc3RlcERlc2NyaXB0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IuZGVzY3JpcHRpb24gPSAiU3RlcCAiICsgaTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycy5wdXNoKHN0ZXBEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgc29tZXRoaW5nIGZvciBwcm9ncmVzcyBiYXIgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHNob3dQcm9ncmVzc0JhcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzdGVwRGVzY3JpcHRvcnMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLy8gbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIHdpemFyZAogICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgbW9kZWwud2l6YXJkVGl0bGUgPSB3aXphcmRUaXRsZTsKICAgICAgICAgICAgbW9kZWwud2l6YXJkRGVzY3JpcHRpb24gPSB3aXphcmREZXNjcmlwdGlvbjsKICAgICAgICAgICAgbW9kZWwuc2hvd1N0ZXBzID0gc2hvd1N0ZXBzOwogICAgICAgICAgICBtb2RlbC5wZXJmb3JtVmFsaWRhdGlvbiA9IHBlcmZvcm1WYWxpZGF0aW9uOwogICAgICAgICAgICBtb2RlbC5zdGVwcyA9IHN0ZXBEZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuYnV0dG9ucyA9IGJ1dHRvbkRlc2NyaXB0b3JzOwogICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSBzZWxmLnNjaGVtYTsKICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHNlbGYub3B0aW9uczsKICAgICAgICAgICAgbW9kZWwuZGF0YSA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgbW9kZWwuc2hvd1Byb2dyZXNzQmFyID0gc2hvd1Byb2dyZXNzQmFyOwogICAgICAgICAgICBtb2RlbC5tYXJrQWxsU3RlcHNWaXNpdGVkID0gdGhpcy53aXphcmRDb25maWdzLm1hcmtBbGxTdGVwc1Zpc2l0ZWQ7CiAgICAgICAgICAgIG1vZGVsLnZpZXcgPSBzZWxmLnZpZXc7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGFjdHVhbCB3aXphcmQKICAgICAgICAgICAgdmFyIHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoIndpemFyZCIsIHNlbGYpOwogICAgICAgICAgICBpZiAod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkRWwgPSBBbHBhY2EudG1wbCh3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmFwcGVuZCh3aXphcmRFbCk7CgogICAgICAgICAgICAgICAgdmFyIHdpemFyZE5hdiA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLW5hdiIpOwogICAgICAgICAgICAgICAgdmFyIHdpemFyZFN0ZXBzID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtc3RlcHMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRCdXR0b25zID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtYnV0dG9ucyIpOwogICAgICAgICAgICAgICAgdmFyIHdpemFyZFByb2dyZXNzQmFyID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtcHJvZ3Jlc3MtYmFyIik7CgogICAgICAgICAgICAgICAgLy8gbW92ZSBzdGVwcyBpbnRvIHBsYWNlCiAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5hcHBlbmQoc3RlcEVscyk7CgogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAwOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNCdXR0b25FbCA9ICQod2l6YXJkQnV0dG9ucykuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1idXR0b24ta2V5PSdwcmV2aW91cyddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRCdXR0b25FbCA9ICQod2l6YXJkQnV0dG9ucykuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1idXR0b24ta2V5PSduZXh0J10iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3VibWl0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nc3VibWl0J10iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc25hcCBpbnRvIHBsYWNlIGEgbGl0dGxlIGNvbnRyb2xsZXIgdG8gd29yayB0aGUgYnV0dG9ucwogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmlyc3Qgc3RlcAogICAgICAgICAgICAgICAgICAgIHZhciByZWZyZXNoU3RlcHMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOQVYKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dTdGVwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RlbC52aXNpdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlzaXRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBtYXJrIGFsbCBzdGVwcyBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcEVsZW1lbnRzID0gJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0c1tnXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBzdGVwIGFzIHZpc2l0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0c1tjdXJyZW50SW5kZXhdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcEVsZW1lbnRzID0gJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygiY29tcGxldGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA8IGN1cnJlbnRJbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnID09PSBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtYXJrIGRpc2FibGVkIGZvciB0aGlzIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tnXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoInZpc2l0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBST0dSRVNTIEJBUgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuc2hvd1Byb2dyZXNzQmFyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVOb3cgPSBjdXJyZW50SW5kZXggKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTWF4ID0gbW9kZWwuc3RlcHMubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHBhcnNlSW50KCgodmFsdWVOb3cgLyB2YWx1ZU1heCkgKiAxMDApLCAxMCkgKyAiJSI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVtYXgiLCB2YWx1ZU1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuYXR0cigiYXJpYS12YWx1ZW5vdyIsIHZhbHVlTm93KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5jc3MoIndpZHRoIiwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQlVUVE9OUwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQnV0dG9uRWwuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY2FzZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5zdGVwcy5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgYWxsIHN0ZXBzCiAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIilbY3VycmVudEluZGV4XSkuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgYXNzZXJ0VmFsaWRhdGlvbiA9IGZ1bmN0aW9uKGJ1dHRvbklkLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwucGVyZm9ybVZhbGlkYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBvZiB0aGUgZmllbGRzIG9uIHRoZSBjdXJyZW50IHN0ZXAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVwRWwgPSAkKCQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIilbY3VycmVudEluZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoY3VycmVudFN0ZXBFbCkuZmluZCgiLmFscGFjYS1maWVsZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRJZCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZElkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IHNlbGYuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBpbnRvIHZhbGlkYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZmllbGRzW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBhbGwgdmFsaWRhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgZmllbGRzW2ldLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbYnV0dG9uSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi52YWxpZGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnZhbGlkYXRlLmNhbGwoc2VsZiwgZnVuY3Rpb24oX3ZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgX3ZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh2YWxpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkKHByZXZpb3VzQnV0dG9uRWwpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Fzc2VydFZhbGlkYXRpb24oInByZXZpb3VzIiwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sicHJldmlvdXMiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4LS07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChuZXh0QnV0dG9uRWwpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIDEgPD0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbigibmV4dCIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sibmV4dCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb2N1cyB0byBzZXR0bGUgb24gaW52YWxpZCBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9jdXMoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHN1Ym1pdEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oInN1Ym1pdCIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sic3VibWl0Il07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIGluIGEgZm9ybT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5mb3JtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb2N1cyB0byBzZXR0bGUgb24gaW52YWxpZCBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9jdXMoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY3VzdG9tIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleV0iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICJzdWJtaXQiICYmIGtleSAhPSAibmV4dCIgJiYga2V5ICE9ICJwcmV2aW91cyIpIHsgLy8gc3RhbmRhcmQgYnV0dG9ucyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiBiLmNsaWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4XSIpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hdkluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdkluZGV4ID0gcGFyc2VJbnQobmF2SW5kZXgsIDEwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPT0gY3VycmVudEluZGV4IHx8IChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW25hdkluZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgZ29pbmcgYmFja3dhcmRzLCB0aGVuIHdlIGRvIG5vdCBydW4gdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXZJbmRleCA8IGN1cnJlbnRJbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5hdkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmF2SW5kZXggPiBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5hdkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBpdGVtIHNob3VsZCBub3QgYmUgY2xpY2thYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oIm1vdmVUb1N0ZXAiLCBmdW5jdGlvbihldmVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBza2lwVmFsaWRhdGlvbiA9IGV2ZW50LnNraXBWYWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YoaW5kZXgpICE9PSAidW5kZWZpbmVkIikgJiYgaW5kZXggPD0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBWYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gaW5kZXg7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJhZHZhbmNlT3JTdWJtaXQiLCBmdW5jdGlvbihldmVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuZXh0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwoKICAgICAgICAgICAgICAgIH0od2l6YXJkTmF2LCB3aXphcmRTdGVwcywgd2l6YXJkQnV0dG9ucywgbW9kZWwpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgYSBjb25maWd1cmF0aW9uLWJhc2VkIHdpemFyZCB3aXRob3V0IGEgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqLwogICAgICAgIGF1dG9XaXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwQmluZGluZ3MgPSB0aGlzLndpemFyZENvbmZpZ3MuYmluZGluZ3M7CiAgICAgICAgICAgIGlmICghc3RlcEJpbmRpbmdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGVwQmluZGluZ3MgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eUlkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGVwQmluZGluZ3NbcHJvcGVydHlJZF0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzaG91bGQgd2UgY3JlYXRlIHN0ZXBzPwogICAgICAgICAgICB2YXIgY3JlYXRlU3RlcHMgPSB0cnVlOwogICAgICAgICAgICBpZiAoJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgdGhlcmUKICAgICAgICAgICAgICAgIGNyZWF0ZVN0ZXBzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzdGVwID0gMTsKICAgICAgICAgICAgdmFyIHN0ZXBGaWVsZHMgPSBbXTsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBmaWVsZHMgaW4gdGhpcyBzdGVwCiAgICAgICAgICAgICAgICBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID09PSBzdGVwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWQgJiYgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2wucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEZpZWxkcy5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzdGVwRmllbGRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZVN0ZXBzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVsID0gJCgnPGRpdiBkYXRhLWFscGFjYS13aXphcmQtcm9sZT0ic3RlcCI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYXBwZW5kKHN0ZXBFbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW3N0ZXAtMV0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYW55IG9yZGVyIGluZm9ybWF0aW9uIGluIHRoZSBpdGVtcz8KICAgICAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBGaWVsZHNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcmRlckluZm9ybWF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3JkZXJJbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgYnkgb3JkZXI/CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMuc29ydChmdW5jdGlvbiAoYSwgYikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckEgPSBhLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyQiA9IGIub3B0aW9ucy5vcmRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgZWxlbWVudHMgaW4KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbCkuYXBwZW5kKHN0ZXBGaWVsZHNbaV0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHN0ZXArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gdGhlIG5vcm1hbCB3aXphcmQKICAgICAgICAgICAgdGhpcy53aXphcmQoKTsKCiAgICAgICAgICAgIC8vIGlmIHRoZSBjb250YWluZXIgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuIGxlZnQsIGhpZGUgaXQKICAgICAgICAgICAgaWYgKCQodGhpcy5jb250YWluZXIpLmNoaWxkcmVuKCkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZXMgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byB3aGljaCB0aGUgY2hpbGQgc2hvdWxkIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgbW92ZW1lbnQKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHN3YXAgd2l0aAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIik7CiAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddIik7CgogICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgIHZhciB0ZW1wU291cmNlTWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjEnPjwvZGl2PiIpOwogICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmJlZm9yZSh0ZW1wVGFyZ2V0TWFya2VyKTsKCiAgICAgICAgICAgIHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzd2FwIG9yZGVyIGluIGNoaWxkcmVuCiAgICAgICAgICAgICAgICB2YXIgdGVtcENoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHNvdXJjZUluZGV4KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkcmVuW2ldID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT09IHRhcmdldEluZGV4KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkcmVuW2ldID0gc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbiA9IHRlbXBDaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAvLyBzd2FwIG9yZGVyIGluIERPTQogICAgICAgICAgICAgICAgdGVtcFNvdXJjZU1hcmtlci5yZXBsYWNlV2l0aCh0YXJnZXRDb250YWluZXIpOwogICAgICAgICAgICAgICAgdGVtcFRhcmdldE1hcmtlci5yZXBsYWNlV2l0aChzb3VyY2VDb250YWluZXIpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhY3Rpb24gYmFyIGJpbmRpbmdzCiAgICAgICAgICAgICAgICAkKHNvdXJjZUNvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgc291cmNlSW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHRhcmdldEluZGV4KTsKICAgICAgICAgICAgICAgICQodGFyZ2V0Q29udGFpbmVyKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpLmF0dHIoImRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4Iiwgc291cmNlSW5kZXgpOwoKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChhbmltYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzd2FwIGRpdnMgdmlzdWFsbHkKICAgICAgICAgICAgICAgIEFscGFjYS5hbmltYXRlZFN3YXAoc291cmNlQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIDUwMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IGZpZWxkIGZvciBjb250YWluaW5nIG90aGVyIGZpZWxkcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBjaGlsZCBwcm9wZXJ0aWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHRoaXMgb2JqZWN0IGlzIGFsbG93ZWQgdG8gaGF2ZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBOdW1iZXIgb2YgUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWluaW11bSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHRoaXMgb2JqZWN0IGlzIHJlcXVpcmVkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGZpZWxkc1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnByb3BlcnRpZXMucHJvcGVydGllczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZTY2hlbWEoKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0udGl0bGUgPSBwcm9wZXJ0eUlkICsgIiA6OiAiICsgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZk9wdGlvbnMgPSBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJvcmRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcmRlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3Igb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW5kZXggb2YgdGhpcyBmaWVsZCBpbiB0aGUgcHJvcGVydGllcyBhcnJheS4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgT3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIG9wdGlvbnMgZm9yIGNoaWxkIGZpZWxkcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGZpZWxkc1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuZmllbGRzOwoKICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzID0ge307CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuW2ldLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdID0gdGhpcy5jaGlsZHJlbltpXS5nZXRTY2hlbWFPZk9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0udGl0bGUgPSBwcm9wZXJ0eUlkICsgIiA6OiAiICsgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHNjaGVtYU9mT3B0aW9ucywgcHJvcGVydGllcyk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAidG9vTWFueVByb3BlcnRpZXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgKHswfSkgaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAidG9vRmV3UHJvcGVydGllcyI6ICJUaGVyZSBhcmUgbm90IGVub3VnaCBwcm9wZXJ0aWVzICh7MH0gYXJlIHJlcXVpcmVkKSIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9iamVjdCIsIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygib2JqZWN0IiwgIm9iamVjdCIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQW55RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQW55RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2ZvY3VzCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5mb2N1cygpOwoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQW55IGZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhbnkiLCBBbHBhY2EuRmllbGRzLkFueUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFueSIsICJhbnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkhpZGRlbkZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiaGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2xFbCgpLnZhbCgiIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2xFbCgpLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJIaWRkZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBhIGhpZGRlbiBIVE1MIGlucHV0IjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJoaWRkZW4iLCBBbHBhY2EuRmllbGRzLkhpZGRlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFkZHJlc3NGaWVsZCA9IEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhZGRyZXNzIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmRhdGEuc3RyZWV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWV0OiBbJycsICcnXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiSG9tZSBBZGRyZXNzIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3RyZWV0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3RyZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IDMwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6IDMKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjaXR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbIkFMIiwgIkFLIiwgIkFTIiwgIkFaIiwgIkFSIiwgIkNBIiwgIkNPIiwgIkNUIiwgIkRFIiwgIkRDIiwgIkZNIiwgIkZMIiwgIkdBIiwgIkdVIiwgIkhJIiwgIklEIiwgIklMIiwgIklOIiwgIklBIiwgIktTIiwgIktZIiwgIkxBIiwgIk1FIiwgIk1IIiwgIk1EIiwgIk1BIiwgIk1JIiwgIk1OIiwgIk1TIiwgIk1PIiwgIk1UIiwgIk5FIiwgIk5WIiwgIk5IIiwgIk5KIiwgIk5NIiwgIk5ZIiwgIk5DIiwgIk5EIiwgIk1QIiwgIk9IIiwgIk9LIiwgIk9SIiwgIlBXIiwgIlBBIiwgIlBSIiwgIlJJIiwgIlNDIiwgIlNEIiwgIlROIiwgIlRYIiwgIlVUIiwgIlZUIiwgIlZJIiwgIlZBIiwgIldBIiwgIldWIiwgIldJIiwgIldZIl0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ6aXAiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJaaXAgQ29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogL14oXGR7NX0oLVxkezR9KT8pPyQvCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBBbHBhY2EubWVyZ2UodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ6aXAiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogIjk5OTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiBbIkFMQUJBTUEiLCAiQUxBU0tBIiwgIkFNRVJJQ0FOIFNBTU9BIiwgIkFSSVpPTkEiLCAiQVJLQU5TQVMiLCAiQ0FMSUZPUk5JQSIsICJDT0xPUkFETyIsICJDT05ORUNUSUNVVCIsICJERUxBV0FSRSIsICJESVNUUklDVCBPRiBDT0xVTUJJQSIsICJGRURFUkFURUQgU1RBVEVTIE9GIE1JQ1JPTkVTSUEiLCAiRkxPUklEQSIsICJHRU9SR0lBIiwgIkdVQU0iLCAiSEFXQUlJIiwgIklEQUhPIiwgIklMTElOT0lTIiwgIklORElBTkEiLCAiSU9XQSIsICJLQU5TQVMiLCAiS0VOVFVDS1kiLCAiTE9VSVNJQU5BIiwgIk1BSU5FIiwgIk1BUlNIQUxMIElTTEFORFMiLCAiTUFSWUxBTkQiLCAiTUFTU0FDSFVTRVRUUyIsICJNSUNISUdBTiIsICJNSU5ORVNPVEEiLCAiTUlTU0lTU0lQUEkiLCAiTUlTU09VUkkiLCAiTU9OVEFOQSIsICJORUJSQVNLQSIsICJORVZBREEiLCAiTkVXIEhBTVBTSElSRSIsICJORVcgSkVSU0VZIiwgIk5FVyBNRVhJQ08iLCAiTkVXIFlPUksiLCAiTk9SVEggQ0FST0xJTkEiLCAiTk9SVEggREFLT1RBIiwgIk5PUlRIRVJOIE1BUklBTkEgSVNMQU5EUyIsICJPSElPIiwgIk9LTEFIT01BIiwgIk9SRUdPTiIsICJQQUxBVSIsICJQRU5OU1lMVkFOSUEiLCAiUFVFUlRPIFJJQ08iLCAiUkhPREUgSVNMQU5EIiwgIlNPVVRIIENBUk9MSU5BIiwgIlNPVVRIIERBS09UQSIsICJURU5ORVNTRUUiLCAiVEVYQVMiLCAiVVRBSCIsICJWRVJNT05UIiwgIlZJUkdJTiBJU0xBTkRTIiwgIlZJUkdJTklBIiwgIldBU0hJTkdUT04iLCAiV0VTVCBWSVJHSU5JQSIsICJXSVNDT05TSU4iLCAiV1lPTUlORyJdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMuYWRkcmVzc1ZhbGlkYXRpb24pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWRkcmVzc1ZhbGlkYXRpb24gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaXNDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBpc0NvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYWRkcmVzcyBpbiBhIHNpbmdsZSBsaW5lIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEFkZHJlc3MgYXMgYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgZ2V0QWRkcmVzczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgPT09ICJ2aWV3IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiIjsKICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RyZWV0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWx1ZS5zdHJlZXQsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlICsgIiAiOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNpdHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZS5jaXR5ICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXRlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuc3RhdGUgKyAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuemlwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuemlwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNhZnRlclJlbmRlckNvbnRhaW5lcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGFkZGl0aW9uYWwgY3NzCiAgICAgICAgICAgICAgICAkKGNvbnRhaW5lcikuYWRkQ2xhc3MoImFscGFjYS1hZGRyZXNzZmllbGQiKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uICYmICFzZWxmLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFwQnV0dG9uID0gJCgnPGRpdiBjbGFzcz0iYWxwYWNhLWZvcm0tYnV0dG9uIj5TaG93IEdvb2dsZSBNYXA8L2Rpdj4nKS5hcHBlbmRUbyhjb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtYXBCdXR0b24uYnV0dG9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmJ1dHRvbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtYXBCdXR0b24uY2xpY2soZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ29vZ2xlICYmIGdvb2dsZS5tYXBzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRyZXNzID0gc2VsZi5nZXRBZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VvY29kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJzogYWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwQ2FudmFzSWQgPSBzZWxmLmdldElkKCkgKyAiLW1hcC1jYW52YXMiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyMnICsgbWFwQ2FudmFzSWQpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCI8ZGl2IGlkPSciICsgbWFwQ2FudmFzSWQgKyAiJyBjbGFzcz0nYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzJz48L2Rpdj4iKS5hcHBlbmRUbyhzZWxmLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIiksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiem9vbSI6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW50ZXIiOiByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXBUeXBlSWQiOiBnb29nbGUubWFwcy5NYXBUeXBlSWQuUk9BRE1BUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHZW9jb2RpbmcgZmFpbGVkOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGxheU1lc3NhZ2UoIkdvb2dsZSBNYXAgQVBJIGlzIG5vdCBpbnN0YWxsZWQuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KS53cmFwKCc8c21hbGwvPicpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dNYXBPbkxvYWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBCdXR0b24uY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBZGRyZXNzIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhbmRhcmQgVVMgQWRkcmVzcyB3aXRoIFN0cmVldCwgQ2l0eSwgU3RhdGUgYW5kIFppcC4gQWxzbyBjb21lcyB3aXRoIHN1cHBvcnQgZm9yIEdvb2dsZSBtYXAuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidmFsaWRhdGVBZGRyZXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWRkcmVzcyBWYWxpZGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuYWJsZSBhZGRyZXNzIHZhbGlkYXRpb24gaWYgdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWFwT25Mb2FkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IHRoZSBtYXAgd2hlbiBmaXJzdCBsb2FkZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJBZGRyZXNzIHZhbGlkYXRpb24gaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkVuYWJsZSBHb29nbGUgTWFwIGZvciBhZGRyZXNzIHZhbGlkYXRpb24/IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFkZHJlc3MiLCBBbHBhY2EuRmllbGRzLkFkZHJlc3NGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY2tlZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ja2VkaXRvcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ja2VkaXRvciA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gcmVuZGVyIENLIEVkaXRvcgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKENLRURJVE9SKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZyB3aXRoIENLRWRpdG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBDS0VESVRPUi5yZXBsYWNlKCQoc2VsZi5jb250cm9sKVswXSwgc2VsZi5vcHRpb25zLmNrZWRpdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRDS0VkaXRvckV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNrZWRpdG9yJ3MgZG9tIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQsIG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cCB0aGUgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbW92ZUFsbExpc3RlbmVycygpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBoZXJlIGJlY2F1c2UgQ0tFZGl0b3IgaGFzIGFuIGlzc3VlIGlmIERPTSBlbGVtZW50IGRlbGV0ZXMgYmVmb3JlIENLRWRpdG9yIGNsZWFucyB1cAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9sZW1vbmRlL2FuZ3VsYXItY2tlZGl0b3IvaXNzdWVzLzcKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgc2VsZi5lZGl0b3IuZGVzdHJveShmYWxzZSk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGluaXRDS0VkaXRvckV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gYmx1ciBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmb2N1cyBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImZvY3VzIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlwcmVzcyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTk9URTogdGhlc2UgZG8gbm90IHNlZW0gdG8gd29yayB3aXRoIENLRWRpdG9yPwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBrZXl1cCBldmVudAogICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXl1cCIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgIC8vIGtleWRvd24gZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5ZG93biIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXREYXRhKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldERhdGEoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNLIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgYSBDSyBFZGl0b3IgY29udHJvbCBmb3IgdXNlIGluIGVkaXRpbmcgSFRNTC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJja2VkaXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNLIEVkaXRvciBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVzZSB0aGlzIGVudHJ5IHRvIHByb3ZpZGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIENLRWRpdG9yIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY2tlZGl0b3IiLCBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBVc2VzIHRoZSBzcGVjdHJ1bSBwbHVnaW4gdG8gcHJvdmlkZSBhIGNvbG9yIHBpY2tlci4KICogVGhpcyB1c2VkIHRvIHJlbHkgb24gSFRNTDUgYnV0IG5vIGxvbmdlci4KICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ29sb3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ29sb3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5zcGVjdHJ1bUF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHR5cGVvZigkLmZuLnNwZWN0cnVtKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bSkgPT09ICJ1bmRlZmluZWQiICYmIHNlbGYuc3BlY3RydW1BdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIGlmIChzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKXsKICAgICAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd0lucHV0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93UGFsZXR0ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93UGFsZXR0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5wcmVmZXJyZWRGb3JtYXQpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0ID0gImhleDMiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5jbGlja291dEZpcmVzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb2xvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgc3BlY3RydW0gcGx1Z2luLi4uCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSAmJiBzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgoc2VsZi5jb250cm9sKVswXSkuc3BlY3RydW0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoeyBjb2xvcjogc2VsZi5kYXRhIH0sIHNlbGYub3B0aW9ucy5zcGVjdHJ1bSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oJ2NoYW5nZS5zcGVjdHJ1bScsIGZ1bmN0aW9uKGUsIHRpbnljb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5jb252ZXJ0VGlueUNvbG9yKHRpbnljb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VGlueUNvbG9yOiBmdW5jdGlvbih0aW55Y29sb3IpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGlueWNvbG9yLnRvSGV4U3RyaW5nKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ29sb3IgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQSBjb2xvciBwaWNrZXIgZm9yIHNlbGVjdGluZyBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY29sb3IiLCBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygiY29sb3IiLCAiY29sb3IiKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlczogaHR0cHM6Ly9tam9sbmljLmNvbS9ib290c3RyYXAtY29sb3JwaWNrZXIvCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yUGlja2VyRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yUGlja2VyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5jb2xvcnBpY2tlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlciA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIuY29sb3IgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3JwaWNrZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLmNvbG9ycGlja2VyKHNlbGYub3B0aW9ucy5jb2xvcnBpY2tlcik7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2VDb2xvci5jb2xvcnBpY2tlcicsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoZXZlbnQuY29sb3IudG9IZXgoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ29sb3IgUGlja2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9ycGlja2VyIiwgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCA9IEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvdW50cnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IFtdOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub3B0aW9uTGFiZWxzID0gW107CgogICAgICAgICAgICB2YXIgY291bnRyaWVzTWFwID0gdGhpcy5nZXRNZXNzYWdlKCJjb3VudHJpZXMiKTsKICAgICAgICAgICAgaWYgKGNvdW50cmllc01hcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY291bnRyeUtleSBpbiBjb3VudHJpZXNNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXS5wdXNoKGNvdW50cnlLZXkpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBjb3VudHJpZXNNYXBbY291bnRyeUtleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ291bnRyeSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGRyb3Bkb3duIHNlbGVjdG9yIG9mIGNvdW50cmllcyBrZXllZCBieSB0aGVpciBJU08zIGNvZGUuICBUaGUgbmFtZXMgb2YgdGhlIGNvdW50cmllcyBhcmUgcmVhZCBmcm9tIHRoZSBJMThOIGJ1bmRsZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNhcGl0YWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgdmFsdWVzIHNob3VsZCBiZSBjYXBpdGFsaXplZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJjYXBpdGFsaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY291bnRyeSIsIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImNvdW50cnkiLCAiY291bnRyeSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIHJvdW5kID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJhdGVnaWVzID0gewogICAgICAgICAgICB1cDogICAgICBNYXRoLmNlaWwsCiAgICAgICAgICAgIGRvd246ICAgIGZ1bmN0aW9uKGlucHV0KSB7IHJldHVybiB+fmlucHV0OyB9LAogICAgICAgICAgICBuZWFyZXN0OiBNYXRoLnJvdW5kCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyYXRlZ3kpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWdpZXNbc3RyYXRlZ3ldOwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkN1cnJlbmN5RmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkN1cnJlbmN5RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBhdWdtZW50cyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZAogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIEN1cnJlbmN5IENvbnRyb2wKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWluZXIgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIEZpZWxkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgIHZhciBwZk9wdGlvbnNTY2hlbWEgPSB0aGlzLmdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zKCkucHJvcGVydGllczsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwZk9wdGlvbnNTY2hlbWEpIHsKICAgICAgICAgICAgICAgIHZhciBvcHRpb24gPSBwZk9wdGlvbnNTY2hlbWFbaV07CiAgICAgICAgICAgICAgICBpZiAoIShpIGluIG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tpXSA9IG9wdGlvblsiZGVmYXVsdCJdIHx8IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihkYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEgPSAiIiArIHBhcnNlRmxvYXQoZGF0YSkudG9GaXhlZChvcHRpb25zLmNlbnRzTGltaXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImN1cnJlbmN5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgJChmaWVsZCkucHJpY2VGb3JtYXQoc2VsZi5vcHRpb25zKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgICAgIHZhciB2YWwgPSAkKGZpZWxkKS5pcygnaW5wdXQnKSA/IGZpZWxkLnZhbCgpIDogZmllbGQuaHRtbCgpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVubWFzayB8fCB0aGlzLm9wdGlvbnMucm91bmQgIT09ICJub25lIikgewogICAgICAgICAgICAgICAgdmFyIHVubWFza2VkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXIgPSB2YWxbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oY3VyKSB8fCBjdXIgPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGN1cjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXIgPT09IHRoaXMub3B0aW9ucy5jZW50c1NlcGFyYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcuJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChyZXN1bHQpOwogICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgICAgICB1bm1hc2tlZCA9IHJvdW5kKHRoaXMub3B0aW9ucy5yb3VuZCkodW5tYXNrZWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVubWFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZFN0cmluZyA9ICIiICsgdW5tYXNrZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB1ID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWxbaV0pIHx8IHZhbFtpXSA9PT0gIi0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5tYXNrZWRTdHJpbmdbdSsrXSB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDdXJyZW5jeSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBhdXRvbWF0aWNhbGx5IGZvcm1hdHRlZCBhbmQgY29uZmlndXJhYmxlIGlucHV0IGZvciBlbnRlcmluZyBjdXJyZW5jeSBhbW91bnRzLiI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2NoZW1hT2ZQcmljZUZvcm1hdE9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBOZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIG5lZ2F0aXZlIG51bWJlcnMgYXJlIGFsbG93ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c0xpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxpbWl0IG9mIGZyYWN0aW9uYWwgZGlnaXRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDZW50cyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHdob2xlIGFuZCBmcmFjdGlvbmFsIGFtb3VudHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIi4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJQcmVmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDbGVhciBQcmVmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiB0aGUgcHJlZml4IGlzIGNsZWFyZWQgb24gYmx1ci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyU3VmZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgU3VmZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHN1ZmZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnNlcnRQbHVzU2lnbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBsdXMgU2lnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIGEgcGx1cyBzaWduIHNob3VsZCBiZSBpbnNlcnRlZCBmb3IgcG9zaXRpdmUgdmFsdWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpbWl0IG9mIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwcmVmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcmVmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHByZWZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiJCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIGZpZWxkIGlzIHJvdW5kZWQuIChSb3VuZGluZyBpcyBkb25lIHdoZW4gZ2V0VmFsdWUgaXMgY2FsbGVkIGFuZCBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBVSSkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsgInVwIiwgImRvd24iLCAibmVhcmVzdCIsICJub25lIiBdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJub25lIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc3VmZml4IGlmIGFueSBmb3IgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidGhvdXNhbmRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGhvdXNhbmRzIFNlcGFyYXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc2VwYXJhdG9yIGJldHdlZW4gdGhvdXNhbmRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidW5tYXNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVW5tYXNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUgdGhlbiB0aGUgcmVzdWx0aW5nIHZhbHVlIGZvciB0aGlzIGZpZWxkIHdpbGwgYmUgdW5tYXNrZWQuICBUaGF0IGlzLCB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpbGwgYmUgYSBmbG9hdCBpbnN0ZWFkIG9mIGEgc3RyaW5nICh3aXRoIHRoZSBwcmVmaXgsIHN1ZmZpeCwgZXRjLiByZW1vdmVkKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB0aGlzLmdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dOZWdhdGl2ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJvdW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3VmZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImN1cnJlbmN5IiwgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIE5PVEU6IHRoaXMgcmVxdWlyZXMgYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLmpzCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIG1vbWVudC5qcwoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImRhdGUiOwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0OwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRFeHRyYUZvcm1hdHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZGF0ZSI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAiZGF0ZSI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlciA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5waWNrZXIudXNlQ3VycmVudCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGF0ZSBmb3JtYXQKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IHNlbGYuZ2V0RGVmYXVsdEZvcm1hdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0ID0gc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5sb2NhbGUpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlID0gQWxwYWNhLmRlZmF1bHRMb2NhbGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmRheVZpZXdIZWFkZXJGb3JtYXQgPSAiTU1NTSBZWVlZIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXh0cmEgZm9ybWF0cwogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKSB7CiAgICAgICAgICAgICAgICB2YXIgZXh0cmFGb3JtYXRzID0gc2VsZi5nZXREZWZhdWx0RXh0cmFGb3JtYXRzKCk7CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFGb3JtYXRzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5leHRyYUZvcm1hdHMgPSBleHRyYUZvcm1hdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1hbnVhbEVudHJ5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxFbnRyeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxFbnRyeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZmllbGQuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAhPT0gImRpc3BsYXkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLmRhdGV0aW1lcGlja2VyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRDb250cm9sRWwoKS5kYXRldGltZXBpY2tlcihzZWxmLm9wdGlvbnMucGlja2VyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlja2VyID0gc2VsZi5nZXRDb250cm9sRWwoKS5kYXRhKCJEYXRlVGltZVBpY2tlciIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIgJiYgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlja2VyLmZvcm1hdChzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IHNlbGYucGlja2VyLmZvcm1hdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGRhdGUtdGltZSBwaWNrZXIsIHRyaWdnZXIgY2hhbmdlIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5vbigiZHAuY2hhbmdlIiwgZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBpZiBwcm92aWRlZAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5kYXRlKHNlbGYuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFsbG93cyBtYW51YWwgZW50cnkgbW9kZSB0byBiZSB0b2dnbGVkIG9uIGFuZCBvZmYuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbWFudWFsRW50cnkKICAgICAgICAgKi8KICAgICAgICBzZXRNYW51YWxFbnRyeTogZnVuY3Rpb24obWFudWFsRW50cnkpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFudWFsRW50cnkgPSBtYW51YWxFbnRyeTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGdldERhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkYXRlID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRlID0gKHNlbGYucGlja2VyLmRhdGUoKSA/IHNlbGYucGlja2VyLmRhdGUoKS5fZDogbnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkYXRlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdmFsdWUgYXMgYSBKYXZhU2NyaXB0IERhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7RGF0ZX0gRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIGlzQXV0b0ZvY3VzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGF0ZUZvcm1hdCgpOwogICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkRGF0ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZERhdGUiKSwgW3RoaXMub3B0aW9ucy5kYXRlRm9ybWF0XSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkRGF0ZSJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGF0ZSBmb3JtYXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIGRhdGUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEYXRlRm9ybWF0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBzZWxmLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBmb3JtYXRzCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVGb3JtYXRzID0gW107CiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5waWNrZXIgJiYgc2VsZi5vcHRpb25zLnBpY2tlci5leHRyYUZvcm1hdHMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0cy5wdXNoKHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkIHx8IEFscGFjYS5tb21lbnQodmFsdWUsIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5tb21lbnQodmFsdWUsIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuZGF0ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMucGlja2VyID0gbnVsbDsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJEYXRlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImRhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSIgOiBbImRhdGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5Ijp0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGVGb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEYXRlIEZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRlIGZvcm1hdCAodXNpbmcgbW9tZW50LmpzIGZvcm1hdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicGlja2VyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZXRpbWVQaWNrZXIgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGEgaHJlZj0naHR0cDovL2VvbmFzZGFuLmdpdGh1Yi5pby9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvJz5Cb290c3RyYXAgRGF0ZVRpbWUgUGlja2VyPC9hPi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGVGb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicGlja2VyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZERhdGUiOiAiSW52YWxpZCBkYXRlIGZvciBmb3JtYXQgezB9IgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJkYXRlIiwgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZSIsICJkYXRlIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGV0aW1lRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImRhdGV0aW1lIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdCArICIgIiArIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldERlZmF1bHRFeHRyYUZvcm1hdHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIGhoOm1tOnNzIGEiLAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdCArICIgSEg6bW0iLAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGV0aW1lIjsKICAgICAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAiZGF0ZXRpbWUiOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiRGF0ZXRpbWUgRmllbGQiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiRGF0ZXRpbWUgRmllbGQgYmFzZWQgb24gPGEgaHJlZj0naHR0cDovL2VvbmFzZGFuLmdpdGh1Yi5pby9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvJz5Cb290c3RyYXAgRGF0ZVRpbWUgUGlja2VyPC9hPi4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZXRpbWUiLCBBbHBhY2EuRmllbGRzLkRhdGV0aW1lRmllbGQpOwoKICAgIC8vICJkYXRldGltZSIgaXMgbGVnYWN5IChwcmUgdjQgc2NoZW1hKQogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZXRpbWUiLCAiZGF0ZXRpbWUiKTsKCiAgICAvLyBvZmZpY2lhbCB2NCB1c2VzIGRhdGUtdGltZQogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZS10aW1lIiwgImRhdGV0aW1lIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5FZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5hY2VUaGVtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZVRoZW1lID0gImFjZS90aGVtZS9jaHJvbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5hY2VNb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYWNlTW9kZSA9ICJhY2UvbW9kZS9qc29uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYmVhdXRpZnkpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVhdXRpZnkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmJlYXV0aWZ5ICYmIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKHRoaXMuZGF0YSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIHN0cmluZyB0byBmb3JtYXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0aGlzLmRhdGEpLCBudWxsLCAiICAgICIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9odG1sIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGh0bWxfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGh0bWxfYmVhdXRpZnkodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvY3NzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGNzc19iZWF1dGlmeSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gY3NzX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2phdmFzY3JpcHQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoanNfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGpzX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qc29uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhID09PSAie30iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICJ7XG5cdFxufSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gQUNFIEhFSUdIVAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VIZWlnaHQgPSBzZWxmLm9wdGlvbnMuYWNlSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIGlmIChhY2VIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJoZWlnaHQiLCBhY2VIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQUNFIFdJRFRICiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVdpZHRoID0gc2VsZi5vcHRpb25zLmFjZVdpZHRoOwogICAgICAgICAgICAgICAgICAgIGlmICghYWNlV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWNlV2lkdGggPSAiMTAwJSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoIndpZHRoIiwgYWNlV2lkdGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGxvY2F0ZSB3aGVyZSB3ZSB3aWxsIGluc2VydCB0aGUgZWRpdG9yCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHNlbGYuY29udHJvbClbMF07CgogICAgICAgICAgICAgICAgLy8gYWNlIG11c3QgYmUgaW5jbHVkZWQgYWhlYWQgb2YgdGltZQogICAgICAgICAgICAgICAgaWYgKCFhY2UgJiYgd2luZG93LmFjZSkgewogICAgICAgICAgICAgICAgICAgIGFjZSA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFhY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFZGl0b3IgRmllbGQgaXMgbWlzc2luZyB0aGUgJ2FjZScgQ2xvdWQgOSBFZGl0b3IiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IGFjZS5lZGl0KGVsKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRPcHRpb25zKHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGluZXM6IEluZmluaXR5CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXcmFwTW9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbWUKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlVGhlbWUgPSBzZWxmLm9wdGlvbnMuYWNlVGhlbWU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VGhlbWUoYWNlVGhlbWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZU1vZGUgPSBzZWxmLm9wdGlvbnMuYWNlTW9kZTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShhY2VNb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGUoZmFsc2UpOyAvLyBub3QgaW1wbGVtZW50ZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBvbnRvIGVkaXRvcgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHVuZG8gc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEZJVC1DT05URU5UIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciB0byB0aGUgY29udGVudHMgY29udGFpbmVkIHdpdGhpbgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlRml0Q29udGVudEhlaWdodCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHRVcGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExNTg0MDYxLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0hlaWdodCA9IHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRTY3JlZW5MZW5ndGgoKSAqIHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgKyBzZWxmLmVkaXRvci5yZW5kZXJlci5zY3JvbGxCYXIuZ2V0V2lkdGgoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuaGVpZ2h0KG5ld0hlaWdodC50b1N0cmluZygpICsgInB4Iik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsIGlzIHJlcXVpcmVkIGZvciB0aGUgZWRpdG9yIHRvIGZpeCBhbGwgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbm5lciBzdHJ1Y3R1cmUgZm9yIGFkYXB0aW5nIHRvIGEgY2hhbmdlIGluIHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlc2l6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgc2l6ZSB0byBtYXRjaCBpbml0aWFsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0VXBkYXRlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW5ldmVyIGEgY2hhbmdlIGhhcHBlbnMgaW5zaWRlIHRoZSBBQ0UgZWRpdG9yLCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNpemUgYWdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLm9uKCdjaGFuZ2UnLCBoZWlnaHRVcGRhdGVGdW5jdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSRUFET05MWQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFJlYWRPbmx5KHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBleHBlY3QgQWxwYWNhIGZpZWxkcyB0byBiZSBkZXN0cm95ZWQgYnkgdGhlIGRlc3Ryb3koKSBtZXRob2QgYnV0IHRoZXkgbWF5IGFsc28gYmUKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmVkLXVwIHZpYSB0aGUgRE9NLCB0aHVzIHdlIGNoZWNrIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgJChlbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHRoZSBBQ0UgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICovCiAgICAgICAgZ2V0RWRpdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciB3b3JkQ291bnRTdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVXb3JkQ291bnQoKTsKICAgICAgICAgICAgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogd29yZENvdW50U3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoIndvcmRMaW1pdEV4Y2VlZGVkIiksIFt0aGlzLm9wdGlvbnMud29yZGxpbWl0XSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogd29yZENvdW50U3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZWRpdG9yQW5ub3RhdGlvbnNTdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVkaXRvckFubm90YXRpb25zKCk7CiAgICAgICAgICAgIHZhbEluZm9bImVkaXRvckFubm90YXRpb25zRXhpc3QiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZWRpdG9yQW5ub3RhdGlvbnNTdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIF92YWxpZGF0ZUVkaXRvckFubm90YXRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhbm5vdGF0aW9ucyA9IHRoaXMuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRBbm5vdGF0aW9ucygpOwogICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25zICYmIGFubm90YXRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBmb3Igd29yZCBsaW1pdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXIgb2Ygd29yZHMgaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIHRoZSB3b3JkIGxpbWl0LgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVdvcmRDb3VudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53b3JkbGltaXQgJiYgdGhpcy5vcHRpb25zLndvcmRsaW1pdCA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAodmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB3b3JkY291bnQgPSB2YWwuc3BsaXQoIiAiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRjb3VudCA+IHRoaXMub3B0aW9ucy53b3JkbGltaXQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb3JjZSBlZGl0b3IgdG8gcmVzaXplIHRvIGVuc3VyZSBpdCBnZXRzIGRyYXduIGNvcnJlY3RseS4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5yZXNpemUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIgJiYgQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAiICAgICIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgZXhwZWN0ZWQgdHlwZSBiYWNrIGlzICJvYmplY3QiLCB3ZSBkbyB0aGUgY29udmVyc2lvbgogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEudHlwZSA9PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgVGhlbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSB0aGVtZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL3RoZW1lL3R3aWxpZ2h0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZU1vZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIE1vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBtb2RlIHRvIHNldCBvbnRvIHRoZSBlZGl0b3IgaW5zdGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJhY2UvbW9kZS9qYXZhc2NyaXB0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZVdpZHRoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgd3JhcHBpbmcgZGl2IGFyb3VuZCB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiMTAwJSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIEhlaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgd3JhcHBpbmcgZGl2IGFyb3VuZCB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiMzAwcHgiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlRml0Q29udGVudEhlaWdodCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBGaXQgQ29udGVudCBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJlcyB0aGUgQUNFIEVkaXRvciB0byBhdXRvLWZpdCBpdHMgaGVpZ2h0IHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXb3JkIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpbWl0cyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFsbG93ZWQgaW4gdGhlIHRleHQgYXJlYS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFjZVRoZW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZU1vZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iLAogICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIlRoZSBlZGl0b3IgaGFzIGVycm9ycyBpbiBpdCB0aGF0IG11c3QgYmUgY29ycmVjdGVkIgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5FZGl0b3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVtYWlsIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJlbWFpbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImVtYWlsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZEVtYWlsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVtYWlsIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVtYWlsIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKSA/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5lbWFpbDsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJlbWFpbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbImVtYWlsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRFbWFpbCI6ICJJbnZhbGlkIEVtYWlsIGFkZHJlc3MgZS5nLiBpbmZvQGNsb3VkY21zLmNvbSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZW1haWwiLCBBbHBhY2EuRmllbGRzLkVtYWlsRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZW1haWwiLCAiZW1haWwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImdyaWQiOwogICAgICAgIH0sCgogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmdyaWQpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ3JpZCA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgZGF0YSBhcnJheSBpbnRvIHRoZSBncmlkJ3MgZXhwZWN0ZWQgZm9ybWF0CiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgaW4gaGVhZGVycwogICAgICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZERlZmluaXRpb24gPSBzZWxmLm9wdGlvbnMuZmllbGRzW2tleV07CgogICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGtleTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGREZWZpbml0aW9uLmxhYmVsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBmaWVsZERlZmluaXRpb24ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1c2gobGFiZWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChoZWFkZXJzKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5MiBpbiBzZWxmLmRhdGFbaV0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByb3cucHVzaChzZWxmLmRhdGFbaV1ba2V5Ml0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5wdXNoKHJvdyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgIHZhciBncmlkRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICBbIk1hc2VyYXRpIiwgIk1hemRhIiwgIk1lcmNlZGVzIiwgIk1pbmkiLCAiTWl0c3ViaXNoaSJdLAogICAgICAgICAgICAgICAgICAgIFsiMjAwOSIsIDAsIDI5NDEsIDQzMDMsIDM1NCwgNTgxNF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDEwIiwgNSwgMjkwNSwgMjg2NywgNDEyLCA1Mjg0XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTEiLCA0LCAyNTE3LCA0ODIyLCA1NTIsIDYxMjddLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMiIsIDIsIDI0MjIsIDUzOTksIDc3NiwgNDE1MV0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKHNlbGYuY29udGFpbmVyKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1ncmlkLWhvbGRlciIpOwoKICAgICAgICAgICAgICAgIHZhciBncmlkQ29uZmlnID0gc2VsZi5vcHRpb25zLmdyaWQ7CiAgICAgICAgICAgICAgICBncmlkQ29uZmlnLmRhdGEgPSBncmlkRGF0YTsKCiAgICAgICAgICAgICAgICAkKGhvbGRlcikuaGFuZHNvbnRhYmxlKGdyaWRDb25maWcpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiR3JpZCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgYXJyYXkgaXRlbXMgaW50byBhIGdyaWQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZ3JpZCIsIEFscGFjYS5GaWVsZHMuR3JpZEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW1hZ2UiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkltYWdlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkltYWdlIEZpZWxkLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpbWFnZSIsIEFscGFjYS5GaWVsZHMuSW1hZ2VGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbnRlZ2VyRmllbGQgPSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjb25DaGFuZ2UKICAgICAgICAgKi8KICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlci5zbGlkZXIoInZhbHVlIiwgdGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zbGlkZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhpbXVtKSAmJiAhQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluaW11bSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWZ0ZXIoJzxkaXYgaWQ9InNsaWRlciI+PC9kaXY+Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zbGlkZXIgPSAkKCcjc2xpZGVyJywgc2VsZi5jb250cm9sLnBhcmVudCgpKS5zbGlkZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxmLmdldFZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBzZWxmLnNjaGVtYS5taW5pbXVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogc2VsZi5zY2hlbWEubWF4aW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodWkudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlSW50ZWdlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBbkludGVnZXIiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhbiBpbnRlZ2VyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYW4gaW50ZWdlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUludGVnZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBhcyB0ZXh0CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGV4dFZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRleHRWYWx1ZSA9ICIiICsgdGV4dFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbGxvdyBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbGlkIGludGVnZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMuaW50ZWdlciwgdGV4dFZhbHVlKTsKICAgICAgICAgICAgaWYgKCF2YWxpZE51bWJlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBxdWljayBjaGVjayB0byBzZWUgaWYgd2hhdCB0aGV5IGVudGVyZWQgd2FzIGEgbnVtYmVyCiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAoaXNOYU4oZmxvYXRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJpbnRlZ2VyIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkludGVnZXIgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgaW50ZWdlcnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpdmlzaWJsZSBCeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNYXhpbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpdmlzaWJsZUJ5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIlByb3BlcnR5IHZhbHVlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHRoaXMgbnVtYmVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2xpZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2xpZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdlbmVyYXRlIGpRdWVyeSBVSSBzbGlkZXIgY29udHJvbCB3aXRoIHRoZSBmaWVsZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2xpZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJTbGlkZXIgY29udHJvbCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJHZW5lcmF0ZSBzbGlkZXIgY29udHJvbCBpZiBzZWxlY3RlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyLiIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW50ZWdlciIsIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImludGVnZXIiLCAiaW50ZWdlciIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaXB2NCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmlwdjQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZElQdjQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJUCBBZGRyZXNzIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IEFscGFjYS5yZWdleHBzLmlwdjQ7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJpcC1hZGRyZXNzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiaXAtYWRkcmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSx7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZElQdjQiOiAiSW52YWxpZCBJUHY0IGFkZHJlc3MsIGUuZy4gMTkyLjE2OC4wLjEiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImlwdjQiLCBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJpcC1hZGRyZXNzIiwgImlwdjQiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkpTT05GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkpTT05GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAianNvbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSB8fCB0eXBlb2YodmFsdWUpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IEpTT04ucGFyc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUpTT04oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QUpTT04iXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzLnN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBSlNPTiIpICsiICIrIHN0YXR1cy5tZXNzYWdlLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cy5zdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl1bInN0YXR1cyJdIDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIEpTT04gb2JqZWN0CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlSlNPTjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRleHRWYWx1ZSA9IHRoaXMuY29udHJvbC52YWwoKTsKCiAgICAgICAgICAgIC8vIGFsbG93IG51bGwKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIgOiB0cnVlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBwYXJzZSB0aGUgc3RyaW5nCiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZSh0ZXh0VmFsdWUpOwoKICAgICAgICAgICAgICAgIC8vIGZvcm1hdCB0aGUgc3RyaW5nIGFzIHdlbGwKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiIDogZS5tZXNzYWdlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgYXV0by1mb3JtYXR0aW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5iaW5kKCdrZXlwcmVzcycsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlIHx8IGUud2ljaDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAzNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMTIzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuaW5zZXJ0QXRDYXJldCgnfScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSA5MSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCAnQ3RybCtsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNsYXNzIGZyb20gc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5hdHRyKCd0aXRsZScsJ1R5cGUgQ3RybCtMIHRvIGZvcm1hdCBhbmQgdmFsaWRhdGUgdGhlIEpTT04gc3RyaW5nLicpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkpTT04gRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IgZm9yIEpTT04gb2JqZWN0cyB3aXRoIGJhc2ljIHZhbGlkYXRpb24gYW5kIGZvcm1hdHRpbmcuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBSlNPTiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIHZhbGlkIEpTT04gc3RyaW5nLiIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImpzb24iLCBBbHBhY2EuRmllbGRzLkpTT05GaWVsZCk7CgogICAgJC5mbi5pbnNlcnRBdENhcmV0ID0gZnVuY3Rpb24gKG15VmFsdWUpIHsKCiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vSUUgc3VwcG9ydAogICAgICAgICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7CgogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgc2VsID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICBzZWwudGV4dCA9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CgogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgfHwgdGhpcy5zZWxlY3Rpb25TdGFydCA9PSAnMCcpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCgogICAgICAgICAgICAgICAgLy9NT1pJTExBIC8gTkVUU0NBUEUgc3VwcG9ydAogICAgICAgICAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zZWxlY3Rpb25TdGFydDsKICAgICAgICAgICAgICAgIHZhciBlbmRQb3MgPSB0aGlzLnNlbGVjdGlvbkVuZDsKICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydFBvcykgKyBteVZhbHVlICsgdGhpcy52YWx1ZS5zdWJzdHJpbmcoZW5kUG9zLCB0aGlzLnZhbHVlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnRQb3MgLyorIG15VmFsdWUubGVuZ3RoKi87CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gbXlWYWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICAvKgogICAgICogalF1ZXJ5IEhvdGtleXMgUGx1Z2luCiAgICAgKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogICAgICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAgICAgKgogICAgICogQmFzZWQgdXBvbiB0aGUgcGx1Z2luIGJ5IFR6dXJ5IEJhciBZb2NoYXk6CiAgICAgKiBodHRwOi8vZ2l0aHViLmNvbS90enVyeWJ5L2hvdGtleXMKICAgICAqCiAgICAgKiBPcmlnaW5hbCBpZGVhIGJ5OgogICAgICogQmlubnkgViBBLCBodHRwOi8vd3d3Lm9wZW5qcy5jb20vc2NyaXB0cy9ldmVudHMva2V5Ym9hcmRfc2hvcnRjdXRzLwogICAgKi8KICAgIGpRdWVyeS5ob3RrZXlzID0gewogICAgICAgIHZlcnNpb246ICIwLjgiLAoKICAgICAgICBzcGVjaWFsS2V5czogewogICAgICAgICAgICA4OiAiYmFja3NwYWNlIiwgOTogInRhYiIsIDEzOiAicmV0dXJuIiwgMTY6ICJzaGlmdCIsIDE3OiAiY3RybCIsIDE4OiAiYWx0IiwgMTk6ICJwYXVzZSIsCiAgICAgICAgICAgIDIwOiAiY2Fwc2xvY2siLCAyNzogImVzYyIsIDMyOiAic3BhY2UiLCAzMzogInBhZ2V1cCIsIDM0OiAicGFnZWRvd24iLCAzNTogImVuZCIsIDM2OiAiaG9tZSIsCiAgICAgICAgICAgIDM3OiAibGVmdCIsIDM4OiAidXAiLCAzOTogInJpZ2h0IiwgNDA6ICJkb3duIiwgNDU6ICJpbnNlcnQiLCA0NjogImRlbCIsCiAgICAgICAgICAgIDk2OiAiMCIsIDk3OiAiMSIsIDk4OiAiMiIsIDk5OiAiMyIsIDEwMDogIjQiLCAxMDE6ICI1IiwgMTAyOiAiNiIsIDEwMzogIjciLAogICAgICAgICAgICAxMDQ6ICI4IiwgMTA1OiAiOSIsIDEwNjogIioiLCAxMDc6ICIrIiwgMTA5OiAiLSIsIDExMDogIi4iLCAxMTEgOiAiLyIsCiAgICAgICAgICAgIDExMjogImYxIiwgMTEzOiAiZjIiLCAxMTQ6ICJmMyIsIDExNTogImY0IiwgMTE2OiAiZjUiLCAxMTc6ICJmNiIsIDExODogImY3IiwgMTE5OiAiZjgiLAogICAgICAgICAgICAxMjA6ICJmOSIsIDEyMTogImYxMCIsIDEyMjogImYxMSIsIDEyMzogImYxMiIsIDE0NDogIm51bWxvY2siLCAxNDU6ICJzY3JvbGwiLCAxOTE6ICIvIiwgMjI0OiAibWV0YSIKICAgICAgICB9LAoKICAgICAgICBzaGlmdE51bXM6IHsKICAgICAgICAgICAgImAiOiAifiIsICIxIjogIiEiLCAiMiI6ICJAIiwgIjMiOiAiIyIsICI0IjogIiQiLCAiNSI6ICIlIiwgIjYiOiAiXiIsICI3IjogIiYiLAogICAgICAgICAgICAiOCI6ICIqIiwgIjkiOiAiKCIsICIwIjogIikiLCAiLSI6ICJfIiwgIj0iOiAiKyIsICI7IjogIjogIiwgIiciOiAiXCIiLCAiLCI6ICI8IiwKICAgICAgICAgICAgIi4iOiAiPiIsICAiLyI6ICI/IiwgICJcXCI6ICJ8IgogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24ga2V5SGFuZGxlciggaGFuZGxlT2JqICkgewogICAgICAgIC8vIE9ubHkgY2FyZSB3aGVuIGEgcG9zc2libGUgaW5wdXQgaGFzIGJlZW4gc3BlY2lmaWVkCiAgICAgICAgaWYgKCB0eXBlb2YgaGFuZGxlT2JqLmRhdGEgIT09ICJzdHJpbmciICkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgb3JpZ0hhbmRsZXIgPSBoYW5kbGVPYmouaGFuZGxlciwKICAgICAgICAgICAga2V5cyA9IGhhbmRsZU9iai5kYXRhLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKTsKCiAgICAgICAgaGFuZGxlT2JqLmhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CiAgICAgICAgICAgIC8vIERvbid0IGZpcmUgaW4gdGV4dC1hY2NlcHRpbmcgaW5wdXRzIHRoYXQgd2UgZGlkbid0IGRpcmVjdGx5IGJpbmQgdG8KICAgICAgICAgICAgaWYgKCB0aGlzICE9PSBldmVudC50YXJnZXQgJiYgKC90ZXh0YXJlYXxzZWxlY3QvaS50ZXN0KCBldmVudC50YXJnZXQubm9kZU5hbWUgKSB8fAogICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC50eXBlID09PSAidGV4dCIpICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBLZXlwcmVzcyByZXByZXNlbnRzIGNoYXJhY3RlcnMsIG5vdCBzcGVjaWFsIGtleXMKICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBldmVudC50eXBlICE9PSAia2V5cHJlc3MiICYmIGpRdWVyeS5ob3RrZXlzLnNwZWNpYWxLZXlzWyBldmVudC53aGljaCBdLAogICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQud2hpY2ggKS50b0xvd2VyQ2FzZSgpLAogICAgICAgICAgICAgICAga2V5LCBtb2RpZiA9ICIiLCBwb3NzaWJsZSA9IHt9OwoKICAgICAgICAgICAgLy8gY2hlY2sgY29tYmluYXRpb25zIChhbHR8Y3RybHxzaGlmdCthbnl0aGluZykKICAgICAgICAgICAgaWYgKCBldmVudC5hbHRLZXkgJiYgc3BlY2lhbCAhPT0gImFsdCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAiYWx0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZXZlbnQuY3RybEtleSAmJiBzcGVjaWFsICE9PSAiY3RybCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAiY3RybCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHdvcmtzIGNvbnNpc3RlbnRseSBhY3Jvc3MgcGxhdGZvcm1zCiAgICAgICAgICAgIGlmICggZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuY3RybEtleSAmJiBzcGVjaWFsICE9PSAibWV0YSIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAibWV0YSsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LnNoaWZ0S2V5ICYmIHNwZWNpYWwgIT09ICJzaGlmdCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAic2hpZnQrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBzcGVjaWFsICkgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgc3BlY2lhbCBdID0gdHJ1ZTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwb3NzaWJsZVsgbW9kaWYgKyBjaGFyYWN0ZXIgXSA9IHRydWU7CiAgICAgICAgICAgICAgICBwb3NzaWJsZVsgbW9kaWYgKyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVlOwoKICAgICAgICAgICAgICAgIC8vICIkIiBjYW4gYmUgdHJpZ2dlcmVkIGFzICJTaGlmdCs0IiBvciAiU2hpZnQrJCIgb3IganVzdCAiJCIKICAgICAgICAgICAgICAgIGlmICggbW9kaWYgPT09ICJzaGlmdCsiICkgewogICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKICAgICAgICAgICAgICAgIGlmICggcG9zc2libGVbIGtleXNbaV0gXSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0hhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBqUXVlcnkuZWFjaChbICJrZXlkb3duIiwgImtleXVwIiwgImtleXByZXNzIiBdLCBmdW5jdGlvbigpIHsKICAgICAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdGhpcyBdID0geyBhZGQ6IGtleUhhbmRsZXIgfTsKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImxvd2VyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbG93ZXJWYWx1ZSA9IHZhbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgaWYgKGxvd2VyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGxvd2VyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTG93ZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgbG93ZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImxvd2VyY2FzZSIsIEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygibG93ZXJjYXNlIiwgImxvd2VyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTWFwRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5NYXBGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibWFwIjsKICAgICAgICB9LAoKICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCIKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIC0gZGF0YSBjYW4gY29tZSBpbiBhcyBhbiBvYmplY3QsIHdlIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiBBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kYXRhLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gQWxwYWNhLmNvcHlPZih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVbIl9rZXkiXSA9IGtleTsKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhLnB1c2gobmV3VmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3RGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAiZm9yY2VSZXZhbGlkYXRpb24iIDogdHJ1ZQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRDb250YWluZXJWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRhaW5lclZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiBhbmQgd2UncmUgbm90IHJlcXVpcmVkLCBoYW5kIGJhY2sgdW5kZWZpbmVkCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZywgY29udmVydCBiYWNrIHRvIG9iamVjdAogICAgICAgICAgICB2YXIgbyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZbIl9rZXkiXTsKICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5ID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzTm90RW1wdHkoKTsKICAgICAgICAgICAgdmFsSW5mb1sia2V5TWlzc2luZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5ID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImtleU1pc3NpbmciKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNVbmlxdWUgPSB0aGlzLl92YWxpZGF0ZU1hcEtleXNVbmlxdWUoKTsKICAgICAgICAgICAgdmFsSW5mb1sia2V5Tm90VW5pcXVlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGlzVmFsaWRNYXBLZXlzVW5pcXVlID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImtleU5vdFVuaXF1ZSIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IGlzVmFsaWRNYXBLZXlzVW5pcXVlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJrZXlNaXNzaW5nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgdGhhdCBrZXkgZmllbGRzIGFyZSBub3QgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSBub3QgZW1wdHkKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzTm90RW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gdlsiX2tleSJdOwoKICAgICAgICAgICAgICAgIGlmICgha2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGtleSBmaWVsZHMgYXJlIHVuaXF1ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGtleXMgYXJlIHVuaXF1ZQogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1hcEtleXNVbmlxdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgIHZhciBrZXlzID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gdlsiX2tleSJdOwoKICAgICAgICAgICAgICAgIGlmIChrZXlzW2tleV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IGtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk1hcCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIG9iamVjdHMgd2l0aCBrZXkvdmFsdWUgcGFpcnMgdGhhdCBzaGFyZSB0aGUgc2FtZSBzY2hlbWEgZm9yIHZhbHVlcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibWFwIiwgQWxwYWNhLkZpZWxkcy5NYXBGaWVsZCk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImtleU5vdFVuaXF1ZSI6ICJLZXlzIG9mIG1hcCBmaWVsZCBhcmUgbm90IHVuaXF1ZS4iLAogICAgICAgICJrZXlNaXNzaW5nIjogIk1hcCBjb250YWlucyBhbiBlbXB0eSBrZXkuIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWUucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvcHRpb250cmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5vcmRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUub3JkZXIgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIGFsbCBvcHRpb25zIGhhdmUgc2NoZW1hCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5zY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk9wdGlvblRyZWUgc2VsZWN0b3IgZm9yOiAiICsgayArICIgaXMgbWlzc2luZyBzY2hlbWEiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIGRhdGEKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMudHJlZS5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMub3B0aW9ucy50cmVlLmRhdGFbaV07CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGl0ZW0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5vcHRpb25zLm5vbmVMYWJlbCA9ICJDaG9vc2UuLi4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgb3JkZXIgZnJvbSB0aGUgb3B0aW9ucyBpZiBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyID0gW107CgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIucHVzaChzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGxvb2t1cCBsaXN0IGZvciBvcHRpb24gbGlzdCBrZXkvdmFsdWUgYmFzZWQgb24gbG9jYXRpb24KICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlcyA9IHt9OwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlc1trXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzW2xvY2F0aW9uXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzW2xvY2F0aW9uXSA9IGFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJyYXkubGVuZ3RoOyB4KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVt4XS52YWx1ZSA9PT0gdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlc1tsb2NhdGlvbl0gPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSB7fTsKICAgICAgICB9LAoKICAgICAgICB0b0xvY2F0aW9uOiBmdW5jdGlvbihhdHRycykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gYXR0cnNba107CgogICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gayArICI9IiArIHY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjsKICAgICAgICB9LAoKICAgICAgICBleGlzdHNMb2NhdGlvbldpdGhQcmVmaXg6IGZ1bmN0aW9uKHByZWZpeCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGZhbHNlOwoKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZihwcmVmaXgpID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250cm9sCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYub3B0aW9uVHJlZUhvbGRlciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLm9wdGlvbnRyZWUiKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmFkZENsYXNzKCJvcHRpb250cmVlLWhvcml6b250YWwiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHMoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaE9wdGlvblRyZWVDb250cm9sczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBoaWRlIGFsbCBvZiB0aGUgY29udHJvbHMKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLmNvbnRyb2xzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW2tdLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb3B0aW9uIGZvciB3aGljaCB3ZSBhcmUgbWlzc2luZyBhIHZhbHVlCiAgICAgICAgICAgIHZhciBkaXNwbGF5VXBUb0luZGV4ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSBzZWxmLm9wdGlvbnMudHJlZS5vcmRlcltpXTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0pICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdICE9PSBudWxsICAmJiBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdICE9PSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VXBUb0luZGV4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBvcmRlciBhbmQgY29uc3RydWN0IHJlbmRlciBmdW5jdGlvbnMKICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gInJvb3QiOwogICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgIHZhciBkaXNwbGF5Q291bnQgPSAwOwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBoYXNNYXRjaGVzID0gKGkgPT0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoIC0gMSkgfHwgKHNlbGYuZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4KGxvY2F0aW9uICsgIn4iICsgc2VsZWN0b3JJZCArICI9IikpOwogICAgICAgICAgICAgICAgICAgIGlmIChoYXNNYXRjaGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlDb3VudCA8PSBkaXNwbGF5VXBUb0luZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9ICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIgKyBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IHNlbGYub3B0aW9ucy50cmVlLnNlbGVjdG9yc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IChpICsgMSA9PT0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oaW5kZXgsIHNlbGVjdG9ySWQsIHNlbGVjdG9yLCBjb250cm9scywgb3B0aW9uVHJlZUhvbGRlciwgbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FTY2hlbWEgPSBzZWxlY3Rvci5zY2hlbWE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYU9wdGlvbnMgPSBzZWxlY3Rvci5vcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHBhY2FPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHBhY2FPcHRpb25zLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FPcHRpb25zLnR5cGUgPSAic2VsZWN0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhT3B0aW9ucy50eXBlID09PSAic2VsZWN0IikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FPcHRpb25zLmRhdGFTb3VyY2UgPSBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRMb2NhdGlvbiA9IHNlbGYudG9Mb2NhdGlvbihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZUxpc3QgPSBzZWxmLmxvY2F0aW9uVmFsdWVMaXN0c1tjdXJyZW50TG9jYXRpb25dOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY3VycmVudFZhbHVlTGlzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHZpYSBhbHBhY2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21FbCA9ICQoIjxkaXYgY2xhc3M9J29wdGlvbnRyZWUtc2VsZWN0b3InPjwvZGl2PiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9tRWwpLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaGVtYSI6IGFscGFjYVNjaGVtYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGFscGFjYU9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiBmdW5jdGlvbihjb250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sc1tzZWxlY3RvcklkXSA9IGNvbnRyb2w7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgdG8gdGhlIGhvbGRlciBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQob3B0aW9uVHJlZUhvbGRlcikuYXBwZW5kKGRvbUVsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0b3JJZCA9IHNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnRyb2wgY2hhbmdlcywgd2UgcmVjb3JkIGl0IGludG8gb3VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYXR0cmlidXRlIHNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHRoaXMuc2VsZWN0b3JJZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb3VyIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgZXZlcnl0aGluZyBwYXN0IG91ciBpbmRleCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSBzZWxmLm9wdGlvbnMudHJlZS5vcmRlcltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jdXJyZW50QXR0cmlidXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2tdICE9PSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW2tdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpLCBzZWxlY3RvcklkLCBzZWxlY3Rvciwgc2VsZi5jb250cm9scywgc2VsZi5vcHRpb25UcmVlSG9sZGVyLCBsYXN0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5zLnB1c2goZm4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICBBbHBhY2Euc2VyaWVzKGZucywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPcHRpb24gVHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRyZWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvcml6b250YWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygib3B0aW9udHJlZSIsIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlBhc3N3b3JkRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlBhc3N3b3JkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGFzc3dvcmQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5wYXNzd29yZDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGFzc3dvcmQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGFzc3dvcmQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGFzc3dvcmQgRmllbGQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnBhdHRlcm4pPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogL15bMC05YS16QS1aXHgyMC1ceDdFXSokLzsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0aGlzLnNjaGVtYS5wYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKCQkJCQkiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKCQkJCQkJImRlZmF1bHQiOiJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbInBhc3N3b3JkIl0sCgkJCQkJCSJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KCQlnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSx7CgkJCQkiZmllbGRzIjogewoJCQkJCSJmb3JtYXQiOiB7CgkJCQkJCSJ0eXBlIjogInRleHQiCgkJCQkJfQoJCQkJfQoJCQl9KTsKICAgICAgICB9CgoJCS8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIkludmFsaWQgUGFzc3dvcmQiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBhc3N3b3JkIiwgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBhc3N3b3JkIiwgInBhc3N3b3JkIik7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlBlcnNvbmFsTmFtZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJwZXJzb25hbG5hbWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29udmVydCB0byB1cHBlci1jYXNlCiAgICAgICAgICAgIHZhciB1cHBlclZhbHVlID0gIiI7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWwuY2hhckF0KGkgLSAxKSA9PT0gJyAnIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAnLScgfHwgdmFsLmNoYXJBdChpIC0gMSkgPT09ICInIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1cHBlclZhbHVlICs9IHZhbC5jaGFyQXQoaSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1cHBlclZhbHVlICs9IHZhbC5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh1cHBlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh1cHBlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQZXJzb25hbCBOYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgRmllbGQgZm9yIHBlcnNvbmFsIG5hbWUgd2l0aCBjYXB0aWNhbCBsZXR0ZXIgZm9yIGZpcnN0IGxldHRlciAmIGFmdGVyIGh5cGhlbiwgc3BhY2Ugb3IgYXBvc3Ryb3BoZS4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGVyc29uYWxuYW1lIiwgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidGVsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidGVsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubWFza1N0cmluZykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tYXNrU3RyaW5nID0gIig5OTkpIDk5OS05OTk5IjsKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRQaG9uZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGhvbmUiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBob25lIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBob25lIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKSA/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5waG9uZTsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJwaG9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbInBob25lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgTWFzayBTdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwcmVzc2lvbiBmb3IgZmllbGQgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIig5OTkpIDk5OS05OTk5IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQaG9uZSI6ICJJbnZhbGlkIFBob25lIE51bWJlciwgZS5nLiAoMTIzKSA0NTYtOTk5OSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGhvbmUiLCBBbHBhY2EuRmllbGRzLlBob25lRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygicGhvbmUiLCAicGhvbmUiKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlczogaHR0cHM6Ly9naXRodWIuY29tL2JpbGx5YXJhdWpvL3BpY2stYS1jb2xvcgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5waWNrQUNvbG9yKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvcikgPT09ICJ1bmRlZmluZWQiICYmICFzZWxmLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBpY2thY29sb3IgPSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1NwZWN0cnVtICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93U2F2ZWRDb2xvcnMgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNhdmVDb2xvcnNQZXJFbGVtZW50ICA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGZhZGVNZW51VG9nZ2xlICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0FkdmFuY2VkICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93QmFzaWNDb2xvcnMgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dIZXhJbnB1dCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgYWxsb3dCbGFuayAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBpbmxpbmVEcm9wZG93biAgICAgICAgOiBmYWxzZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgY29sb3JzIG5vdCBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0IGNvbG9ycwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9ycyA9IHsKICAgICAgICAgICAgICAgICAgICB3aGl0ZTogIiNmZmZmZmYiLAogICAgICAgICAgICAgICAgICAgIGNsb3VkczogIiNlY2YwZjEiLAogICAgICAgICAgICAgICAgICAgIHJlZDogIiNjMDM5MmIiLAogICAgICAgICAgICAgICAgICAgIG9yYW5nZTogIiNlNjdlMjIiLAogICAgICAgICAgICAgICAgICAgIHllbGxvdzogIiNmMWM0MGYiLAogICAgICAgICAgICAgICAgICAgIGdyZWVuOiAiIzI3YWU2MCIsCiAgICAgICAgICAgICAgICAgICAgYmx1ZTogIiMyOTgwYjkiLAogICAgICAgICAgICAgICAgICAgIHB1cnBsZTogIiM4ZTQ0YWQiLAogICAgICAgICAgICAgICAgICAgIGRhcms6ICIjMzQ0OTVlIiwKICAgICAgICAgICAgICAgICAgICBibGFjazogIiMwMDAwMDAiLAogICAgICAgICAgICAgICAgICAgIGJyb3duOiAiI2JiOTk3NyIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGlja2Fjb2xvciAmJiB0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IuYmFzaWNDb2xvcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBpY2thY29sb3IuYmFzaWNDb2xvcnMgPSB0aGlzLm9wdGlvbnMuY29sb3JzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmlubGluZURyb3Bkb3duKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmlubGluZURyb3Bkb3duID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGlja2Fjb2xvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUgJiYgc2VsZi5vcHRpb25zLnBpY2thY29sb3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYXR0cigidmFsdWUiLCBzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWRkQ2xhc3MoInBpY2stYS1jb2xvciIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkucGlja0FDb2xvcihzZWxmLm9wdGlvbnMucGlja2Fjb2xvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oImNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaWNrLUEtQ29sb3IgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQSBjb2xvciBwaWNrZXIgZm9yIHNlbGVjdGluZyBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGlja2Fjb2xvciIsIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlYXJjaEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInNlYXJjaCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInNlYXJjaCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzLnJlc3VsdHMgPSA1OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzZWFyY2giOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VhcmNoIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgc2VhcmNoIGJveCBmaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWFyY2giLCBBbHBhY2EuRmllbGRzLlNlYXJjaEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInNlYXJjaCIsICJzZWFyY2giKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncyA9IHt9OwoKICAgIEFscGFjYS51c0hvbGRpbmdzLnRlcnJpdG9yaWVzID0gewogICAgICAgICJBbWVyaWNhbiBTYW1vYSIgICAgICAgICAgICAgICAgIDogIkFTIiwKICAgICAgICAiRGlzdHJpY3QgT2YgQ29sdW1iaWEiICAgICAgICAgICA6ICJEQyIsCiAgICAgICAgIkZlZGVyYXRlZCBTdGF0ZXMgT2YgTWljcm9uZXNpYSIgOiAiRk0iLAogICAgICAgICJHdWFtIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkdVIiwKICAgICAgICAiTWFyc2hhbGwgSXNsYW5kcyIgICAgICAgICAgICAgICA6ICJNSCIsCiAgICAgICAgIk5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIgICAgICAgOiAiTVAiLAogICAgICAgICJQYWxhdSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlBXIiwKICAgICAgICAiUHVlcnRvIFJpY28iICAgICAgICAgICAgICAgICAgICA6ICJQUiIsCiAgICAgICAgIlZpcmdpbiBJc2xhbmRzIiAgICAgICAgICAgICAgICAgOiAiVkkiCiAgICB9OwoKICAgIEFscGFjYS51c0hvbGRpbmdzLnN0YXRlcyA9ICB7CiAgICAgICAgIkFsYWJhbWEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQUwiLAogICAgICAgICJBbGFza2EiICAgICAgICAgICAgICAgICAgICAgICAgIDogIkFLIiwKICAgICAgICAiQXJpem9uYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJBWiIsCiAgICAgICAgIkFya2Fuc2FzIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQVIiLAogICAgICAgICJDYWxpZm9ybmlhIiAgICAgICAgICAgICAgICAgICAgIDogIkNBIiwKICAgICAgICAiQ29sb3JhZG8iICAgICAgICAgICAgICAgICAgICAgICA6ICJDTyIsCiAgICAgICAgIkNvbm5lY3RpY3V0IiAgICAgICAgICAgICAgICAgICAgOiAiQ1QiLAogICAgICAgICJEZWxhd2FyZSIgICAgICAgICAgICAgICAgICAgICAgIDogIkRFIiwKICAgICAgICAiRmxvcmlkYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJGTCIsCiAgICAgICAgIkdlb3JnaWEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiR0EiLAogICAgICAgICJIYXdhaWkiICAgICAgICAgICAgICAgICAgICAgICAgIDogIkhJIiwKICAgICAgICAiSWRhaG8iICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJRCIsCiAgICAgICAgIklsbGlub2lzIiAgICAgICAgICAgICAgICAgICAgICAgOiAiSUwiLAogICAgICAgICJJbmRpYW5hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIklOIiwKICAgICAgICAiSW93YSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJQSIsCiAgICAgICAgIkthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiS1MiLAogICAgICAgICJLZW50dWNreSIgICAgICAgICAgICAgICAgICAgICAgIDogIktZIiwKICAgICAgICAiTG91aXNpYW5hIiAgICAgICAgICAgICAgICAgICAgICA6ICJMQSIsCiAgICAgICAgIk1haW5lIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTUUiLAogICAgICAgICJNYXJ5bGFuZCIgICAgICAgICAgICAgICAgICAgICAgIDogIk1EIiwKICAgICAgICAiTWFzc2FjaHVzZXR0cyIgICAgICAgICAgICAgICAgICA6ICJNQSIsCiAgICAgICAgIk1pY2hpZ2FuIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTUkiLAogICAgICAgICJNaW5uZXNvdGEiICAgICAgICAgICAgICAgICAgICAgIDogIk1OIiwKICAgICAgICAiTWlzc2lzc2lwcGkiICAgICAgICAgICAgICAgICAgICA6ICJNUyIsCiAgICAgICAgIk1pc3NvdXJpIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTU8iLAogICAgICAgICJNb250YW5hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIk1UIiwKICAgICAgICAiTmVicmFza2EiICAgICAgICAgICAgICAgICAgICAgICA6ICJORSIsCiAgICAgICAgIk5ldmFkYSIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTlYiLAogICAgICAgICJOZXcgSGFtcHNoaXJlIiAgICAgICAgICAgICAgICAgIDogIk5IIiwKICAgICAgICAiTmV3IEplcnNleSIgICAgICAgICAgICAgICAgICAgICA6ICJOSiIsCiAgICAgICAgIk5ldyBNZXhpY28iICAgICAgICAgICAgICAgICAgICAgOiAiTk0iLAogICAgICAgICJOZXcgWW9yayIgICAgICAgICAgICAgICAgICAgICAgIDogIk5ZIiwKICAgICAgICAiTm9ydGggQ2Fyb2xpbmEiICAgICAgICAgICAgICAgICA6ICJOQyIsCiAgICAgICAgIk5vcnRoIERha290YSIgICAgICAgICAgICAgICAgICAgOiAiTkQiLAogICAgICAgICJPaGlvIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9IIiwKICAgICAgICAiT2tsYWhvbWEiICAgICAgICAgICAgICAgICAgICAgICA6ICJPSyIsCiAgICAgICAgIk9yZWdvbiIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiT1IiLAogICAgICAgICJQZW5uc3lsdmFuaWEiICAgICAgICAgICAgICAgICAgIDogIlBBIiwKICAgICAgICAiUmhvZGUgSXNsYW5kIiAgICAgICAgICAgICAgICAgICA6ICJSSSIsCiAgICAgICAgIlNvdXRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiU0MiLAogICAgICAgICJTb3V0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIlNEIiwKICAgICAgICAiVGVubmVzc2VlIiAgICAgICAgICAgICAgICAgICAgICA6ICJUTiIsCiAgICAgICAgIlRleGFzIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVFgiLAogICAgICAgICJVdGFoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlVUIiwKICAgICAgICAiVmVybW9udCIgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVCIsCiAgICAgICAgIlZpcmdpbmlhIiAgICAgICAgICAgICAgICAgICAgICAgOiAiVkEiLAogICAgICAgICJXYXNoaW5ndG9uIiAgICAgICAgICAgICAgICAgICAgIDogIldBIiwKICAgICAgICAiV2VzdCBWaXJnaW5pYSIgICAgICAgICAgICAgICAgICA6ICJXViIsCiAgICAgICAgIldpc2NvbnNpbiIgICAgICAgICAgICAgICAgICAgICAgOiAiV0kiLAogICAgICAgICJXeW9taW5nIiAgICAgICAgICAgICAgICAgICAgICAgIDogIldZIgogICAgfTsKCiAgICBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU3RhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdGF0ZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVTdGF0ZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmZvcm1hdCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHZhbGlkYXRlIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmFtZSIgfHwgdGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImNvZGUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2YWxpZCBmb3JtYXRzCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlRoZSBjb25maWd1cmVkIHN0YXRlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtuYW1lLCBjb2RlXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmFtZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbmZpZ3VyZQogICAgICAgICAgICB2YXIgaG9sZGluZ3MgPSBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzKAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVTdGF0ZXMsCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzLAogICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIiksCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSk7CgogICAgICAgICAgICB0aGlzLnNjaGVtYVsiZW51bSJdID0gaG9sZGluZ3Mua2V5czsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IGhvbGRpbmdzLnZhbHVlczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTdGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGRyb3Bkb3duIHNlbGVjdG9yIG9mIHN0YXRlcyBhbmQvb3IgdGVycml0b3JpZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGtleWVkIGJ5IHRoZWlyIHR3by1jaGFyYWN0ZXIgY29kZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIb3cgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbIm5hbWUiLCAiY29kZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNhcGl0YWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgdmFsdWVzIHNob3VsZCBiZSBjYXBpdGFsaXplZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkluY2x1ZGUgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgc3RhdGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVUZXJyaXRvcmllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkluY2x1ZGUgVGVycml0b3JpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBpbmNsdWRlIHRoZSB0ZXJyaXRvcmllcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjYXBpdGFsaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlU3RhdGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzdGF0ZSIsIEFscGFjYS5GaWVsZHMuU3RhdGVGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJzdGF0ZSIsICJzdGF0ZSIpOwoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBob2xkaW5ncyBvZiBVUyBzdGF0ZXMgYW5kIHRlcnJpdG9yaWVzLgogICAgICoKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5jbHVkZVN0YXRlcyB3aGV0aGVyIHRvIGluY2x1ZGUgVVMgc3RhdGVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVUZXJyaXRvcmllcyB3aGV0aGVyIHRvIGluY2x1ZGUgVVMgdGVycml0b3JpZXMKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29kZVZhbHVlIHdoZXRoZXIgdG8gaGFuZCBiYWNrIFVTIGhvbGRpbmcgY29kZXMgKGluc3RlYWQgb2YgbmFtZXMpCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNhcGl0YWxpemUgd2hldGhlciB0byBjYXBpdGFsaXplIHRoZSB2YWx1ZXMgaGFuZGVkIGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBhbiBvYmplY3QgY29udGFpbmluZyAia2V5cyIgYW5kICJ2YWx1ZXMiLCBib3RoIG9mIHdoaWNoIGFyZSBhcnJheXMuCiAgICAgKi8KICAgIEFscGFjYS5yZXRyaWV2ZVVTSG9sZGluZ3MgPSAoZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbihpbmNsdWRlU3RhdGVzLCBpbmNsdWRlVGVycml0b3JpZXMsIGNvZGVWYWx1ZSwgY2FwaXRhbGl6ZSkgewogICAgICAgICAgICB2YXIgcmVzICA9IHsKICAgICAgICAgICAgICAgIGtleXM6ICAgW10sCiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoCiAgICAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgICAgIGluY2x1ZGVTdGF0ZXMgICAgICA/IEFscGFjYS51c0hvbGRpbmdzLnN0YXRlcyAgICAgIDoge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlVGVycml0b3JpZXMgPyBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA6IHt9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciBzb3J0ZWQgPSBPYmplY3Qua2V5cyhvcHRzKTsKICAgICAgICAgICAgc29ydGVkLnNvcnQoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3J0ZWQpIHsKICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHNvcnRlZFtpXTsKICAgICAgICAgICAgICAgIHZhciBrZXkgICA9IG9wdHNbc3RhdGVdOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29kZVZhbHVlID8ga2V5IDogc3RhdGU7CiAgICAgICAgICAgICAgICBpZiAoY2FwaXRhbGl6ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5rZXlzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgIHJlcy52YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgfSkoKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlN1bW1lcm5vdGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN1bW1lcm5vdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3VtbWVybm90ZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnN1bW1lcm5vdGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3VtbWVybm90ZSA9IHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBmb2N1czogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBTdW1tZXJub3RlIEVkaXRvcgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgJC5mbi5zdW1tZXJub3RlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKHNlbGYub3B0aW9ucy5zdW1tZXJub3RlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBzdW1tZXJub3RlJ3MgZG9tIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQsIG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cCB0aGUgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgJChzZWxmLmNvbnRyb2wpLnN1bW1lcm5vdGUoJ2Rlc3Ryb3knKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgICwKICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3VtbWVybm90ZSBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgU3VtbWVybm90ZSBFZGl0b3IgY29udHJvbCBmb3IgdXNlIGluIGVkaXRpbmcgSFRNTC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzdW1tZXJub3RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VtbWVybm90ZSBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBTdW1tZXJub3RlIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzdW1tZXJub3RlIiwgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogVGhlIHRhYmxlIGZpZWxkIGlzIHVzZWQgZm9yIGRhdGEgcmVwcmVzZW50YXRpb25zIHRoYXQgY29uc2lzdCBvZiBhbiBhcnJheSB3aXRoIG9iamVjdHMgaW5zaWRlIG9mIGl0LiAgVGhlIG9iamVjdHMKICAgICAqIG11c3QgaGF2ZSBhIHVuaWZvcm0gc3RydWN0dXJlLiAgVGhlIHRhYmxlIGZpZWxkIHJlbmRlcnMgYSBzdGFuZGFyZCBIVE1MIHRhYmxlIHVzaW5nIHRoZSB0YWJsZS4gIFRoZSBpbmRpdmlkdWFsCiAgICAgKiBjb2x1bW5zIGFyZSBlaXRoZXIgZWRpdGFibGUgKGluIGVkaXQgbW9kZSkgb3Igc2ltcGx5IGRpc3BsYXllZCBpbiByZWFkLW9ubHkgbW9kZS4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcy5UYWJsZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmFuaW1hdGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFuaW1hdGUgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHRvb2xiYXIgc3RpY2t5IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcy50eXBlID0gInRhYmxlcm93IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgZWl0aGVyICJkYXRhdGFibGUiIG9yICJkYXRhdGFibGVzIgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMgPSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBlbXB0eSBvcHRpb25zIGZvciBkYXRhdGFibGVzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRhdGF0YWJsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgInBhZ2luZyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJsZW5ndGhDaGFuZ2UiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaW5mbyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzZWFyY2hpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAib3JkZXJpbmciOiB0cnVlCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGRyYWdnYWJsZSByZW9yZGVyIG9mIHJvd3MKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRyYWdSb3dzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kcmFnUm93cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIGFjdGlvbnMgY29sdW1uIHRvIGJlIHNob3duCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHRydWU7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGEgdGFibGVzIGNvbHVtbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucyA9IFtdOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlcyB0byBkZXRlY3QgYWxwYWNhIGZpZWxkIHR5cGVzIGFuZCBwZXJmb3JtIGFscGFjYSBmaWVsZCBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcKICAgICAgICAgICAgaWYgKCQuZm4uZGF0YVRhYmxlRXh0ICYmICEkLmZuLkRhdGFUYWJsZS5leHQudHlwZS5zZWFyY2hbImFscGFjYSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmZuLkRhdGFUYWJsZS5leHQub3JkZXJbImFscGFjYSJdID0gZnVuY3Rpb24gKHNldHRpbmdzLCBjb2wpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZGF0YSBwcm9wZXJ0eSBoYXMgbGF0ZXN0IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVydHkgYnkgaW5kZXgKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBjb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHNlbGYuZGF0YVtpXVtwcm9wZXJ0eU5hbWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuc29ydCgpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEga2luZCBvZiBoYWNreSBmdW5jdGlvbiBhdCB0aGUgbW9tZW50LCB0cnlpbmcgdG8gZG8gZmlsdGVyaW5nIHRoYXQgdGFrZXMgaW50byBhY2NvdW50CiAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIGRhdGEgdGFibGVzIGF1dGhvcnMsIG5lZWQgdG8gd2FpdCBmb3IgbmV4dCByZWxlYXNlIGZvciByZWZhY3RvcmluZyBvZiBmaWx0ZXJpbmcKICAgICAgICAgICAgICAgIC8vIGxvZ2ljIGluIGRhdGEgdGFibGVzIHRvIHJlYWxseSB0YWtlIGNvbnRyb2wgb2YgdGhpcyBhbmQgZG8gaXQgcmlnaHQKICAgICAgICAgICAgICAgIC8vIHRoaXMgInNvcnQgb2YiIHdvcmtzIGZvciBub3cKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAkLmZuLmRhdGFUYWJsZUV4dC5hZm5GaWx0ZXJpbmcucHVzaChmdW5jdGlvbihzZXR0aW5ncywgZmllbGRzLCBmaWVsZEluZGV4LCBkYXRhLCBkYXRhSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gJChzZXR0aW5ncy5uVGFibGVXcmFwcGVyKS5maW5kKCIuZGF0YVRhYmxlc19maWx0ZXIgaW5wdXRbdHlwZT0nc2VhcmNoJ10iKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIiICsgdGV4dDsKCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICQudHJpbSh0ZXh0KTsKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFWYWx1ZSA9IGRhdGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6ID0gZGF0YVZhbHVlLmluZGV4T2YoImRhdGEtYWxwYWNhLWZpZWxkLWlkPSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHogPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhSWQgPSAkKGRhdGFWYWx1ZSkuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYVZhbHVlID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUlkXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gIiIgKyBhbHBhY2FWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhVmFsdWUgPSBhbHBhY2FWYWx1ZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYVZhbHVlLmluZGV4T2YodGV4dCkgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGUiOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBhIHNlcGFyYXRlICJpdGVtcyIgYXJyYXkgdGhhdCB3ZSdsbCB1c2UgdG8gYnVpbGQgb3V0IHRoZSB0YWJsZSBoZWFkZXIKICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmlkID0gazsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllc1trXS50aXRsZTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLml0ZW1zICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHMgJiYgc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXS5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXS50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaGVhZGVycy5wdXNoKGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VGFibGVFbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoJChzZWxmLmNvbnRhaW5lcikuZmluZCgidGFibGUiKVswXSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRhYmxlIGZpZWxkIHVzZXMgdGhlICJhcnJheSIgY29udGFpbmVyIGNvbnZlbnRpb24gdG8gcmVuZGVyIHRoZSBET00uICBBcyBzdWNoLCBuZXN0ZWQgb2JqZWN0cyBhcmUgd3JhcHBlZAogICAgICAgICAqIGluICJmaWVsZCIgZWxlbWVudHMgdGhhdCByZXN1bHQgaW4gc2xpZ2h0bHkgaW5jb3JyZWN0IHRhYmxlIHN0cnVjdHVyZXMuICBQYXJ0IG9mIHRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdAogICAgICAgICAqIGJyb3dzZXJzIGFyZSB2ZXJ5IGZ1c3N5IHdoZW4gaXQgY29tZXMgdG8gaW5qZWN0aW9uIG9mIG5lc3RlZCBUUiBvciBURCBwYXJ0aWFscy4gIEhlcmUsIHdlIGdlbmVyYXRlIG1vc3QKICAgICAgICAgKiB0aGluZ3MgYXMgRElWcyBhbmQgdGhlbiBkbyBzb21lIGNsZWFudXAgaW4gdGhpcyBtZXRob2QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGlzIHB1dCB0b2dlaHRlciBpbiB0aGUKICAgICAgICAgKiByaWdodCB3YXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFudXBEb21JbmplY3Rpb25zKCk7CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgc3R5bGVzIG9mIHVuZGVybHlpbmcgInRhYmxlIgogICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gc2VsZi5nZXRUYWJsZUVsKCk7CiAgICAgICAgICAgICAgICBzZWxmLmFwcGx5U3R5bGUoInRhYmxlIiwgdGFibGUpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBEYXRhVGFibGVzIHBsdWdpbiBpcyBhdmFpbGFibGUsIHVzZSBpdAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhdGFibGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLkRhdGFUYWJsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHNldHRpbmcgdXAgZm9yIGRyYWdnaW5nIHJvd3MsIHRoZW4gYWRkIHRoYXQgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImRyYWdSb3dzSW5kZXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0RyYWdnYWJsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXggaW4gZmllbGRzIGZyb20gdGhlIGl0ZW1zCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbENvbmZpZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJEYXRhVHlwZSI6ICJhbHBhY2EiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaChjb2xDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGFjdGlvbnMgY29sdW1uIGVuYWJsZWQsIHRoZW4gdHVybiBvZmYgc29ydGluZyBmb3IgdGhlIGFjdGlvbnMgY29sdW1uIChhc3N1bWVkIHRvIGJlIGxhc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kcmFnUm93cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXNbInJvd1Jlb3JkZXIiXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0b3IiOiAidHIgdGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU3JjIjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic25hcFgiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGUiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFVkVOVCBIQU5ETEVSUwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgInJlYWR5IiBldmVudCBhbmQgd2hlbiBpdCBmaXJlcywgaW5pdCBkYXRhIHRhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgRE9NIGFuZCBhbnl0aGluZyB3cmFwcGluZyBvdXIgdGFibGUgZmllbGQgaW5zdGFuY2UgaXMgcmVhZHkgdG8gcm9jawogICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgd2UgcHJvY2VlZAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZigicmVhZHkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyIGRvd24gb2xkIGRhdGEgdGFibGVzIGRhdGEgaWYgaXQgaXMgc3RpbGwgYXJvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGUgZG9tIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgdGFibGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdCA9ICQodGFibGUpLkRhdGFUYWJsZShzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgInJvdy1yZW9yZGVyIiBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oInJvdy1yZW9yZGVyIiwgZnVuY3Rpb24oZSwgZGlmZiwgZWRpdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIGRhdGEgc3RydWN0dXJlIHRvIHJlZmxlY3QgdGhlIHNoaWZ0IGluIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZlswXS5vbGRQb3NpdGlvbiAhPT0gZGlmZlswXS5uZXdQb3NpdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmVJdGVtKGRpZmZbMF0ub2xkUG9zaXRpb24sIGRpZmZbMF0ubmV3UG9zaXRpb24sIGZhbHNlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSB1bmRlcmx5aW5nIHRhYmxlIERPTSBlbGVtZW50IGJlaW5nIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGF0IGhhcHBlbnMsIHRlYXIgZG93biB0aGUgZGF0YXRhYmxlcyBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5iaW5kKCdkZXN0cm95ZWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSBzb3J0aW5nIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIG9yZGVyIG9mIGNoaWxkcmVuIGFuZCByZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5vbignb3JkZXInLCBmdW5jdGlvbiAoIGUsIGN0eCwgc29ydGluZywgY29sdW1ucyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBvcmlnaW5hbCBjb3B5IG9mIHRoZSBjaGlsZHJlbiwgbWFrZSBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBhYm91dCB0byByZS1vcmRlciB0aGUgY2hpbGRyZW4gYW5kIGRhdGF0YWJsZSBhc3N1bWVzIHdlIGtub3cgdGhlIG9yaWdpbmFsIG9yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9vcmlnaW5hbENoaWxkcmVuLnB1c2goc2VsZi5jaGlsZHJlbltrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9yZGVyIGJhc2VkIG9uIHRoZSBvcmRlciB0aGF0IGRhdGF0YWJsZXMgYmVsaWV2ZXMgaXMgcmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGN0eC5haURpc3BsYXkubGVuZ3RoOyB6KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBjdHguYWlEaXNwbGF5W3pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHNlbGYuX2R0Ll9vcmlnaW5hbENoaWxkcmVuW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGhlYWRlcnMgYW5kIGFsbG93IGZvciBjYWxsYmFjay1iYXNlZCBjb25maWcKICAgICAgICAgICAgICAgICQodGFibGUpLmNoaWxkcmVuKCJ0aGVhZCA+IHRyID4gdGhbZGF0YS1oZWFkZXItaWRdIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1oZWFkZXItaWQiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHMgJiYgc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tleV07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInRhYmxlSGVhZGVyUmVxdWlyZWQiIG9yICJ0YWJsZUhlYWRlck9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQgfHwgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInRhYmxlSGVhZGVyUmVxdWlyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJ0YWJsZUhlYWRlclJlcXVpcmVkIiwgc2NoZW1hLCBvcHRpb25zLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlck9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJPcHRpb25hbCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsvLy5iaW5kKHNlbGYpKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhbnVwRG9tSW5qZWN0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRha2VzIGEgRE9NIGVsZW1lbnQgYW5kIG1lcmdlcyBpdCAidXAiIHRvIHRoZSBwYXJlbnQgZWxlbWVudC4gIERhdGEgYXR0cmlidXRlcyBhbmQgc29tZSBjbGFzc2VzIGFyZQogICAgICAgICAgICAgKiBjb3BpZWQgZnJvbSBET00gZWxlbWVudCBpbnRvIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBjaGlsZHJlbiBvZiB0aGUgRE9NIGVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZQogICAgICAgICAgICAgKiBwYXJlbnQgYW5kIHRoZSBET00gZWxlbWVudCBpcyByZW1vdmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbWVyZ2VFbGVtZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50VXAgPSBmdW5jdGlvbihtZXJnZUVsZW1lbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBtZXJnZUVsZW1lbnRQYXJlbnQgPSAkKG1lcmdlRWxlbWVudCkucGFyZW50KCk7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50Q2hpbGRyZW4gPSAkKG1lcmdlRWxlbWVudCkuY2hpbGRyZW4oKTsKCiAgICAgICAgICAgICAgICAvLyBjb3B5IG1lcmdlIGVsZW1lbnQgY2xhc3NlcyB0byBwYXJlbnQKICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gJChtZXJnZUVsZW1lbnQpLmF0dHIoJ2NsYXNzJykuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAgICAgJC5lYWNoKCBjbGFzc05hbWVzLCBmdW5jdGlvbihpbmRleCwgY2xhc3NOYW1lKXsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAiYWxwYWNhLW1lcmdlLXVwIikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmFkZENsYXNzKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY29weSBhdHRyaWJ1dGVzIHRvIFRSCiAgICAgICAgICAgICAgICAkLmVhY2goJChtZXJnZUVsZW1lbnQpWzBdLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lLmluZGV4T2YoImRhdGEtIikgPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKG1lcmdlRWxlbWVudFBhcmVudCkuYXR0cih0aGlzLm5hbWUsIHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgZmllbGQgd2l0aCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKG1lcmdlRWxlbWVudENoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlcGxhY2VXaXRoKG1lcmdlRWxlbWVudENoaWxkcmVuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKG1lcmdlRWxlbWVudCkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgdHJFbGVtZW50cyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1maWVsZCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgJCh0ckVsZW1lbnRzKS5jaGlsZHJlbigiLmFscGFjYS1maWVsZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBmaW5kIGVhY2ggVFIncyAuYWxwYWNhLWNvbnRhaW5lciBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgJCh0ckVsZW1lbnRzKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXIiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWN0aW9uIGJhcnMgZm9yIG91ciBmaWVsZCBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FBcnJheUFjdGlvbmJhciA9IHNlbGYuZ2V0RmllbGRFbCgpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoYWxwYWNhQXJyYXlBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhQXJyYXlBY3Rpb25iYXIuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FjdGlvbmJhcicgbm93cmFwPSdub3dyYXAnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCh0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVyRHJhZ2dhYmxlQ2VsbHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCc+PC90ZD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmJlZm9yZSh0ZCk7CiAgICAgICAgICAgICAgICAgICAgJCh0ZCkuYXBwZW5kKCQodGhpcykuY2hpbGRyZW4oKSk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsIGVsZW1lbnRzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzLmVhY2goZnVuY3Rpb24oaSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCc+IiArIGkgKyAiPC90ZD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmJlZm9yZSh0ZCk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueXRoaW5nIGVsc2Ugd2l0aCAuYWxwYWNhLW1lcmdlLXVwIGFuZCBtZXJnZSB1cAogICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLW1lcmdlLXVwIFtkYXRhLW1lcmdlLXVwLWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb1Jlc29sdmVJdGVtQ29udGFpbmVyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5Iik7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgZHJhZ1Jvd3Mgc3VwcG9ydCwgd2UgaGF2ZSBubyBjaG9pY2UgaGVyZSBleGNlcHQgdG8gY29tcGxldGVseSByZWJvb3QgdGhlIHRhYmxlIGluIG9yZGVyCiAgICAgICAgICAgIC8vIHRvIGdldCBEYXRhVGFibGVzIHRvIGJpbmQgdGhpbmdzIGNvcnJlY3RseSBmb3IgZHJhZy1kcm9wIHN1cHBvcnQKICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIGRyYWdSb3dzIHRvIHVzZSBvdXIgb3duIGRyYWcvZHJvcCB0b29saW5nIGFuZCBnZXQgcmlkIG9mIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luCiAgICAgICAgICAgIC8vIHdlIGFsc28gaGF2ZSBkbyB0aGlzIGlmIHdlJ3ZlIGFkZGVkIHRoZSBmaXJzdCByb3cgdG8gZ2V0IERhdGFUYWJsZXMgdG8gcmVkcmF3CiAgICAgICAgICAgIHZhciB1c2luZ0RhdGFUYWJsZXMgPSBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcyAmJiAkLmZuLkRhdGFUYWJsZTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kcmFnUm93cyB8fCAodXNpbmdEYXRhVGFibGVzICYmIHNlbGYuZGF0YS5sZW5ndGggPT09IDEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZWZyZXNoCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgYWRkZWQgYSByb3cKICAgICAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYnkgZmluZGluZyB0aGUgVFIgYW5kIHRoZW4gYWRkaW5nIHRoYXQgd2F5CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgICAgIHZhciB0ciA9IHNlbGYuZmllbGQuZmluZCgiW2RhdGEtYWxwYWNhLWZpZWxkLXBhdGg9JyIgKyBpdGVtLnBhdGggKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5yb3cuYWRkKHRyKTsvLy5kcmF3KGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgLy8gVE9ETzogc2VlIGFib3ZlCgogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbmZvcm0gZGF0YSB0YWJsZXMgdGhhdCB3ZSd2ZSByZW1vdmVkIGEgcm93CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93cyhjaGlsZEluZGV4KS5yZW1vdmUoKTsvLy5kcmF3KGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFibGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSB0YWJsZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRhdGFibGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0YVRhYmxlcyBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gYmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIERhdGFUYWJsZXMgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNob3cgQWN0aW9ucyBDb2x1bW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgYWN0aW9ucyBjb2x1bW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkcmFnUm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRyYWcgUm93cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZHJhZ2dpbmcgb2Ygcm93cyB2aWEgYSBkcmFnZ2FibGUgY29sdW1uLiAgVGhpcyByZXF1aXJlcyBEYXRhVGFibGVzIGFuZCB0aGUgRGF0YVRhYmxlcyBSb3cgUmVvcmRlciBQbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dBY3Rpb25zQ29sdW1uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkcmFnUm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRhYmxlIiwgQWxwYWNhLkZpZWxkcy5UYWJsZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFibGVSb3dGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gc2VsZi5wYXJlbnQub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbjsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMuZHJhZ1Jvd3MgPSBzZWxmLnBhcmVudC5vcHRpb25zLmRyYWdSb3dzOwoKICAgICAgICAgICAgICAgIC8vIHdhbGsgYWxsIGl0ZW1zIGFuZCBtYXJrIGhpZGRlbnMgc28gdGhhdCB0aGUgdGVtcGxhdGUgY2FuIGVhc2lseSBwaWNrIHRoaXMgdXAKICAgICAgICAgICAgICAgIC8vIGhpZGRlbnMgYXJlIGFwcGxpZWQgdGhlICJhbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbiIgY3NzIGNsYXNzIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtc1tpXS5vcHRpb25zLnR5cGUgPT09ICJoaWRkZW4iKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaXRlbXNbaV0uaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWJsZXJvdyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFibGUgUm93IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBvYmplY3QgaXRlbXMgaW50byBhIHRhYmxlIHJvdyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZXJvdyIsIEFscGFjYS5GaWVsZHMuVGFibGVSb3dGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCA9IEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zZXBhcmF0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXBhcmF0b3IgPSAiLCI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsID09PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsLnNwbGl0KHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UoIiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsLmpvaW4odGhpcy5vcHRpb25zLnNlcGFyYXRvcikpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQmx1cgogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciB2YWxzID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSBbXTsKCiAgICAgICAgICAgICQuZWFjaCh2YWxzLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgaWYgKHYudHJpbSgpICE9PSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnB1c2godi50cmltKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJpbW1lZCk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUYWcgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgZW50ZXJpbmcgbGlzdCBvZiB0YWdzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNlcGFyYXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZXBhcmF0b3IgdXNlZCB0byBzcGxpdCB0YWdzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiLCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWciLCBBbHBhY2EuRmllbGRzLlRhZ0ZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRpbWUiOwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlZmF1bHRUaW1lRm9ybWF0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRpbWUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gInRpbWUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUaW1lIEZpZWxkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFRpbWUiOiAiSW52YWxpZCB0aW1lIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0aW1lIiwgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidGltZSIsICJ0aW1lIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW55TUNFRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLnRpbnlNQ0VGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRpbnltY2UiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudG9vbGJhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudG9vbGJhciA9ICJpbnNlcnRmaWxlIHVuZG8gcmVkbyB8IHN0eWxlc2VsZWN0IHwgYm9sZCBpdGFsaWMgfCBhbGlnbmxlZnQgYWxpZ25jZW50ZXIgYWxpZ25yaWdodCBhbGlnbmp1c3RpZnkgfCBidWxsaXN0IG51bWxpc3Qgb3V0ZGVudCBpbmRlbnQgfCBsaW5rIGltYWdlIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRDb250ZW50KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0Q29udHJvbFZhbHVlOmZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lZGl0b3IuZ2V0Q29udGVudCgpCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW5pdFRpbnlNQ0VFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbignYmx1cicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb2N1cyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXByZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXByZXNzIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKHRpbnlNQ0UpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ0ZUZpZWxkSUQgPSAkKHNlbGYuY29udHJvbClbMF0uaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnlNQ0UuaW5pdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfaW5zdGFuY2VfY2FsbGJhY2s6IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBlZGl0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0VGlueU1DRUV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogIiMiICsgcnRlRmllbGRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhcjogc2VsZi5vcHRpb25zLnRvb2xiYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIHBsdWdpbiBpbnN0YW5jZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfSwKCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJUaW55TUNFIEVkaXRvciI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgYSBUaW55TUNFIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidG9vbGJhciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaW55TUNFIHRvb2xiYXIgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9vbGJhciBvcHRpb25zIGZvciBUaW55TUNFIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0aW55bWNlIiwgQWxwYWNhLkZpZWxkcy5UaW55TUNFRmllbGQpOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0b2tlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b2tlbmZpZWxkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZC5zaG93QXV0b2NvbXBsZXRlT25Gb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9rZW5maWVsZC5zaG93QXV0b2NvbXBsZXRlT25Gb2N1cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25CbHVyOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZigkLmZuLnRva2VuZmllbGQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbihzZWxmLCB0b2tlbmZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS50b2tlbmZpZWxkKHRva2VuZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgc2VsZi5vcHRpb25zLnRva2VuZmllbGQpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUb2tlbiBmaWVsZCBmb3IgZW50ZXJpbmcgbGlzdCBvZiB0b2tlbnMgc2VwYXJhdGVkIGJ5IGRlbGltaXRlci4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdG9rZW5zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiLCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b2tlbmZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9rZW4gRmllbGQgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZXR0aW5ncyB0byBwYXNzIGludG8gdGhlIHVuZGVybHlpbmcgYm9vdHN0cmFwLXRva2VuZmllbGQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidG9rZW4iLCBBbHBhY2EuRmllbGRzLlRva2VuRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBhdWdtZW50cyBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZAogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIEZpbGUgdXBsb2FkIGNvbnRyb2wgdGhhdCBjYW4gYmUgbW91bnRlZCBvbiB0b3Agb2YgIm9iamVjdCIgb3IgImFycmF5IiB0eXBlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWluZXIgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIEZpZWxkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3Rvcik7CgogICAgICAgICAgICB0aGlzLmlzQXJyYXlUeXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuaXNPYmplY3RUeXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zY2hlbWEudHlwZSA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyB3cmFwcyBhbiBleGlzdGluZyB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGludG8gYSBtZXRob2QgdGhhdCBsb29rcyBsaWtlIGZuKG1vZGVsKQogICAgICAgICAgICAvLyB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIGZpbGVpbnB1dAogICAgICAgICAgICAvLyBjb25maWcgbG9va3MgbGlrZQogICAgICAgICAgICAvLyAgICB7CiAgICAgICAgICAgIC8vICAgICAgICJmaWxlcyI6IFtdLAogICAgICAgICAgICAvLyAgICAgICAiZm9ybWF0RmlsZVNpemUiOiBmbiwKICAgICAgICAgICAgLy8gICAgICAgIm9wdGlvbnMiOiB7fQogICAgICAgICAgICAvLyAgICB9CiAgICAgICAgICAgIC8vCgogICAgICAgICAgICB0aGlzLndyYXBUZW1wbGF0ZSA9IGZ1bmN0aW9uKHRlbXBsYXRlSWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb25maWcpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVzID0gY29uZmlnLmZpbGVzOwogICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXRGaWxlU2l6ZSA9IGNvbmZpZy5mb3JtYXRGaWxlU2l6ZTsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHNlbGYub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZSA9IEFscGFjYS5jbG9uZU9iamVjdChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNpemUgPSBmb3JtYXRGaWxlU2l6ZShtb2RlbC5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuYnV0dG9ucyA9IHNlbGYub3B0aW9ucy5idXR0b25zOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlSW5kZXggPSBpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IEFscGFjYS50bXBsKHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGVtcGxhdGVJZCksIG1vZGVsLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHVzaChyb3dbMF0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcm93cyA9ICQocm93cyk7CiAgICAgICAgICAgICAgICAgICAgJChyb3dzKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXVwbG9hZCAmJiBvcHRpb25zLmZpbGV1cGxvYWQuYXV0b1VwbG9hZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBzdGFydCBidXR0b24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgiYnV0dG9uLnN0YXJ0IikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVXcmFwUm93KHRoaXMsIG9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBldmVudCBnZXRzIGZpcmVkIHdoZW4gZmlsZWltcGwgaGFzIGNsZWFuZWQgdXAgdGhlIERPTSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhbmRsZSBBamF4IHJlbGF0ZWQgc3R1ZmYgb24gb3VyIG93biBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImRlc3Ryb3llZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5kZWxldGUiKS5vbigiY2xpY2siLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gJChyb3cpLmZpbmQoImJ1dHRvbi5kZWxldGUiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUluZGV4ID0gJChidXR0b24pLmF0dHIoImRhdGEtZmlsZS1pbmRleCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tmaWxlSW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25GaWxlRGVsZXRlLmNhbGwoc2VsZiwgcm93LCBidXR0b24sIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGZpbGVJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoYXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VsZi5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVUlTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkKHJvd3MpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ1cGxvYWQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGJvdHRvbSBjb250cm9sIGJ1dHRvbnMgKHdlIGhhdmUgYSBjb25mbGljdCBvdmVyIHRoZSAnYnV0dG9ucycgbmFtZXNwYWNlKQogICAgICAgICAgICBzZWxmLm9wdGlvbnMucmVuZGVyQnV0dG9ucyA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJ1dHRvbnMgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuaGlkZURlbGV0ZUJ1dHRvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJ1dHRvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgImtleSI6ICJkZWxldGUiLAogICAgICAgICAgICAgICAgICAgICJpc0RlbGV0ZSI6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5zaG93VXBsb2FkUHJldmlldykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5zaG93SGVhZGVycykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYXJyYXkgaWYgbm90IGFycmF5IGFscmVhZHkKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi5kYXRhKSkgewogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW3NlbGYuZGF0YV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHVwbG9hZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBjb3B5aW5nIGJhY2sgdGhlIG1heE51bWJlck9mRmlsZXMgZnJvbSB0aGUgdXBsb2FkIHBsdWdpbidzIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlndXJlIG91dCByZWFzb25hYmxlIG1heE51bWJlck9mRmlsZXMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNhZmUgZ3VhcmQKICAgICAgICAgICAgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9PT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID4gMSB8fCBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZCBwbHVnaW4gY29uZmlnCiAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlcyA9IDk5OTk7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBtYXggZmlsZSBzaXplCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IHNlbGYub3B0aW9ucy51cGxvYWQubWF4RmlsZVNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heEZpbGVTaXplID0gLTE7IC8vIG5vIGxpbWl0CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29weSBzZXR0aW5nIGludG8gdXBsb2FkCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbGUgdHlwZXMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXBsb2FkLmFjY2VwdEZpbGVUeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IG51bGw7IC8vIG5vIHJlc3RyaWN0aW9ucwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlcnJvciBoYW5kbGVyCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlciA9IGZ1bmN0aW9uKG1lc3NhZ2VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KG1lc3NhZ2VzLmpvaW4oIlxuIikpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgQWxwYWNhIGlzIGNvbmZpZ3VyZWQgZm9yIENTUkYgc3VwcG9ydCBhbmQgYSBDU1JGIGNvb2tpZSBvciB0b2tlbiBpcyBhdmFpbGFibGUsCiAgICAgICAgICAgIC8vIHRoZW4gYXBwbHkgaXQgdG8gdGhlIGhlYWRlcnMgdGhhdCBhcmUgc2VudCBvdmVyIHRoZSB3aXJlIHZpYSB0aGUgdW5kZXJseWluZyBhamF4CiAgICAgICAgICAgIC8vIGZvciB0aGUgZmlsZSB1cGxvYWQgY29udHJvbAoKICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIENTUkYgdG9rZW4sIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy51cGxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnRodW1ibmFpbExhYmVsID0gc2VsZi5vcHRpb25zLnRodW1ibmFpbExhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC50aHVtYm5haWxMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgidGh1bWJuYWlsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVuYW1lTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZW5hbWVMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZW5hbWVMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlbmFtZSIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlU2l6ZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVTaXplTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVTaXplTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVNpemUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlVXBsb2FkQWN0aW9uc0xhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVVcGxvYWRBY3Rpb25zTGFiZWwiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuY2hvb3NlQnV0dG9uTGFiZWwgPSBzZWxmLm9wdGlvbnMuY2hvb3NlQnV0dG9uTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmNob29zZUJ1dHRvbkxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJjaG9vc2VGaWxlcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJjaG9vc2VGaWxlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5kcm9wWm9uZU1lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmRyb3Bab25lTWVzc2FnZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoImRyb3Bab25lTXVsdGlwbGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZVNpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlID0gc2VsZi5vcHRpb25zLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgic2VsZWN0RnJvbUV4aXN0aW5nTXVsdGlwbGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgic2VsZWN0RnJvbUV4aXN0aW5nU2luZ2xlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUG9zdFJlbmRlcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gZGlzcGxheS1vbmx5IG1vZGUsIHdlIGhpZGUgYSBidW5jaCBvZiB0aGluZ3MKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiYnV0dG9uIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0biIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3ciKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZHJvcHpvbmUtbWVzc2FnZSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHVwbG9hZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRVcGxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC11cGxvYWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREb3dubG9hZFRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcFRlbXBsYXRlKCJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLWRvd25sb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50IGZvciBtb2RpZnlpbmcgdGhlIGRhdGEgYWhlYWQgb2YgYW4gdXBsb2FkIHN1Ym1pdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlQmVmb3JlRmlsZVVwbG9hZFN1Ym1pdDogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5jb250cm9sOwoKICAgICAgICAgICAgLy8gZmlsZSB1cGxvYWQgY29uZmlnCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkQ29uZmlnID0ge307CgogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkYXRhVHlwZSJdID0gImpzb24iOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cGxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cGxvYWRUZW1wbGF0ZSJdID0gdGhpcy5nZXRVcGxvYWRUZW1wbGF0ZSgpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlSWQiXSA9IG51bGw7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImRvd25sb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0RG93bmxvYWRUZW1wbGF0ZSgpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJmaWxlc0NvbnRhaW5lciJdID0gJChlbCkuZmluZCgiLmZpbGVzIik7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImRyb3Bab25lIl0gPSAkKGVsKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cmwiXSA9ICIvIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sibWV0aG9kIl0gPSAicG9zdCI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbInNob3dVcGxvYWRQcmV2aWV3Il0gPSBzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXc7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdba10gPSBzZWxmLm9wdGlvbnMudXBsb2FkW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQiKS5hdHRyKCJtdWx0aXBsZSIsIHRydWUpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQiKS5hdHRyKCJuYW1lIiwgc2VsZi5uYW1lICsgIl9maWxlc1tdIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYub3B0aW9ucy5uYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgcHJvZ3Jlc3MgYmFyIGF0IGZpcnN0CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSWYgYSBmaWxlIGlzIGJlaW5nIHVwbG9hZGVkLCBzaG93IHRoZSBwcm9ncmVzcyBiYXIuICBPdGhlcndpc2UsIGhpZGUgaXQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJwcm9ncmVzc2FsbCJdID0gZnVuY3Rpb24gKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sb2FkZWQgPCBkYXRhLnRvdGFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzc0JhciA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzQmFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHBhcnNlSW50KGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApOwogICAgICAgICAgICAgICAgICAgICQoJyNwcm9ncmVzcyAucHJvZ3Jlc3MtYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyArICclJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLnByb2dyZXNzIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNvbWUgbGltaXQgY2hlY2tzCiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImFkZCJdID0gZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIHZhciB1cGxvYWRFcnJvcnMgPSBbXTsKCiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBiYWQgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IHNlbGYub3B0aW9ucy5maWxlVHlwZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZSA9IG5ldyBSZWdFeHAoc2VsZi5vcHRpb25zLmZpbGVUeXBlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRhdGEuZmlsZXNbaV1bInR5cGUiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRXJyb3JzLnB1c2goJ05vdCBhbiBhY2NlcHRlZCBmaWxlIHR5cGU6ICcgKyBkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlc1tpXS5zaXplID4gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRXJyb3JzLnB1c2goc2VsZi5nZXRNZXNzYWdlKCJmaWxlVG9vQmlnIikgKyBkYXRhLmZpbGVzW2ldLnNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChiYWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGRhdGEuZmlsZXMubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICBpZiAodXBsb2FkRXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcih1cGxvYWRFcnJvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgZXh0ZW5zaW9uCiAgICAgICAgICAgIHNlbGYuYXBwbHlDb25maWd1cmF0aW9uKGZpbGVVcGxvYWRDb25maWcpOwoKICAgICAgICAgICAgLy8gaW5zdGFudGlhdGUgdGhlIGNvbnRyb2wKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLmZpbGVVcGxvYWQgPSAkKGVsKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKS5maWxldXBsb2FkKGZpbGVVcGxvYWRDb25maWcpOwoKICAgICAgICAgICAgLy8gV2hlbiBmaWxlIHVwbG9hZCBvZiBhIGZpbGUgY29tcGxldGVzLCB3ZSBvZmZlciB0aGUgY2hhbmNlIHRvIGFkanVzdCB0aGUgZGF0YSBhaGVhZCBvZiBGaWxlVXBsb2FkCiAgICAgICAgICAgIC8vIGdldHRpbmcgaXQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgeW91IGNhbid0IGNoYW5nZSB0aGUgc2VydmVyIHNpZGUgSlNPTiBidXQgY291bGQgZG8KICAgICAgICAgICAgLy8gYSBsaXR0bGUgYml0IG9mIG1hZ2ljIGluIHRoZSBjbGllbnQuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2FkZG9uZSIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgZW5oYW5jZUZpbGVzID0gc2VsZi5vcHRpb25zLmVuaGFuY2VGaWxlczsKICAgICAgICAgICAgICAgIGlmIChlbmhhbmNlRmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW5oYW5jZUZpbGVzKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5oYW5jZUZpbGVzKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYmFjayBkb3duIGludG8gZGF0YS5maWxlcwogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGRhdGEucmVzdWx0LmZpbGVzOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0sIDI1MCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZXMgYXJlIHN1Ym1pdHRlZCwgdGhlICJwcm9wZXJ0aWVzIiBhbmQgInBhcmFtZXRlcnMiIG9wdGlvbnMgbWFwIGFyZSBlc3BlY2lhbGx5IHRyZWF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFyZSB3cml0dGVuIGludG8gcHJvcGVydHk8aW5kZXg+X188a2V5PiBhbmQgcGFyYW08aW5kZXg+X19rZXkgZW50cmllcyBpbiB0aGUgZm9ybSBkYXRhLgogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBmb3IgbXVsdGktcGFydCByZWNlaXZlcnMgdG8gZ2V0IHZhbHVlcyBvbiBhIHBlci1maWxlIGJhc2lzLgogICAgICAgICAgICAvLyBQbGFucyBhcmUgdG8gYWxsb3cgdG9rZW4gc3Vic3RpdHV0aW9uIGFuZCBvdGhlciBjbGllbnQtc2lkZSB0cmVhdG1lbnQgYWhlYWQgb2YgcG9zdGluZy4KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kRmlyc3QoImZpbGV1cGxvYWRzdWJtaXQiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gInByb3BlcnR5IiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVZhbHVlID0gc2VsZi5vcHRpb25zWyJwcm9wZXJ0aWVzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwcm9wZXJ0eVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRhdGEuZmlsZXMsIGZ1bmN0aW9uKGluZGV4LCBmaWxlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbU5hbWUgPSAicGFyYW0iICsgaW5kZXggKyAiX18iICsga2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtVmFsdWUgPSBzZWxmLm9wdGlvbnNbInBhcmFtZXRlcnMiXVtrZXldOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIHN1YnN0aXR1dGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBzZWxmLmFwcGx5VG9rZW5TdWJzdGl0dXRpb25zKHBhcmFtVmFsdWUsIGluZGV4LCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZm9ybURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YVtwYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQmVmb3JlRmlsZVVwbG9hZFN1Ym1pdChkYXRhKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmJlZm9yZUZpbGVVcGxvYWRTdWJtaXRIYW5kbGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlci5jYWxsKHNlbGYsIGRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hlbiBmaWxlcyBhcmUgdXBsb2FkZWQsIHdlIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZG9uZSIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICAvLyBleGlzdGluZwogICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gc2VsZi5nZXRWYWx1ZUFzQXJyYXkoKTsKCiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKGkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGRhdGEuZmlsZXMubGVuZ3RoKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0RmlsZVRvRGVzY3JpcHRvcihkYXRhLmZpbGVzW2ldLCBmdW5jdGlvbiAoZXJyLCBkZXNjcmlwdG9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChkZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZihpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYoMCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZSB1cGxvYWRzIGZhaWwsIGFsZXJ0Li4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRmYWlsIiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yVGhyb3duKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25VcGxvYWRGYWlsKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBzdWNjZXNzIG9yIGZhaWwsIHdlIGhhbmRsZSB0aGUgcmVzdWx0cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGFsd2F5cyIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgZXh0ZW5zaW9uCiAgICAgICAgICAgIHNlbGYuYXBwbHlCaW5kaW5ncyhmaWxlVXBsb2FkLCBlbCk7CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgcHJlbG9hZGluZyBvZiBkb2N1bWVudHMKICAgICAgICAgICAgc2VsZi5wcmVsb2FkKGZpbGVVcGxvYWQsIGVsLCBmdW5jdGlvbihmaWxlcykgewoKICAgICAgICAgICAgICAgIGlmIChmaWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9ICQoc2VsZi5jb250cm9sKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKTsKICAgICAgICAgICAgICAgICAgICAkKGZvcm0pLmZpbGV1cGxvYWQoJ29wdGlvbicsICdkb25lJykuY2FsbChmb3JtLCAkLkV2ZW50KCdkb25lJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyUHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZmlsZXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihkb2N1bWVudCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5iaW5kKCdkcm9wIGRyYWdvdmVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVdyYXBSb3c6IGZ1bmN0aW9uKHJvdywgb3B0aW9ucykKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIGFwcGx5VG9rZW5TdWJzdGl0dXRpb25zOiBmdW5jdGlvbih0ZXh0LCBpbmRleCwgZmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0b2tlbnMgPSB7CiAgICAgICAgICAgICAgICAiaW5kZXgiOiBpbmRleCwKICAgICAgICAgICAgICAgICJuYW1lIjogZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZmlsZS51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjogZmlsZS50aHVtYm5haWxVcmwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHN1YnN0aXR1dGUgYW55IHRva2VucwogICAgICAgICAgICB2YXIgeCA9IC0xOwogICAgICAgICAgICB2YXIgYiA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSB0ZXh0LmluZGV4T2YoInsiLCBiKTsKICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSB0ZXh0LmluZGV4T2YoIn0iLCB4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdGV4dC5zdWJzdHJpbmcoeCArIGNhci5sZW5ndGgsIHkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gdG9rZW5zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyByZXBsYWNlbWVudCArIHRleHQuc3Vic3RyaW5nKHkrMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB5ICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUoeCA+IC0xKTsKCiAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgYWRkaW5nIHByb3BlcnRpZXMgYW5kIGNhbGxiYWNrcyB0byB0aGUgZmlsZSB1cGxvYWQgY29uZmlnLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGZpbGVVcGxvYWRjb25maWcKICAgICAgICAgKi8KICAgICAgICBhcHBseUNvbmZpZ3VyYXRpb246IGZ1bmN0aW9uKGZpbGVVcGxvYWRjb25maWcpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgYmluZGluZyBldmVudCBoYW5kbGVycyB0byBmaWxlIHVwbG9hZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkCiAgICAgICAgICovCiAgICAgICAgYXBwbHlCaW5kaW5nczogZnVuY3Rpb24oZmlsZVVwbG9hZCkKICAgICAgICB7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgZnJvbSBhIGZpbGUgdG8gYSBzdG9yYWdlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBBIGRlc2NyaXB0b3IgbG9va3MgbGlrZToKICAgICAgICAgKgogICAgICAgICAqICAgICAgewogICAgICAgICAqICAgICAgICAgICJpZCI6ICIiCiAgICAgICAgICogICAgICAgICAgLi4uCiAgICAgICAgICogICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBBIGRlc2NyaXB0b3IgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFzIG5lZWRlZCBieSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICogc28gYXMgdG8gcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgdGhlIGRlc2NyaWJlZCBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG1lY2hhbmlzbSBtYXkgbmVlZCB0byBiZSBjb25zdWx0ZWQuICBUaHVzLCB0aGlzIGlzIGFzeW5jLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGZpbGUKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBkZXNjcmlwdG9yKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnRGaWxlVG9EZXNjcmlwdG9yOiBmdW5jdGlvbihmaWxlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gewogICAgICAgICAgICAgICAgImlkIjogZmlsZS5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZmlsZS51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpmaWxlLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBmaWxlLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZmlsZS5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkZXNjcmlwdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHN0b3JhZ2UgZGVzY3JpcHRvciB0byBhIGZpbGUuCiAgICAgICAgICoKICAgICAgICAgKiBBIGZpbGUgbG9va3MgbGlrZToKICAgICAgICAgKgogICAgICAgICAqICAgICAgewogICAgICAgICAqICAgICAgICAgICJpZCI6ICIiLAogICAgICAgICAqICAgICAgICAgICJuYW1lIjogInBpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgInNpemUiOiA5MDI2MDQsCiAgICAgICAgICogICAgICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgInRodW1ibmFpbFVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3RodW1ibmFpbFwvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICAgICAiZGVsZXRlVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiCiAgICAgICAgICogICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBTaW5jZSBhbiB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIG1heSBiZSBjb25zdWx0ZWQsIGFuIGFzeW5jIGNhbGxiYWNrIGhvb2sgaXMgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZGVzY3JpcHRvciBtaW1pY3MgdGhlIGZpbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihlcnIsIGZpbGUpCiAgICAgICAgICovCiAgICAgICAgY29udmVydERlc2NyaXB0b3JUb0ZpbGU6IGZ1bmN0aW9uKGRlc2NyaXB0b3IsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZpbGUgPSB7CiAgICAgICAgICAgICAgICAiaWQiOiBkZXNjcmlwdG9yLmlkLAogICAgICAgICAgICAgICAgIm5hbWUiOiBkZXNjcmlwdG9yLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGRlc2NyaXB0b3Iuc2l6ZSwKICAgICAgICAgICAgICAgICJ1cmwiOiBkZXNjcmlwdG9yLnVybCwKICAgICAgICAgICAgICAgICJ0aHVtYm5haWxVcmwiOmRlc2NyaXB0b3IudGh1bWJuYWlsVXJsLAogICAgICAgICAgICAgICAgImRlbGV0ZVVybCI6IGRlc2NyaXB0b3IuZGVsZXRlVXJsLAogICAgICAgICAgICAgICAgImRlbGV0ZVR5cGUiOiBkZXNjcmlwdG9yLmRlbGV0ZVR5cGUKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpbGUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgImVuaGFuY2luZyIgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgc2VydmVyIGFmdGVyIHVwbG9hZHMgaGF2ZSBiZWVuIHN1Ym1pdHRlZC4KICAgICAgICAgKiBUaGlzIHByb3ZpZGVzIGEgcGxhY2UgdG8gY29udmVydCB0aGUgZGF0YS5yb3dzIGJhY2sgaW50byB0aGUgZm9ybWF0IHdoaWNoIHRoZSB1cGxvYWQgY29udHJvbCBleHBlY3RzLgogICAgICAgICAqCiAgICAgICAgICogRXhwZWN0ZWQgZm9ybWF0OgogICAgICAgICAqCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQucm93cyA9IFt7Li4ufV0KICAgICAgICAgKiAgICBkYXRhLnJlc3VsdC5maWxlcyA9IFt7CiAgICAgICAgICogICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICJwYXRoIjogIiIsCiAgICAgICAgICogICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgInNpemUiOiA5MDI2MDQsCiAgICAgICAgICogICAgICAidXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJkZWxldGVUeXBlIjogIkRFTEVURSIqCiAgICAgICAgICogICAgfV0KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkQ29uZmlnCiAgICAgICAgICogQHBhcmFtIGRhdGEKICAgICAgICAgKi8KICAgICAgICBlbmhhbmNlRmlsZXM6IGZ1bmN0aW9uKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByZWxvYWRzIGRhdGEgZGVzY3JpcHRvcnMgaW50byBmaWxlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVzID0gW107CgogICAgICAgICAgICAvLyBub3cgcHJlbG9hZCB3aXRoIGZpbGVzIGJhc2VkIG9uIHByb3BlcnR5IHZhbHVlCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKGkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZmlsZXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJQcmVsb2FkOiBmdW5jdGlvbihmaWxlVXBsb2FkLCBlbCwgZmlsZXMsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZWZyZXNoVUlTdGF0ZSgpOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kcyBiYWNrIHRoZSB2YWx1ZSBhcyBlaXRoZXIgYW4gb2JqZWN0IG9yIGFycmF5LCBkZXBlbmRpbmcgb24gdGhlIHNjaGVtYSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsdWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbdmFsdWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gdGhlIHZhbHVlIGFzIGFuIGFycmF5CiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWVBc0FycmF5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhIHx8IFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWVBc0FycmF5OiBmdW5jdGlvbihhcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmlzQXJyYXlUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoYXJyYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcnJheVswXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWxvYWQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3JzID0gdGhpcy5nZXRWYWx1ZUFzQXJyYXkoKTsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZGVzY3JpcHRvcnMubGVuZ3RoKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZG9uZQoKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9ICQoc2VsZi5jb250cm9sKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKTsKICAgICAgICAgICAgICAgICAgICAkKGZvcm0pLmZpbGV1cGxvYWQoJ29wdGlvbicsICdkb25lJykuY2FsbChmb3JtLCAkLkV2ZW50KCdkb25lJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0RGVzY3JpcHRvclRvRmlsZShkZXNjcmlwdG9yc1tpXSwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmKGkrMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZigwKTsKICAgICAgICB9LAoKICAgICAgICBwbHVnaW46IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZGF0YSgpLmJsdWVpbXBGaWxldXBsb2FkOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hVSVN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZCA9IHNlbGYucGx1Z2luKCk7CiAgICAgICAgICAgIGlmIChmaWxlVXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzOwoKICAgICAgICAgICAgICAgIGlmIChtYXhOdW1iZXJPZkZpbGVzID09PSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hCdXR0b25zKHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlVXBsb2FkLm9wdGlvbnMuZ2V0TnVtYmVyT2ZGaWxlcyAmJiBmaWxlVXBsb2FkLm9wdGlvbnMuZ2V0TnVtYmVyT2ZGaWxlcygpID49IG1heE51bWJlck9mRmlsZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hCdXR0b25zKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWZyZXNoQnV0dG9uczogZnVuY3Rpb24oZW5hYmxlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGZpbGVzIGJ1dHRvbgogICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5maWxldXBsb2FkLWFjdGl2ZS16b25lIHAuZHJvcHpvbmUtbWVzc2FnZSIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICBpZiAoZW5hYmxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZW5hYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsIG51bGwpOwoKICAgICAgICAgICAgICAgIC8vIHNob3cgZHJvcHpvbmUgbWVzc2FnZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5maWxldXBsb2FkLWFjdGl2ZS16b25lIHAuZHJvcHpvbmUtbWVzc2FnZSIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25GaWxlRGVsZXRlOiBmdW5jdGlvbihyb3dFbCwgYnV0dG9uRWwsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGVsZXRlVXJsID0gZmlsZS5kZWxldGVVcmw7CiAgICAgICAgICAgIHZhciBkZWxldGVNZXRob2QgPSBmaWxlLmRlbGV0ZVR5cGU7CgogICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICJtZXRob2QiOiBkZWxldGVNZXRob2QsCiAgICAgICAgICAgICAgICAidXJsIjogZGVsZXRlVXJsLAogICAgICAgICAgICAgICAgImhlYWRlcnMiOiB7fQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNzcmZUb2tlbiA9IHNlbGYuZGV0ZXJtaW5lQ3NyZlRva2VuKCk7CiAgICAgICAgICAgIGlmIChjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGMuaGVhZGVyc1tBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRV0gPSBjc3JmVG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQuYWpheChjKTsKICAgICAgICB9LAoKICAgICAgICBvblVwbG9hZEZhaWw6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlci5jYWxsKHNlbGYsIFtkYXRhLmVycm9yVGhyb3duXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YS5maWxlc1tpXS5lcnJvciA9IGRhdGEuZXJyb3JUaHJvd247CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGlzYWJsZSBzZWxlY3QgYnV0dG9uCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmZpbGVpbnB1dC1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmZpbGVpbnB1dC1idXR0b24iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gc2hvdyB0aGUgdXBsb2FkIHdlbGwKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtd2VsbCIpLmNzcygidmlzaWJpbGl0eSIsICJ2aXNpYmxlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVcGxvYWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiB1cGxvYWQgZmllbGQgd2l0aCBzdXBwb3J0IGZvciB0aHVtYm5haWwgcHJldmlldyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1heE51bWJlck9mRmlsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIE51bWJlciBvZiBGaWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdG8gYWxsb3cgdG8gYmUgdXBsb2FkZWQuICBJZiBncmVhdGVyIHRoYW4gemVybywgdGhlIG1heGltdW0gbnVtYmVyIHdpbGwgYmUgY29uc3RyYWluZWQuICBJZiAtMSwgdGhlbiBubyBsaW1pdCBpcyBpbXBvc2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEZpbGVTaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBGaWxlIFNpemUgKGluIGJ5dGVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBmaWxlIHNpemUgYWxsb3dlZCBwZXIgdXBsb2FkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSB3aWxsIGJlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIHNpemUgaW4gYnl0ZXMuICBJZiAtMSwgdGhlbiBubyBsaW1pdCBpcyBpbXBvc2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogLTEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWxlVHlwZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWxlIFR5cGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcmVndWxhciBleHByZXNzaW9uIGxpbWl0aW5nIHRoZSBmaWxlIHR5cGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIGJhc2VkIG9uIGZpbGVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBhbGxvdyBtdWx0aXBsZSBmaWxlIHVwbG9hZHMuICBJZiBtYXhOdW1iZXJPZkZpbGVzIGlzIG5vdCBzcGVjaWZpZWQsIG11bHRpcGxlIHdpbGwgdG9nZ2xlIGJldHdlZW4gMSBhbmQgdW5saW1pdGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd1VwbG9hZFByZXZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IFVwbG9hZCBQcmV2aWV3IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gc2hvdyB0aHVtYm5haWxzIGZvciB1cGxvYWRlZCBhc3NldHMgKHJlcXVpcmVzIHByZXZpZXcgc3VwcG9ydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3JIYW5kbGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXJyb3IgSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBmdW5jdGlvbiBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIG9uZSBvciBtb3JlIGZpbGVzIGZhaWxzIHRvIHVwbG9hZC4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgdGhlIHVuZGVybHlpbmcgeEhSIHJlcXVlc3QgYW5kIHBvcHVsYXRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugc3RhdGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwbG9hZCIsIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQpOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKCSJmaWxlVG9vQmlnIjogIkZpbGUgaXMgdG9vIGJpZzogIiwKCSJ0aHVtYm5haWwiOiAiVGh1bWJuYWlsIiwKCSJmaWxlbmFtZSI6ICJOYW1lIiwKCSJmaWxlU2l6ZSI6ICJTaXplIiwKCSJmaWxlVXBsb2FkQWN0aW9ucyI6ICJBY3Rpb25zIiwKICAgICAgICAiY2hvb3NlRmlsZSI6ICJDaG9vc2UgRmlsZS4uLiIsCiAgICAgICAgImNob29zZUZpbGVzIjogIkNob29zZSBGaWxlcy4uLiIsCiAgICAgICAgImRyb3Bab25lU2luZ2xlIjogIkNsaWNrIHRoZSBDaG9vc2UgYnV0dG9uIG9yIERyYWcgYW5kIERyb3AgYSBmaWxlIGhlcmUgdG8gdXBsb2FkLi4uIiwKICAgICAgICAiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkLi4uIgogICAgfSk7CgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ByaXZhdGUtZmFjZS9qcXVlcnkuYmluZC1maXJzdC9ibG9iL21hc3Rlci9kZXYvanF1ZXJ5LmJpbmQtZmlyc3QuanMKICAgIC8vIGpxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAoZnVuY3Rpb24oJCkgewogICAgICAgIHZhciBzcGxpdFZlcnNpb24gPSAkLmZuLmpxdWVyeS5zcGxpdCgiLiIpOwogICAgICAgIHZhciBtYWpvciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblswXSk7CiAgICAgICAgdmFyIG1pbm9yID0gcGFyc2VJbnQoc3BsaXRWZXJzaW9uWzFdKTsKCiAgICAgICAgdmFyIEpRX0xUXzE3ID0gKG1ham9yIDwgMSkgfHwgKG1ham9yID09PSAxICYmIG1pbm9yIDwgNyk7CgogICAgICAgIGZ1bmN0aW9uIGV2ZW50c0RhdGEoJGVsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpRX0xUXzE3ID8gJGVsLmRhdGEoJ2V2ZW50cycpIDogJC5fZGF0YSgkZWxbMF0pLmV2ZW50czsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVIYW5kbGVyVG9Ub3AoJGVsLCBldmVudE5hbWUsIGlzRGVsZWdhdGVkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBldmVudHNEYXRhKCRlbCk7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBkYXRhW2V2ZW50TmFtZV07CgogICAgICAgICAgICBpZiAoIUpRX0xUXzE3KSB7CiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGlzRGVsZWdhdGVkID8gZXZlbnRzLnNwbGljZShldmVudHMuZGVsZWdhdGVDb3VudCAtIDEsIDEpWzBdIDogZXZlbnRzLnBvcCgpOwogICAgICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpc0RlbGVnYXRlZCA/IDAgOiAoZXZlbnRzLmRlbGVnYXRlQ291bnQgfHwgMCksIDAsIGhhbmRsZXIpOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzRGVsZWdhdGVkKSB7CiAgICAgICAgICAgICAgICBkYXRhLmxpdmUudW5zaGlmdChkYXRhLmxpdmUucG9wKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXZlbnRzLnVuc2hpZnQoZXZlbnRzLnBvcCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW92ZUV2ZW50SGFuZGxlcnMoJGVsZW1zLCBldmVudHNTdHJpbmcsIGlzRGVsZWdhdGUpIHsKICAgICAgICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50c1N0cmluZy5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgICRlbGVtcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHVyZUV2ZW50TmFtZSA9ICQudHJpbShldmVudHNbaV0pLm1hdGNoKC9bXlwuXSsvaSlbMF07CiAgICAgICAgICAgICAgICAgICAgbW92ZUhhbmRsZXJUb1RvcCgkKHRoaXMpLCBwdXJlRXZlbnROYW1lLCBpc0RlbGVnYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAkLmZuLmJpbmRGaXJzdCA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gJC5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgdmFyIGV2ZW50c1N0cmluZyA9IGFyZ3Muc2hpZnQoKTsKCiAgICAgICAgICAgIGlmIChldmVudHNTdHJpbmcpIHsKICAgICAgICAgICAgICAgICQuZm4uYmluZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgbW92ZUV2ZW50SGFuZGxlcnModGhpcywgZXZlbnRzU3RyaW5nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICB9KSgkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwcGVyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBwZXJjYXNlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB1cHBlclZhbHVlID0gbnVsbDsKICAgICAgICAgICAgaWYgKHZhbCAmJiBBbHBhY2EuaXNTdHJpbmcodmFsKSkgewogICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSA9IHZhbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVcHBlcmNhc2UgVGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IGZpZWxkIGZvciB1cHBlcmNhc2UgdGV4dC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidXBwZXJjYXNlIiwgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJ1cHBlcmNhc2UiLCAidXBwZXJjYXNlIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VUkxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVVJMRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXJsIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ1cmwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ1cmwiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hbGxvd0ludHJhbmV0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0ludHJhbmV0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzWyJpbnRyYW5ldC11cmwiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy51cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zY2hlbWEuZm9ybWF0ID0gInVyaSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewoKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFVSTEZvcm1hdCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dJbnRyYW5ldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFsbG93IGludHJhbmV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBVUkxzIHdpdGggdW5xdWFsaWZpZWQgaG9zdG5hbWVzIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dJbnRyYW5ldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlVSTCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIHRleHQgY29udHJvbCB3aXRoIHZhbGlkYXRpb24gZm9yIGFuIGludGVybmV0IHdlYiBhZGRyZXNzLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRVUkxGb3JtYXQiOiAiVGhlIFVSTCBwcm92aWRlZCBpcyBub3QgYSB2YWxpZCB3ZWIgYWRkcmVzcy4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVybCIsIEFscGFjYS5GaWVsZHMuVVJMRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXJsIiwgInVybCIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiemlwY29kZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAodGhpcy5vcHRpb25zLmZvcm1hdCA/IHRoaXMub3B0aW9ucy5mb3JtYXQgOiAibmluZSIpOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzWyJ6aXBjb2RlLW5pbmUiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1maXZlIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlRoZSBjb25maWd1cmVkIHppcGNvZGUgZm9ybWF0OiAiICsgdGhpcy5vcHRpb25zLmZvcm1hdCArICIgaXMgbm90IGEgbGVnYWwgdmFsdWUgW2ZpdmUsIG5pbmVdIik7CgogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBuaW5lIGZvcm1hdAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvcm1hdCA9ICJuaW5lIjsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCBtYXNrIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OS05OTk5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1sibWFza1N0cmluZyJdID0gIjk5OTk5IjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJmaXZlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgemlwY29kZSBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImZpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJmaXZlIiwgIm5pbmUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJaaXBjb2RlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGEgZml2ZSBvciBuaW5lLWRpZ2l0YWwgVVMgemlwY29kZSBjb250cm9sIHdpdGggdmFsaWRhdGlvbi4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiOiAiSW52YWxpZCBGaXZlLURpZ2l0IFppcGNvZGUgKCMjIyMjKSIsCiAgICAgICAgImludmFsaWRaaXBjb2RlRm9ybWF0TmluZSI6ICJJbnZhbGlkIE5pbmUtRGlnaXQgWmlwY29kZSAoIyMjIyMtIyMjIykiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInppcGNvZGUiLCBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJ6aXBjb2RlIiwgInppcGNvZGUiKTsKCn0pKGpRdWVyeSk7CgovKioKICogRGVmaW5lcyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBmb3Igdmlld3MuICBBbGwgdmlld3MgaW4gQWxwYWNhIHVsdGltYXRlbHkgZXh0ZW5kIHRoaXMgZm9ybS4KICogVGhpcyBwcm92aWRlcyB0aGUgaWRlYWwgcGxhY2UgZm9yIGFueSBnbG9iYWwgb3ZlcnJpZGVzIG9mIHZpZXcgdGVtcGxhdGVzLCBtZXNzYWdlIGJ1bmRsZXMgb3Igb3RoZXIgc2V0dGluZ3MuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgInRpdGxlIjogIkFic3RyYWN0IGJhc2UgdmlldyIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiY291bnRyaWVzIjogewogICAgICAgICAgICAgICAgImFmZyI6IkFmZ2hhbmlzdGFuIiwKICAgICAgICAgICAgICAgICJhbGEiOiJBbGFuZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJhbGIiOiJBbGJhbmlhIiwKICAgICAgICAgICAgICAgICJkemEiOiJBbGdlcmlhIiwKICAgICAgICAgICAgICAgICJhc20iOiJBbWVyaWNhbiBTYW1vYSIsCiAgICAgICAgICAgICAgICAiYW5kIjoiQW5kb3JyYSIsCiAgICAgICAgICAgICAgICAiYWdvIjoiQW5nb2xhIiwKICAgICAgICAgICAgICAgICJhaWEiOiJBbmd1aWxsYSIsCiAgICAgICAgICAgICAgICAiYXRhIjoiQW50YXJjdGljYSIsCiAgICAgICAgICAgICAgICAiYXRnIjoiQW50aWd1YSBhbmQgQmFyYnVkYSIsCiAgICAgICAgICAgICAgICAiYXJnIjoiQXJnZW50aW5hIiwKICAgICAgICAgICAgICAgICJhcm0iOiJBcm1lbmlhIiwKICAgICAgICAgICAgICAgICJhYnciOiJBcnViYSIsCiAgICAgICAgICAgICAgICAiYXVzIjoiQXVzdHJhbGlhIiwKICAgICAgICAgICAgICAgICJhdXQiOiJBdXN0cmlhIiwKICAgICAgICAgICAgICAgICJhemUiOiJBemVyYmFpamFuIiwKICAgICAgICAgICAgICAgICJiaHMiOiJCYWhhbWFzIiwKICAgICAgICAgICAgICAgICJiaHIiOiJCYWhyYWluIiwKICAgICAgICAgICAgICAgICJiZ2QiOiJCYW5nbGFkZXNoIiwKICAgICAgICAgICAgICAgICJicmIiOiJCYXJiYWRvcyIsCiAgICAgICAgICAgICAgICAiYmxyIjoiQmVsYXJ1cyIsCiAgICAgICAgICAgICAgICAiYmVsIjoiQmVsZ2l1bSIsCiAgICAgICAgICAgICAgICAiYmx6IjoiQmVsaXplIiwKICAgICAgICAgICAgICAgICJiZW4iOiJCZW5pbiIsCiAgICAgICAgICAgICAgICAiYm11IjoiQmVybXVkYSIsCiAgICAgICAgICAgICAgICAiYnRuIjoiQmh1dGFuIiwKICAgICAgICAgICAgICAgICJib2wiOiJCb2xpdmlhIiwKICAgICAgICAgICAgICAgICJiaWgiOiJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwKICAgICAgICAgICAgICAgICJid2EiOiJCb3Rzd2FuYSIsCiAgICAgICAgICAgICAgICAiYnZ0IjoiQm91dmV0IElzbGFuZCIsCiAgICAgICAgICAgICAgICAiYnJhIjoiQnJhemlsIiwKICAgICAgICAgICAgICAgICJpb3QiOiJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLAogICAgICAgICAgICAgICAgImJybiI6IkJydW5laSBEYXJ1c3NhbGFtIiwKICAgICAgICAgICAgICAgICJiZ3IiOiJCdWxnYXJpYSIsCiAgICAgICAgICAgICAgICAiYmZhIjoiQnVya2luYSBGYXNvIiwKICAgICAgICAgICAgICAgICJiZGkiOiJCdXJ1bmRpIiwKICAgICAgICAgICAgICAgICJraG0iOiJDYW1ib2RpYSIsCiAgICAgICAgICAgICAgICAiY21yIjoiQ2FtZXJvb24iLAogICAgICAgICAgICAgICAgImNhbiI6IkNhbmFkYSIsCiAgICAgICAgICAgICAgICAiY3B2IjoiQ2FwZSBWZXJkZSIsCiAgICAgICAgICAgICAgICAiY3ltIjoiQ2F5bWFuIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImNhZiI6IkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAidGNkIjoiQ2hhZCIsCiAgICAgICAgICAgICAgICAiY2hsIjoiQ2hpbGUiLAogICAgICAgICAgICAgICAgImNobiI6IkNoaW5hIiwKICAgICAgICAgICAgICAgICJjeHIiOiJDaHJpc3RtYXMgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJjY2siOiJDb2NvcyAoS2VlbGluZyksIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImNvbCI6IkNvbG9tYmlhIiwKICAgICAgICAgICAgICAgICJjb20iOiJDb21vcm9zIiwKICAgICAgICAgICAgICAgICJjb2ciOiJDb25nbyIsCiAgICAgICAgICAgICAgICAiY29kIjoiQ29uZ28sIHRoZSBEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSIsCiAgICAgICAgICAgICAgICAiY29rIjoiQ29vayBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjcmkiOiJDb3N0YSBSaWNhIiwKICAgICAgICAgICAgICAgICJocnYiOiJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICJjdWIiOiJDdWJhIiwKICAgICAgICAgICAgICAgICJjeXAiOiJDeXBydXMiLAogICAgICAgICAgICAgICAgImN6ZSI6IkN6ZWNoIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICJjaXYiOiJDb3RlIGQnSXZvaXJlIiwKICAgICAgICAgICAgICAgICJkbmsiOiJEZW5tYXJrIiwKICAgICAgICAgICAgICAgICJkamkiOiJEamlib3V0aSIsCiAgICAgICAgICAgICAgICAiZG1hIjoiRG9taW5pY2EiLAogICAgICAgICAgICAgICAgImRvbSI6IkRvbWluaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiZWN1IjoiRWN1YWRvciIsCiAgICAgICAgICAgICAgICAiZWd5IjoiRWd5cHQiLAogICAgICAgICAgICAgICAgInNsdiI6IkVsIFNhbHZhZG9yIiwKICAgICAgICAgICAgICAgICJnbnEiOiJFcXVhdG9yaWFsIEd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZXJpIjoiRXJpdHJlYSIsCiAgICAgICAgICAgICAgICAiZXN0IjoiRXN0b25pYSIsCiAgICAgICAgICAgICAgICAiZXRoIjoiRXRoaW9waWEiLAogICAgICAgICAgICAgICAgImZsayI6IkZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKSwiLAogICAgICAgICAgICAgICAgImZybyI6IkZhcm9lIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImZqaSI6IkZpamkiLAogICAgICAgICAgICAgICAgImZpbiI6IkZpbmxhbmQiLAogICAgICAgICAgICAgICAgImZyYSI6IkZyYW5jZSIsCiAgICAgICAgICAgICAgICAiZ3VmIjoiRnJlbmNoIEd1aWFuYSIsCiAgICAgICAgICAgICAgICAicHlmIjoiRnJlbmNoIFBvbHluZXNpYSIsCiAgICAgICAgICAgICAgICAiYXRmIjoiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICJnYWIiOiJHYWJvbiIsCiAgICAgICAgICAgICAgICAiZ21iIjoiR2FtYmlhIiwKICAgICAgICAgICAgICAgICJnZW8iOiJHZW9yZ2lhIiwKICAgICAgICAgICAgICAgICJkZXUiOiJHZXJtYW55IiwKICAgICAgICAgICAgICAgICJnaGEiOiJHaGFuYSIsCiAgICAgICAgICAgICAgICAiZ2liIjoiR2licmFsdGFyIiwKICAgICAgICAgICAgICAgICJncmMiOiJHcmVlY2UiLAogICAgICAgICAgICAgICAgImdybCI6IkdyZWVubGFuZCIsCiAgICAgICAgICAgICAgICAiZ3JkIjoiR3JlbmFkYSIsCiAgICAgICAgICAgICAgICAiZ2xwIjoiR3VhZGVsb3VwZSIsCiAgICAgICAgICAgICAgICAiZ3VtIjoiR3VhbSIsCiAgICAgICAgICAgICAgICAiZ3RtIjoiR3VhdGVtYWxhIiwKICAgICAgICAgICAgICAgICJnZ3kiOiJHdWVybnNleSIsCiAgICAgICAgICAgICAgICAiZ2luIjoiR3VpbmVhIiwKICAgICAgICAgICAgICAgICJnbmIiOiJHdWluZWEtQmlzc2F1IiwKICAgICAgICAgICAgICAgICJndXkiOiJHdXlhbmEiLAogICAgICAgICAgICAgICAgImh0aSI6IkhhaXRpIiwKICAgICAgICAgICAgICAgICJobWQiOiJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInZhdCI6IkhvbHkgU2VlIChWYXRpY2FuIENpdHkgU3RhdGUpLCIsCiAgICAgICAgICAgICAgICAiaG5kIjoiSG9uZHVyYXMiLAogICAgICAgICAgICAgICAgImhrZyI6IkhvbmcgS29uZyIsCiAgICAgICAgICAgICAgICAiaHVuIjoiSHVuZ2FyeSIsCiAgICAgICAgICAgICAgICAiaXNsIjoiSWNlbGFuZCIsCiAgICAgICAgICAgICAgICAiaW5kIjoiSW5kaWEiLAogICAgICAgICAgICAgICAgImlkbiI6IkluZG9uZXNpYSIsCiAgICAgICAgICAgICAgICAiaXJuIjoiSXJhbiwgSXNsYW1pYyBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAiaXJxIjoiSXJhcSIsCiAgICAgICAgICAgICAgICAiaXJsIjoiSXJlbGFuZCIsCiAgICAgICAgICAgICAgICAiaW1uIjoiSXNsZSBvZiBNYW4iLAogICAgICAgICAgICAgICAgImlzciI6IklzcmFlbCIsCiAgICAgICAgICAgICAgICAiaXRhIjoiSXRhbHkiLAogICAgICAgICAgICAgICAgImphbSI6IkphbWFpY2EiLAogICAgICAgICAgICAgICAgImpwbiI6IkphcGFuIiwKICAgICAgICAgICAgICAgICJqZXkiOiJKZXJzZXkiLAogICAgICAgICAgICAgICAgImpvciI6IkpvcmRhbiIsCiAgICAgICAgICAgICAgICAia2F6IjoiS2F6YWtoc3RhbiIsCiAgICAgICAgICAgICAgICAia2VuIjoiS2VueWEiLAogICAgICAgICAgICAgICAgImtpciI6IktpcmliYXRpIiwKICAgICAgICAgICAgICAgICJwcmsiOiJLb3JlYSwgRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia29yIjoiS29yZWEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJrd3QiOiJLdXdhaXQiLAogICAgICAgICAgICAgICAgImtneiI6Ikt5cmd5enN0YW4iLAogICAgICAgICAgICAgICAgImxhbyI6IkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICJsdmEiOiJMYXR2aWEiLAogICAgICAgICAgICAgICAgImxibiI6IkxlYmFub24iLAogICAgICAgICAgICAgICAgImxzbyI6Ikxlc290aG8iLAogICAgICAgICAgICAgICAgImxiciI6IkxpYmVyaWEiLAogICAgICAgICAgICAgICAgImxieSI6IkxpYnlhbiBBcmFiIEphbWFoaXJpeWEiLAogICAgICAgICAgICAgICAgImxpZSI6IkxpZWNodGVuc3RlaW4iLAogICAgICAgICAgICAgICAgImx0dSI6IkxpdGh1YW5pYSIsCiAgICAgICAgICAgICAgICAibHV4IjoiTHV4ZW1ib3VyZyIsCiAgICAgICAgICAgICAgICAibWFjIjoiTWFjYW8iLAogICAgICAgICAgICAgICAgIm1rZCI6Ik1hY2Vkb25pYSwgdGhlIGZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAibWRnIjoiTWFkYWdhc2NhciIsCiAgICAgICAgICAgICAgICAibXdpIjoiTWFsYXdpIiwKICAgICAgICAgICAgICAgICJteXMiOiJNYWxheXNpYSIsCiAgICAgICAgICAgICAgICAibWR2IjoiTWFsZGl2ZXMiLAogICAgICAgICAgICAgICAgIm1saSI6Ik1hbGkiLAogICAgICAgICAgICAgICAgIm1sdCI6Ik1hbHRhIiwKICAgICAgICAgICAgICAgICJtaGwiOiJNYXJzaGFsbCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJtdHEiOiJNYXJ0aW5pcXVlIiwKICAgICAgICAgICAgICAgICJtcnQiOiJNYXVyaXRhbmlhIiwKICAgICAgICAgICAgICAgICJtdXMiOiJNYXVyaXRpdXMiLAogICAgICAgICAgICAgICAgIm15dCI6Ik1heW90dGUiLAogICAgICAgICAgICAgICAgIm1leCI6Ik1leGljbyIsCiAgICAgICAgICAgICAgICAiZnNtIjoiTWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZiIsCiAgICAgICAgICAgICAgICAibWRhIjoiTW9sZG92YSwgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1jbyI6Ik1vbmFjbyIsCiAgICAgICAgICAgICAgICAibW5nIjoiTW9uZ29saWEiLAogICAgICAgICAgICAgICAgIm1uZSI6Ik1vbnRlbmVncm8iLAogICAgICAgICAgICAgICAgIm1zciI6Ik1vbnRzZXJyYXQiLAogICAgICAgICAgICAgICAgIm1hciI6Ik1vcm9jY28iLAogICAgICAgICAgICAgICAgIm1veiI6Ik1vemFtYmlxdWUiLAogICAgICAgICAgICAgICAgIm1tciI6Ik15YW5tYXIiLAogICAgICAgICAgICAgICAgIm5hbSI6Ik5hbWliaWEiLAogICAgICAgICAgICAgICAgIm5ydSI6Ik5hdXJ1IiwKICAgICAgICAgICAgICAgICJucGwiOiJOZXBhbCIsCiAgICAgICAgICAgICAgICAibmxkIjoiTmV0aGVybGFuZHMiLAogICAgICAgICAgICAgICAgImFudCI6Ik5ldGhlcmxhbmRzIEFudGlsbGVzIiwKICAgICAgICAgICAgICAgICJuY2wiOiJOZXcgQ2FsZWRvbmlhIiwKICAgICAgICAgICAgICAgICJuemwiOiJOZXcgWmVhbGFuZCIsCiAgICAgICAgICAgICAgICAibmljIjoiTmljYXJhZ3VhIiwKICAgICAgICAgICAgICAgICJuZXIiOiJOaWdlciIsCiAgICAgICAgICAgICAgICAibmdhIjoiTmlnZXJpYSIsCiAgICAgICAgICAgICAgICAibml1IjoiTml1ZSIsCiAgICAgICAgICAgICAgICAibmZrIjoiTm9yZm9sayBJc2xhbmQiLAogICAgICAgICAgICAgICAgIm1ucCI6Ik5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibm9yIjoiTm9yd2F5IiwKICAgICAgICAgICAgICAgICJvbW4iOiJPbWFuIiwKICAgICAgICAgICAgICAgICJwYWsiOiJQYWtpc3RhbiIsCiAgICAgICAgICAgICAgICAicGx3IjoiUGFsYXUiLAogICAgICAgICAgICAgICAgInBzZSI6IlBhbGVzdGluaWFuIFRlcnJpdG9yeSwgT2NjdXBpZWQiLAogICAgICAgICAgICAgICAgInBhbiI6IlBhbmFtYSIsCiAgICAgICAgICAgICAgICAicG5nIjoiUGFwdWEgTmV3IEd1aW5lYSIsCiAgICAgICAgICAgICAgICAicHJ5IjoiUGFyYWd1YXkiLAogICAgICAgICAgICAgICAgInBlciI6IlBlcnUiLAogICAgICAgICAgICAgICAgInBobCI6IlBoaWxpcHBpbmVzIiwKICAgICAgICAgICAgICAgICJwY24iOiJQaXRjYWlybiIsCiAgICAgICAgICAgICAgICAicG9sIjoiUG9sYW5kIiwKICAgICAgICAgICAgICAgICJwcnQiOiJQb3J0dWdhbCIsCiAgICAgICAgICAgICAgICAicHJpIjoiUHVlcnRvIFJpY28iLAogICAgICAgICAgICAgICAgInFhdCI6IlFhdGFyIiwKICAgICAgICAgICAgICAgICJyb3UiOiJSb21hbmlhIiwKICAgICAgICAgICAgICAgICJydXMiOiJSdXNzaWFuIEZlZGVyYXRpb24iLAogICAgICAgICAgICAgICAgInJ3YSI6IlJ3YW5kYSIsCiAgICAgICAgICAgICAgICAicmV1IjoiUmV1bmlvbiIsCiAgICAgICAgICAgICAgICAiYmxtIjoiU2FpbnQgQmFydGhlbGVteSIsCiAgICAgICAgICAgICAgICAic2huIjoiU2FpbnQgSGVsZW5hIiwKICAgICAgICAgICAgICAgICJrbmEiOiJTYWludCBLaXR0cyBhbmQgTmV2aXMiLAogICAgICAgICAgICAgICAgImxjYSI6IlNhaW50IEx1Y2lhIiwKICAgICAgICAgICAgICAgICJtYWYiOiJTYWludCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KSIsCiAgICAgICAgICAgICAgICAic3BtIjoiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCiAgICAgICAgICAgICAgICAidmN0IjoiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLAogICAgICAgICAgICAgICAgIndzbSI6IlNhbW9hIiwKICAgICAgICAgICAgICAgICJzbXIiOiJTYW4gTWFyaW5vIiwKICAgICAgICAgICAgICAgICJzdHAiOiJTYW8gVG9tZSBhbmQgUHJpbmNpcGUiLAogICAgICAgICAgICAgICAgInNhdSI6IlNhdWRpIEFyYWJpYSIsCiAgICAgICAgICAgICAgICAic2VuIjoiU2VuZWdhbCIsCiAgICAgICAgICAgICAgICAic3JiIjoiU2VyYmlhIiwKICAgICAgICAgICAgICAgICJzeWMiOiJTZXljaGVsbGVzIiwKICAgICAgICAgICAgICAgICJzbGUiOiJTaWVycmEgTGVvbmUiLAogICAgICAgICAgICAgICAgInNncCI6IlNpbmdhcG9yZSIsCiAgICAgICAgICAgICAgICAic3ZrIjoiU2xvdmFraWEiLAogICAgICAgICAgICAgICAgInN2biI6IlNsb3ZlbmlhIiwKICAgICAgICAgICAgICAgICJzbGIiOiJTb2xvbW9uIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInNvbSI6IlNvbWFsaWEiLAogICAgICAgICAgICAgICAgInphZiI6IlNvdXRoIEFmcmljYSIsCiAgICAgICAgICAgICAgICAic2dzIjoiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImVzcCI6IlNwYWluIiwKICAgICAgICAgICAgICAgICJsa2EiOiJTcmkgTGFua2EiLAogICAgICAgICAgICAgICAgInNkbiI6IlN1ZGFuIiwKICAgICAgICAgICAgICAgICJzdXIiOiJTdXJpbmFtZSIsCiAgICAgICAgICAgICAgICAic2ptIjoiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsCiAgICAgICAgICAgICAgICAic3d6IjoiU3dhemlsYW5kIiwKICAgICAgICAgICAgICAgICJzd2UiOiJTd2VkZW4iLAogICAgICAgICAgICAgICAgImNoZSI6IlN3aXR6ZXJsYW5kIiwKICAgICAgICAgICAgICAgICJzeXIiOiJTeXJpYW4gQXJhYiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAidHduIjoiVGFpd2FuLCBQcm92aW5jZSBvZiBDaGluYSIsCiAgICAgICAgICAgICAgICAidGprIjoiVGFqaWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidHphIjoiVGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAidGhhIjoiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgInRscyI6IlRpbW9yLUxlc3RlIiwKICAgICAgICAgICAgICAgICJ0Z28iOiJUb2dvIiwKICAgICAgICAgICAgICAgICJ0a2wiOiJUb2tlbGF1IiwKICAgICAgICAgICAgICAgICJ0b24iOiJUb25nYSIsCiAgICAgICAgICAgICAgICAidHRvIjoiVHJpbmlkYWQgYW5kIFRvYmFnbyIsCiAgICAgICAgICAgICAgICAidHVuIjoiVHVuaXNpYSIsCiAgICAgICAgICAgICAgICAidHVyIjoiVHVya2V5IiwKICAgICAgICAgICAgICAgICJ0a20iOiJUdXJrbWVuaXN0YW4iLAogICAgICAgICAgICAgICAgInRjYSI6IlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidHV2IjoiVHV2YWx1IiwKICAgICAgICAgICAgICAgICJ1Z2EiOiJVZ2FuZGEiLAogICAgICAgICAgICAgICAgInVrciI6IlVrcmFpbmUiLAogICAgICAgICAgICAgICAgImFyZSI6IlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwKICAgICAgICAgICAgICAgICJnYnIiOiJVbml0ZWQgS2luZ2RvbSIsCiAgICAgICAgICAgICAgICAidXNhIjoiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAidW1pIjoiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ1cnkiOiJVcnVndWF5IiwKICAgICAgICAgICAgICAgICJ1emIiOiJVemJla2lzdGFuIiwKICAgICAgICAgICAgICAgICJ2dXQiOiJWYW51YXR1IiwKICAgICAgICAgICAgICAgICJ2ZW4iOiJWZW5lenVlbGEiLAogICAgICAgICAgICAgICAgInZubSI6IlZpZXQgTmFtIiwKICAgICAgICAgICAgICAgICJ2Z2IiOiJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCIsCiAgICAgICAgICAgICAgICAidmlyIjoiVmlyZ2luIElzbGFuZHMsIFUuUy4iLAogICAgICAgICAgICAgICAgIndsZiI6IldhbGxpcyBhbmQgRnV0dW5hIiwKICAgICAgICAgICAgICAgICJlc2giOiJXZXN0ZXJuIFNhaGFyYSIsCiAgICAgICAgICAgICAgICAieWVtIjoiWWVtZW4iLAogICAgICAgICAgICAgICAgInptYiI6IlphbWJpYSIsCiAgICAgICAgICAgICAgICAiendlIjoiWmltYmFid2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXB0eSI6ICIiLAogICAgICAgICAgICAicmVxdWlyZWQiOiAiVGhpcyBmaWVsZCBpcyByZXF1aXJlZCIsCiAgICAgICAgICAgICJ2YWxpZCI6ICIiLAogICAgICAgICAgICAiaW52YWxpZCI6ICJUaGlzIGZpZWxkIGlzIGludmFsaWQiLAogICAgICAgICAgICAibW9udGhzIjogWyJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl0sCiAgICAgICAgICAgICJ0aW1lVW5pdHMiOiB7IFNFQ09ORDogInNlY29uZHMiLCBNSU5VVEU6ICJtaW51dGVzIiwgSE9VUjogImhvdXJzIiwgREFZOiAiZGF5cyIsIE1PTlRIOiAibW9udGhzIiwgWUVBUjogInllYXJzIiB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKCS8vIGN6ZWNoIC0gY3plY2ggcmVwdWJsaWMKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJjc19DWiI6IHsKCQkJCXJlcXVpcmVkOiAiVG90byBwb2xlIGplIHZ5xb5hZG92w6FubyIsCgkJCQlpbnZhbGlkOiAiVG90byBwb2xlIGplIG5lcGxhdG7DqSIsCgkJCQltb250aHM6IFsiTGVkZW4iLCAiw5pub3IiLCAiQsWZZXplbiIsICJEdWJlbiIsICJLdsSbdGVuIiwgIsSMZXJ2ZW4iLCAixIxlcnZlbmVjIiwgIlNycGVuIiwgIlrDocWZw60iLCAixZjDrWplbiIsICJMaXN0b3BhZCIsICJQcm9zaW5lYyJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VrdW5keSIsCgkJCQkJTUlOVVRFOiAibWludXR5IiwKCQkJCQlIT1VSOiAiaG9kaW55IiwKCQkJCQlEQVk6ICJkbnkiLAoJCQkJCU1PTlRIOiAibcSbc8OtY2UiLAoJCQkJCVlFQVI6ICJyb2t5IgoJCQkJfSwKCQkJCS8vIENvbnRyb2xGaWVsZC5qcwoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IGplZG51IGhvZG5vdHUgeiB7MH0uIEFrdHXDoWxuw60gaG9kbm90YSBqZTogezF9IiwKCgkJCQkvLyBGaWVsZC5qcwoJCQkJIm5vdE9wdGlvbmFsIjogIlRvdG8gcG9sZSBuZW7DrSB2b2xpdGVsbsOpIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBqc291IHpha8OhemFuw6kgaG9kbm90eS4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9BcnJheUZpZWxkLmpzCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiTWluaW3DoWxuw60gcG/EjWV0IHBvbG/FvmVrIGplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk1heGltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkhvZG5vdHkgbmVqc291IHVuaWvDoXRuw60iLAoJCQkJIm5vdEFuQXJyYXkiOiAiVGF0byBob2Rub3RhIG5lbsOtIHBvbGUiLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJQxZlpZGF0IG5vdm91IHBvbG/Fvmt1IiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJQxZlpZGF0IiwKCQkJCSJyZW1vdmVCdXR0b25MYWJlbCI6ICJPZGVicmF0IiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIk5haG9ydSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkRvbMWvIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvTGlzdEZpZWxkLmpzCgkJCQkibm9uZUxhYmVsIjogIsW9w6FkbsO9IiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvTnVtYmVyRmllbGQuanMKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltw6FsbsOtIGhvZG5vdGEgdG9ob3RvIHBvbGUgamUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1heGltw6FsbsOtIGhvZG5vdGEgdG9ob3RvIHBvbGUgamUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkhvZG5vdGEgdG9ob3RvIHBvbGUgbXVzw60gYsO9dCB2xJt0xaHDrSBuZcW+IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgbWVuxaHDrSBuZcW+IHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiSG9kbm90YSBtdXPDrSBiw710IGTEm2xpdGVsbsOhIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJIb2Rub3RhIG5lbsOtIMSNw61zbG8uIiwKCQkJCSJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAixIzDrXNsbyBuZW7DrSBuw6Fzb2JrZW0gezB9IiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvT2JqZWN0RmllbGQuanMKCQkJCSJ0b29NYW55UHJvcGVydGllcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgdmxhc3Rub3N0w60gKHswfSkgYnlsIHDFmWVrcm/EjWVuLiIsCgkJCQkidG9vRmV3UHJvcGVydGllcyI6ICJOZW7DrSBkb3N0YXRlayB2bGFzdG5vc3TDrSAoamUgcG/FvmFkb3bDoW5vIHswfSkiLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0QXJlYUZpZWxkLmpzCgkJCQkid29yZExpbWl0RXhjZWVkZWQiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHNsb3YgKHswfSkgYnlsIHDFmWVrcm/EjWVuLiIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL1RleHRGaWVsZC5qcwoJCQkJImludmFsaWRQYXR0ZXJuIjogIlRvdG8gcG9sZSBtw6EgbcOtdCB2em9yIHswfSIsCgkJCQkic3RyaW5nVG9vU2hvcnQiOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBuZWptZW7EmyB7MH0gem5ha8WvIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbWF4aW3DoWxuxJsgezB9IHpuYWvFryIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0RhdGVGaWVsZC5qcwoJCQkJImludmFsaWREYXRlIjogIk5lc3Byw6F2bsOpIGRhdHVtIHBybyBmb3Jtw6F0IHswfSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuZWQvRWRpdG9yRmllbGQuanMKCQkJCSJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIkVkaXRvciBtw6EgdiBzb2LEmyBjaHlieSwga3RlcsOpIG11c8OtIGLDvXQgb3ByYXZlbnkiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9FbWFpbEZpZWxkLmpzCgkJCQkiaW52YWxpZEVtYWlsIjogIkNoeWJuw6EgZS1tYWlsb3bDoSBhZHJlc2EsIHDFmS46IGluZm9AY2xvdWRjbXMuY29tIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQuSW50ZWdlckZpZWxkLmpzCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlRhdG8gaG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0lQdjRGaWVsZC5qcwoJCQkJImludmFsaWRJUHY0IjogIkNoeWJuw6EgSVB2NCBhZHJlc2EsIGV4OiAxOTIuMTY4LjAuMSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0pTT05GaWVsZC5qcwoJCQkJInN0cmluZ05vdEFKU09OIjogIlRhdG8gaG9kbm90YSBuZW7DrSBwbGF0bsO9IEpTT04gdGV4dC4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9NYXBGaWVsZC5qcwoJCQkJImtleU1pc3NpbmciOiAiTWFwYSBvYnNhaHVqZSBwcsOhemRuw70ga2zDrcSNLiIsCgkJCQkia2V5Tm90VW5pcXVlIjogIktsw63EjWUgbmVqc291IGplZGluZcSNbsOpLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1Bhc3N3b3JkRmllbGQuanMKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAixaBwYXRuw6kgaGVzbG8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBob25lIjogIsWgcGF0bsOpIHRlbGVmb25uw60gxI3DrXNsbywgcMWZLjogKDEyMykgNDU2LTk5OTkiLCAvLyBUT0RPOiBpbnZhbGlkIHBhdHRlcm4gZm9yIGN6ZWNoIGxvY2FsZQoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9VcGxvYWRGaWVsZC5qcwoJCQkJImNob29zZUZpbGUiOiAiVnliZXJ0ZSBzb3Vib3IuLi4iLAoJCQkJImNob29zZUZpbGVzIjogIlZ5YmVydGUgc291Ym9yeS4uLiIsCgkJCQkiZHJvcFpvbmVTaW5nbGUiOiAiVnliZXJ0ZSBzb3Vib3IgbmVibyBqZWogcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgkJCQkiZHJvcFpvbmVNdWx0aXBsZSI6ICJWeWJlcnRlIHNvdWJvcnkgbmVibyBqZSBwxZlldMOhaG7Em3RlIHNlbSBwcm8gbmFocsOhbsOtLi4uIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVVJMRmllbGQuanMKCQkJCSJpbnZhbGlkVVJMRm9ybWF0IjogIlV2ZWRlbsOhIFVSTCBuZW7DrSBwbGF0bmEgd2Vib3bDoSBhZHJlc2EuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvQ2lwY29kZUZpZWxkLmpzCgkJCQkiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkNoeWJuw6kgcG/FoXRvdm7DrSBzbcSbcm92YWPDrSDEjcOtc2xvICgjIyMjIykiLAoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0TmluZSI6ICJDaHlibsOpIGRldsOtdGktbcOtc3Ruw6kgcG/FoXRvdm7DrSBzbcSbcm92YWPDrSDEjcOtc2xvICgjIyMjIy0jIyMjKSIKCQkJfQogICAgICAgIH0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gYXVzdHJpYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0FUIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSBpbnZhbGlkIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKw6RubmVyIiwgIkZlYnJ1YXIiLCAiTcOkcnoiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGV6ZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVuIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dGVuIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiU3R1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiVGFnZSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNb25hdGUiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJKYWhyZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGllc2VzIEZlbGQgaXN0IG5pY2h0IG9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZXJsYXVidDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGllc2UgRmVsZCBzb2xsdGUgZWluZW4gZGVyIGZvbGdlbmRlbiBXZXJ0ZSBlbnRoYWx0ZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRpZSBNaW5kZXN0YW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiRGllc2UgV2VydGUgc2luZCBuaWNodCBlaW5kZXV0aWciLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiS2VpbmUgTGlzdGUgdm9uIFdlcnRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmFsc2NoZXMgRGF0dW1zZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVbmfDvGx0aWdlIGUtTWFpbCBBZHJlc3NlLCB6LkIuOiBpbmZvQGNsb3VkY21zLmNvbSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIkVpbmdhYmUgaXN0IGtlaW5lIEdhbnogWmFobC4iLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlVuZ8O8bHRpZ2UgSVB2NCBBZHJlc3NlLCB6LkIuOiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBaZWljaGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGdyw7bDn2VyIHNlaW4gYWxzIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEaWUgQW56YWhsIGRlciBaZWljaGVuIG11c3Mga2xlaW5lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkRlciBXZXJ0IG11c3MgZHVyY2ggezB9IGRpdmlkaWVyYmFyIHNlaW4iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiRGllIEVpbmdhYmUgaXN0IGtlaW5lIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJVbmfDvGx0aWdlcyBQYXNzd29ydC4iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIsIHouQi46ICgxMjMpIDQ1Ni05OTk5IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJEaWVzZSBGZWxkIHN0aW1tdCBuaWNodCBtaXQgZm9sZ2VuZGVyIFZvcmdhYmUgw7xiZXJlaW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGllc2VzIEZlbGQgc29sbHRlIGjDtmNoc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBnZXJtYW4gLSBnZXJtYW55CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZGVfREUiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkVpbmdhYmUgZXJmb3JkZXJsaWNoIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJFaW5nYWJlIHVuZ8O8bHRpZyIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyIiwgIkZlYnJ1YXIiLCAiTcOkcnoiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGV6ZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVuIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dGVuIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiU3R1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiVGFnZSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNb25hdGUiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJKYWhyZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGllc2VzIEZlbGQgaXN0IG5pY2h0IG9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZXJsYXVidDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGllc2UgRmVsZCBzb2xsdGUgZWluZW4gZGVyIGZvbGdlbmRlbiBXZXJ0ZSBlbnRoYWx0ZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRpZSBNaW5kZXN0YW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiRGllc2UgV2VydGUgc2luZCBuaWNodCBlaW5kZXV0aWciLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiS2VpbmUgTGlzdGUgdm9uIFdlcnRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmFsc2NoZXMgRGF0dW1zZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJLZWluZSBnw7xsdGlnZSBFLU1haWwgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIktlaW5lIEdhbnplIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlVuZ8O8bHRpZ2UgSVB2NCBBZHJlc3NlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgZ3LDtnNzdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGllIGtsZWluc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGdyw7bDn2VyIHNlaW4gYWxzIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEaWUgZ3LDtnNzdG3DtmdsaWNoZSBaYWhsIG11c3Mga2xlaW5lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkRlciBXZXJ0IG11c3MgZHVyY2ggezB9IGRpdmlkaWVyYmFyIHNlaW4iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiRGllIEVpbmdhYmUgaXN0IGtlaW5lIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJVbmfDvGx0aWdlcyBQYXNzd29ydCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVuZ8O8bHRpZ2UgVGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ3JlZWsgLSBncmVlY2UKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJlbF9HUiI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAizqXPgM6/z4fPgc61z4nPhM65zrrPjCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAizpvOrM64zr/PgiIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsizpnOsc69zr/Phc6sz4HOuc6/z4IiLCAizqbOtc6yz4HOv8+FzqzPgc65zr/PgiIsICLOnM6sz4HPhM65zr/PgiIsICLOkc+Az4HOr867zrnOv8+CIiwgIs6czqzOuc6/z4IiLCAizpnOv8+Nzr3Ouc6/z4IiLCAizpnOv8+NzrvOuc6/z4IiLCAizpHPjc6zzr/Phc+Dz4TOv8+CIiwgIs6jzrXPgM+Ezq3OvM6yz4HOuc6/z4IiLCAizp/Ous+Ez47Oss+BzrnOv8+CIiwgIs6dzr/Orc68zrLPgc65zr/PgiIsICLOlM61zrrOrc68zrLPgc65zr/PgiJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAizpTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLOm861z4DPhM6sIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAizo/Pgc61z4IiLAogICAgICAgICAgICAgICAgICAgIERBWTogIs6czq3Pgc61z4IiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAizpzOrs69zrXPgiIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIs6nz4HPjM69zrnOsSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAizpHPhc+Ez4wgz4TOvyDPgM61zrTOr86/IM60zrXOvSDOtc6vzr3Osc65IM+Az4HOv86xzrnPgc61z4TOuc66z4wiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAizpzOtyDOtc+AzrnPhM+BzrXPgM+Ezq4gz4TOuc68zq46IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDPgM61z4HOuc6tz4fOtc65IM68zq/OsSDOsc+Az4wgz4TOuc+CIM6xzrrPjM67zr/Phc64zrXPgiDPhM65zrzOrc+COiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICLOnyDOtc67zqzPh865z4PPhM6/z4IgzrHPgc65zrjOvM+Mz4IgzrXOs86zz4HOsc+Gz47OvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIs6fIM68zq3Os865z4PPhM6/z4IgzrHPgc65zrjOvM+Mz4IgzrXOs86zz4HOsc+Gz47OvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAizp/OuSDPhM65zrzOrc+CIM60zrXOvSDOtc6vzr3Osc65IM68zr/Ovc6xzrTOuc66zq3PgiIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICLOlM61zr0gz4XPgM6sz4HPh86/z4XOvSDOtc6zzrPPgc6xz4bOrc+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICLOm86szrjOv8+CIM68zr/Pgc+Gzq4gzrfOvM61z4HOv868zrfOvc6vzrHPgjogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAizpzOtyDOrc6zzrrPhc+Bzr8gZW1haWwiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLOlM61zr0gzrXOr869zrHOuSDOsc66zq3Pgc6xzrnOv8+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICLOnM63IM6tzrPOus+Fz4HOtyBJUHY0IM60zrnOtc+NzrjPhc69z4POtyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLOpM6/IM61zrvOrM+HzrnPg8+Ezr8gz4DOu86uzrjOv8+CIM+HzrHPgc6xzrrPhM6uz4HPic69IM61zq/Ovc6xzrkgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIs6kzr8gzrzOrc6zzrnPg8+Ezr8gz4DOu86uzrjOv8+CIM+HzrHPgc6xzrrPhM6uz4HPic69IM61zq/Ovc6xzrkgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIs6Rz4DOsc65z4TOv8+Nzr3PhM6xzrkgz4DOtc+BzrnPg8+Dz4zPhM61z4HOv865IM+HzrHPgc6xzrrPhM6uzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIs6Rz4DOsc65z4TOv8+Nzr3PhM6xzrkgzrvOuc6zz4zPhM61z4HOv865IM+HzrHPgc6xzrrPhM6uz4HOtc+CIM6xz4DPjCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgz4DOv867zrvOsc+AzrvOrM+DzrnOvyDPhM6/z4UgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIs6XIM+EzrnOvM6uIM60zrXOvSDOtc6vzr3Osc65IM6xz4HOuc64zrzPjM+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAizpzOtyDOrc6zzrrPhc+Bzr8gcGFzc3dvcmQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLOnM63IM6tzrPOus+Fz4HOv8+CIM6xz4HOuc64zrzPjM+CIM+EzrfOu861z4bPjs69zr/PhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAizpHPhc+Ez4wgz4TOvyDPgM61zrTOr86/IM60zrXOvSDOrc+HzrXOuSDPhM63zr0gzrHPgM6xzrnPhM6/z43OvM61zr3OtyDOvM6/z4HPhs6uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAizqTOvyDPgM61zrTOr86/IM+Az4HOrc+AzrXOuSDOvc6xIM6tz4fOtc65IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+HzrHPgc6xzrrPhM6uz4HOtc+CIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIs6kzr8gz4DOtc60zq/OvyDOvM+Azr/Pgc61zq8gzr3OsSDOrc+HzrXOuSDPhM6/IM+Azr/Ou8+NIHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gc3BhbmlzaCAtIHNwYWluCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZXNfRVMiOiB7CgkJCQlyZXF1aXJlZDogIkVzdGUgY2FtcG8gZXMgb2JsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIkVzdGUgY2FtcG8gZXMgaW52w6FsaWRvIiwKCQkJCW1vbnRoczogWyJFbmVybyIsICJGZWJyZXJvIiwgIk1hcnpvIiwgIkFicmlsIiwgIk1heW8iLCAiSnVuaW8iLCAiSnVsaW8iLCAiQWdvc3RvIiwgIlNlcHRpZW1icmUiLCAiT2N0dWJyZSIsICJOb3ZpZW1icmUiLCAiRGljaWVtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWd1bmRvcyIsCgkJCQkJTUlOVVRFOiAibWludXRvcyIsCgkJCQkJSE9VUjogImhvcmFzIiwKCQkJCQlEQVk6ICJkw61hcyIsCgkJCQkJTU9OVEg6ICJtZXNlcyIsCgkJCQkJWUVBUjogImHDsW9zIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJFc3RlIGNhbXBvIG5vIGVzIG9wY2lvbmFsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gc29uIGxvcyB2YWxvcmVzIHJlY2hhemFkb3MuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZWJlIHRlbmVyIHVubyBkZSBsb3MgdmFsb3JlcyBhZGVudHJvIHswfS4gW3sxfV0iLAoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIkVsIG7Dum1lcm8gbcOtbmltbyBkZSBhcnTDrWN1bG9zIGVzIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkVsIG7Dum1lcm8gbcOheGltbyBkZSBhcnTDrWN1bG9zIGVzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiTG9zIHZhbG9yZXMgbm8gc29uIMO6bmljb3MiLAoJCQkJIm5vdEFuQXJyYXkiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBhcnNlbmFsIiwKCQkJCSJpbnZhbGlkRGF0ZSI6ICJGZWNoYSBpbnbDoWxpZGEgcGFyYSBlbCBmb3JtYXRvIHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkVtYWlsIGFkZHJlc3MgaW52w6FsaWRvLCBleDogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG5vIGVzIHVuIG7Dum1lcm8gZW50ZXJvLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiRGlyZWNjacOzbiBpbnbDoWxpZGEgSVB2NCwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkVsIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIGVzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJFbCB2YWxvciBtw6F4aW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRWwgdmFsb3IgZGUgZXN0ZSBjYW1wbyBkZWJlIHNlciBtYXlvciBxdWUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWVub3MgcXVlIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRWwgdmFsb3IgZGViZSBzZXIgZGl2aXNpYmxlIGNlcmNhIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG5vIGVzIHVuIG7Dum1lcm8uIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiQ29udHJhc2XDsWEgaW52w6FsaWRhIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiTsO6bWVybyBkZSB0ZWzDqWZvbm8gaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciBwYXRyw7NuIHswfSIsCgkJCQkic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZWJlIGNvbnRlbmVyIHBvciBsbyBtZW5vcyB7MH0gbsO6bWVyb3MgbyBjYXJhY3RlcmVzIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBhIGxvIG3DoXMgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkibm9uZUxhYmVsIjogIk5pbmd1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBw7FhZGlyIiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJBw7FhZGlyIiwKCQkJCSJyZW1vdmVCdXR0b25MYWJlbCI6ICJRdWl0YXIiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiQXJyaWJhIiwKCQkJCSJkb3duQnV0dG9uTGFiZWwiOiAiQWJham8iCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGZpbm5pc2ggLSBmaW5sYW5kCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZmlfRkkiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIktlbnR0w6Qgb24gcGFrb2xsaW5lbiIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiU3nDtnRlIG9uIHZpcmhlZWxsaW5lbiIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiVGFtbWlrdXUiLCAiSGVsbWlrdXUiLCAiTWFhbGlza3V1IiwgIkh1aHRpa3V1IiwgIlRvdWtva3V1IiwgIktlc8Oka3V1IiwgIkhlaW7DpGt1dSIsICJFbG9rdXUiLCAiU3l5c2t1dSIsICJMb2tha3V1IiwgIk1hcnJhc2t1dSIsICJKb3VsdWt1dSJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW50aWEiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV1dHRpYSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogInR1bnRpYSIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAicMOkaXbDpMOkIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogImt1dWthdXR0YSIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogInZ1b3R0YSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiVMOkbcOkIGtlbnR0w6Qgb24gcGFrb2xsaW5lbiIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJTZXVyYWF2YXQgc3nDtnR0ZWV0IGVpdsOkdCBvbGUgc2FsbGl0dHVqYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiS2VudMOkbiBwaXTDpMOkIHNpc8OkbHTDpMOkIHlrc2kgc2V1cmFhdmlzdGEgYXJ2b2lzdGE6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlBpZW5pbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiU3V1cmluIHNhbGxpdHR1IG3DpMOkcsOkIGFydm9qYSBvbiB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlN5w7Z0ZXR5dCBhcnZvdCBlaXbDpHQgb2xlIHVuaWlra2VqYSIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICJTecO2dGUgZWkgb2xlIGxpc3RhIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJWaXJoZWVsbGluZW4gcMOkaXbDpG3DpMOkcsOkbXVvdG86IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIlZpcmhlZWxsaW5lbiBzw6Roa8O2cG9zdGlvc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJBcnZvIGVpIG9sZSBrb2tvbmFpc2x1a3UiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlZpcmhlZWxsaW5lbiBJUHY0LW9zb2l0ZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJQaWVuaW4gc2FsbGl0dHUgYXJ2byBvbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiU3V1cmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkFydm9uIHBpdMOkw6Qgb2xsYSBzdXVyZW1waSBrdWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgcGllbmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkx1dnVuIHBpdMOkw6Qgb2xsYSBqYW9sbGluZW4gbHV2dWxsYSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiU3nDtnRlIGVpIG9sZSBsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVmlyaGVlbGxpbmVuIHNhbGFzYW5hIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVmlyaGVlbGxpbmVuIHB1aGVsaW5udW1lcm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlN5w7Z0dGVlbiB0w6R5dHl5IG9sbGEgc2V1cmFhdmFzc2EgbXVvZG9zc2E6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiU3nDtnR0ZWVuIG1pbmltaXBpdHV1cyBvbiB7MH0gbWVya2tpw6QiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiU3nDtnR0ZWVuIG1ha3NpbWlwaXR1dXMgb24gezB9IG1lcmtracOkIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmcmVuY2ggLSBmcmFuY2UKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJmcl9GUiI6IHsKCQkJCXJlcXVpcmVkOiAiQ2UgY2hhbXAgZXN0IHJlcXVpcyIsCgkJCQlpbnZhbGlkOiAiQ2UgY2hhbXAgZXN0IGludmFsaWRlIiwKCQkJCW1vbnRoczogWyJKYW52aWVyIiwgIkbDqXZyaWVyIiwgIk1hcnMiLCAiQXZyaWwiLCAiTWFpIiwgIkp1aW4iLCAiSnVpbGxldCIsICJBb8O7dCIsICJTZXB0ZW1icmUiLCAiT2N0b2JyZSIsICJOb3ZlbWJyZSIsICJEw6ljZW1icmUiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNlY29uZGVzIiwKCQkJCQlNSU5VVEU6ICJtaW51dGVzIiwKCQkJCQlIT1VSOiAiaGV1cmVzIiwKCQkJCQlEQVk6ICJqb3VycyIsCgkJCQkJTU9OVEg6ICJtb2lzIiwKCQkJCQlZRUFSOiAiYW5uw6llcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiQ2UgY2hhbXAgbidlc3QgcGFzIG9wdGlvbm5lbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbnQgZGVzIHZhbGV1cnMgaW50ZXJkaXRlcy4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJDZSBjaGFtcCBkb2l0IHByZW5kcmUgdW5lIGRlcyB2YWxldXJzIHN1aXZhbnRlcyA6IHswfS4gW3sxfV0iLAoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIkxlIG5vbWJyZSBtaW5pbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiTGUgbm9tYnJlIG1heGltdW0gZCfDqWzDqW1lbnRzIGVzdCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxlcyB2YWxldXJzIHNvbnQgdW5pcXVlcyIsCgkJCQkibm90QW5BcnJheSI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuZSBsaXN0ZSIsCgkJCQkiaW52YWxpZERhdGUiOiAiQ2V0dGUgZGF0ZSBuZSBjb3JyZXNwb25kIHBhcyBhdSBmb3JtYXQgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiQWRyZXNzZSBkZSBjb3VycmllbCBpbnZhbGlkZSwgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1biBub21icmUgZW50aWVyLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiQWRyZXNzZSBJUHY0IGludmFsaWRlLCBleDogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiTGEgdmFsZXVyIG1pbmltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJMYSB2YWxldXIgbWF4aW1hbGUgcG91ciBjZSBjaGFtcCBlc3QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkxhIHZhbGV1ciBkb2l0LcOqdHJlIHN1cMOpcmlldXJlIMOgIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBpbmbDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkxhIHZhbGV1ciBkb2l0LcOqdHJlIGRpdmlzaWJsZSBwYXIgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk1vdCBkZSBwYXNzZSBpbnZhbGlkZSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bcOpcm8gZGUgdMOpbMOpcGhvbmUgaW52YWxpZGUsIGV4OiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiQ2UgY2hhbXAgZG9pdCBjb3JyZXNwb25kcmUgYXUgbW90aWYgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJDZSBjaGFtcCBkb2l0IGNvbnRlbmlyIGF1IG1vaW5zIHswfSBjYXJhY3TDqHJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJDZSBjaGFtcCBkb2l0IGNvbnRlbmlyIGF1IHBsdXMgezB9IGNhcmFjdMOocmVzIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjcm9hdGlhbiAtIGNyb2F0aWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJocl9IUiI6IHsKCQkJCXJlcXVpcmVkOiAiUG9samUgamUgb2JhdmV6bm8iLAoJCQkJaW52YWxpZDogIlBvZ3JlxaFuYSB2cmlqZWRub3N0IiwKCQkJCW1vbnRoczogWyJTaWplxI1hbmoiLCAiVmVsamHEjWEiLCAiT8W+dWphayIsICJUcmF2YW5qIiwgIlN2aWJhbmoiLCAiTGlwYW5qIiwgIlNycGFuaiIsICJLb2xvdm96IiwgIlJ1amFuIiwgIkxpc3RvcGFkIiwgIlN0dWRlbmkiLCAiUHJvc2luYWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZGEiLAoJCQkJCU1JTlVURTogIm1pbnV0YSIsCgkJCQkJSE9VUjogInNhdGkiLAoJCQkJCURBWTogImRhbiIsCgkJCQkJTU9OVEg6ICJtamVzZWMiLAoJCQkJCVlFQVI6ICJnb2RpbmEiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIlBvbGplIG5pamUgb3BjaW9uby4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHZyaWplZG5vc3QgbmlqZSBkb3p2b2xqZW5hLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIk1vZ3XEh2UgdnJpamVkbm9zdGkgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJPZGFiZXJpdGUgbmFqbWFuamUgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiT2RhYmVyaXRlIG5hanZpxaFlIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiVnJpamVkbm9zdCBuaWplIGplZGluc3R2ZW5hIiwKCQkJCSJub3RBbkFycmF5IjogIlZyaWplZG5vc3QgbmlqZSBwb3BpcyIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0dW0gbmlqZSB1IGZvcm1hdHUgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiRS1tYWlsIGFkcmVzYSBuaWplIHUgaXNwcmF2bm9tIGZvcm1hdHUsIG5wcjogaW1lLnByZXppbWVAaW50ZXJuZXQuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiVnJpamVkbm9zdCBuaWplIGNpamVsaSBicm9qLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiSVB2NCBhZHJlc2EgbmlqZSBpc3ByYXZuYSwgbnByOiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJWcmlqZWRub3N0IGplIGlzcG9kIGRvcHXFoXRlbm9nIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJWcmlqZWRub3N0IGplIGl6bmFkIGRvcHXFoXRlbm9nIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWcmlqZWRub3N0IG1vcmEgYml0aSB2ZcSHYSBvZCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgbWFuamEgb2QgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJWcmlqZWRub3N0IG1vcmEgYml0aSBkamVsaml2YSBzYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiVnJpamVkbm9zdCBuaWplIGJyb2ouIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiTmVpc3ByYXZuYSBsb3ppbmthIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiVGVsZWZvbiBuaWplIGlzcHJhdmFuLCBucHI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJQb2dyZcWhYW4gdXpvcmFrIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiUG9samUgbW9yYSBpbWF0aSBuYW1qYW5qZSB7MH0gem5ha292YSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJQb2xqZSBtb3JhIGltYXRpIG5hanZpxaFlIHswfSB6bmFrb3ZhIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBpdGFsaWFuIC0gaXRhbHkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJpdF9JVCI6IHsKCQkJCXJlcXVpcmVkOiAiUXVlc3RvIGNhbXBvIMOoIG9iYmxpZ2F0b3JpbyIsCgkJCQlpbnZhbGlkOiAiUXVlc3RvIGNhbXBvIMOoIGludmFsaWRvIiwKCQkJCW1vbnRoczogWyJHZW5uYWlvIiwgIkZlYmJyYWlvIiwgIk1hcnpvIiwgIkFwcmlsZSIsICJNYWdnaW8iLCAiR2l1Z25vIiwgIkx1Z2xpbyIsICJBZ29zdG8iLCAiU2V0dGVtYnJlIiwgIk90dG9icmUiLCAiTm92ZW1icmUiLCAiRGljZW1icmUiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNlY29uZGkiLAoJCQkJCU1JTlVURTogIm1pbnV0aSIsCgkJCQkJSE9VUjogIm9yZSIsCgkJCQkJREFZOiAiZ2lvcm5pIiwKCQkJCQlNT05USDogIm1lc2kiLAoJCQkJCVlFQVI6ICJhbm5pIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJRdWVzdG8gY2FtcG8gbm9uIMOoIG9wemlvbmFsZSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gc29ubyB2YWxvcmkgaW52YWxpZGkiLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJRdWVzdG8gY2FtcG8gZGV2ZSBhdmVyZSB1bm8gZGVpIHNlZ3VlbnRpIHZhbG9yaSB7MH0gKHZhbG9yZSBhdHR1YWxlOiB7MX0pIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJJbCBudW1lcm8gbWluaW1vIGRpIGVsZW1lbnRpIHJpY2hpZXN0aSDDqCB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJJbCBudW1lcm8gbWFzc2ltbyBkaSBlbGVtZW50aSBhbW1lc3NpIMOoIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiSSB2YWxvcmkgbm9uIHNvbm8gdW5pdm9jaSIsCgkJCQkibm90QW5BcnJheSI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCBkaSB0aXBvIGFycmF5IiwKCQkJCSJpbnZhbGlkRGF0ZSI6ICJEYXRhIGludmFsaWRhIHBlciBpbCBmb3JtYXRvIHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkluZGlyaXp6byBlbWFpbCBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8gaW50ZXJvIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJJbmRpcml6em8gSVB2NCBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiSWwgdmFsb3JlIG1pbmltbyBwZXIgcXVlc3RvIGNhbXBvIMOoIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJJbCB2YWxvcmUgbWFzc2ltbyBwZXIgcXVlc3RvIGNhbXBvIMOoIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIG1hZ2dpb3JlIGRpIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIG1pbm9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIklsIHZhbG9yZSBkaSBxdWVzdG8gY2FtcG8gZGV2ZSBlc3NlcmUgZGl2aXNpYmlsZSBwZXIgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlF1ZXN0byB2YWxvcmUgbm9uIMOoIHVuIG51bWVybyIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIlBhc3N3b3JkIGludmFsaWRhIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiTnVtZXJvIGRpIHRlbGVmb25vIGludmFsaWRvLCBzaSBhdHRlbmRvbm8gdmFsb3JpIGRlbCB0aXBvOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgbGEgc2VndWVudGUgc3RydXR0dXJhOiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlF1ZXN0byBjYW1wbyBub24gZGV2ZSBjb250ZW5lcmUgbWVubyBkaSB7MH0gY2FyYXR0ZXJpIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIlF1ZXN0byBjYW1wbyBub24gZGV2ZSBjb250ZW5lcmUgcGnDuSBkaSB7MH0gY2FyYXR0ZXJpIiwKCQkJCSJub25lTGFiZWwiOiAiTmVzc3VubyIsCgkJCQkiYWRkSXRlbUJ1dHRvbkxhYmVsIjogIkFnZ2l1bmdpIiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmltdW92aSIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJTdSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkdpw7kiCgkJCX0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGphcGFuZXNlIC0gamFwYW4KCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyAoewogICAgICAgICJpZCI6ICJiYXNlIiwKICAgICAgICAibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJqYV9KUCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAi44GT44Gu6aCF55uu44Gv5b+F6aCI44Gn44GZIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICLjgZPjga7poIXnm67jga/mraPjgZfjgYTlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIjHmnIgiLCAiMuaciCIsICIz5pyIIiwgIjTmnIgiLCAiNeaciCIsICI25pyIIiwgIjfmnIgiLCAiOOaciCIsICI55pyIIiwgIjEw5pyIIiwgIjEx5pyIIiwgIjEy5pyIIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICLnp5IiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIuWIhiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIuaZgiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAi5pelIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIuaciCIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIuW5tCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAi44GT44Gu6aCF55uu44Gv5Lu75oSP44Gu5Zue562U6aCF55uu44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSDjga/npoHmraLjgZXjgozjgabjgYTjgovlgKTjgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruS4reOBi+OCiemBuOOBsOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAguePvuWcqOOBruWApOOBryB7MX0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4iuW/heimgeOBp+OBmSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIumgheebruaVsOOBryB7MH0g5Lul5LiL44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICLlgKTjgYzkuIDmhI/jgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM6YWN5YiX44Gn44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIuOBk+OBrumgheebruOBruacgOWwj+WApOOBryB7MH0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIuOBk+OBrumgheebruOBruacgOWkp+WApOOBryB7MH0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIuOBk+OBrumgheebruOBruWApOOBryB7MH0g44KI44KK5bCP44GV44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIuOBk+OBrumgheebruOBruWApOOBryB7MH0g44KI44KK5aSn44GN44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLlgKTjga8gezB9IOOBq+OCiOOBo+OBpuWJsuOCiuWIh+OCjOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbDlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICLlgKTjgYwgezB9IOOBruWAjeaVsOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIuOBk+OBrumgheebruOBruWApOOBjOaVtOaVsOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QUpTT04iOiAi5YCk44GM5q2j44GX44GEIEpTT04g5b2i5byP44Gu5paH5a2X5YiX44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICLjgZPjga7poIXnm67jga8gezB9IOaWh+Wtl+S7peS4iuW/heimgeOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLjgZPjga7poIXnm67jga8gezB9IOaWh+Wtl+S7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFRpbWUiOiAi5pmC6ZaT44GM5q2j44GX44GP44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICLml6Xku5jjgYwgezB9IOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIuODoeODvOODq+OCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCBpbmZvQGNsb3VkY21zLmNvbSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIklQdjQg44Ki44OJ44Os44K544GM5q2j44GX44GP44GC44KK44G+44Gb44KT44CC5L6L44GI44GwIDE5Mi4xNjguMC4xIOOBruOCiOOBhuOBquW9ouW8j+OBp+OBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIuODkeOCueODr+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIumbu+ipseeVquWPt+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAoMTIzKSA0NTYtOTk5OSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIuOBk+OBrumgheebruOBryB7MH0g44Gu44OR44K/44O844Oz44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlVSTCDjgYzmraPjgZfjgYTlvaLlvI/jgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImtleU1pc3NpbmciOiAi5Zyw5Zuz44GM56m644Gu44Kt44O844KS5ZCr44KT44Gn44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJrZXlOb3RVbmlxdWUiOiAi5Zyw5Zuz44Gu44Kt44O844GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJPYmplY3R0b29GZXdQcm9wZXJ0aWVzIjogIuODl+ODreODkeODhuOCo+OBjOi2s+OCiuOBvuOBm+OCkyAoezB9IOOBjOW/heimgeOBp+OBmSkiLAogICAgICAgICAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIuODl+ODreODkeODhuOCoyAoezB9KSDjga7mnIDlpKfmlbDjgpLotoXjgYjjgabjgYTjgb7jgZkiLAogICAgICAgICAgICAgICAgIndvcmRMaW1pdEV4Y2VlZGVkIjogInswfSDjga7ljZjoqp7mlbDjga7liLbpmZDjgpLotoXjgYjjgabjgYTjgb7jgZkiLAogICAgICAgICAgICAgICAgImVkaXRvckFubm90YXRpb25zRXhpc3QiOiAi44Ko44OH44Kj44K/44GM5L+u5q2j44GZ44G544GN44Ko44Op44O844KS5aCx5ZGK44GX44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiOiAiNeahgeOBriBaaXBjb2RlICgjIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiOeahgeOBriBaaXBjb2RlICgjIyMjIy0jIyMjKSDjgafjga/jgYLjgorjgb7jgZvjgpMiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIG5vcndlZ2lhbiAtIG5vcndheQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgIm5iX05PIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJGZWx0ZXQgZXIgb2JsaWdhdG9yaXNrIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJWZXJkaWVuIGVyIHVneWxkaWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk1hcnMiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVzZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dHRlciIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlRpbWVyIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJEYWdlciIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNw6VuZWRlciIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIsOFciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGV0dGUgZmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZW5uZSB2ZXJkaWVuIGVyIGlra2UgdGlsbGF0dDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRmVsdGV0IG3DpSBpbm5laG9sZGUgZW4gYXYgZsO4bGdlbmRlIHZlcmRpZXI6IHswfS4gTsOldsOmcmVuZGUgdmVyZGkgZXI6IHsxfSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiRGV0IG1pbnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7hyc3RlIHRpbGxhdHRlIGFudGFsbGV0IGVsZW1lbnRlciBlciB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZlcmRpZW5lIGVyIGlra2UgdW5pa2UiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSWtrZSBlbiBsaXN0ZSBhdiB2ZXJkaWVyIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJVZ3lsZGlnIGRhdG9mb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIlVneWxkaWcgZS1wb3N0YWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZlcmRpZW4gZXIgaWtrZSBldCBoZWx0YWxsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVZ3lsZGlnIElQdjQtYWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEZW4gbWluc3RlIHRpbGxhdHRlIHZlcmRpZW4gZXIgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRlbiBzdMO4cnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWZXJkaWVuIG3DpSB2w6ZyZSBzdMO4cnJlIGVubiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgbWluZHJlIGVubiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRhbGxldCBtw6UgdsOmcmUgZGVsYmFydCBtZWQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlZlcmRpZW4gZXIgaWtrZSBldCB0YWxsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVWd5bGRpZyBwYXNzb3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVWd5bGRpZyB0ZWxlZm9ubnVtbWVyIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJGZWx0ZXQgbcOlIHbDpnJlIGkgZsO4bGdlbmRlIGZvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJEZXR0ZSBmZWx0ZXQgbcOlIG1pbnN0IGlubmVob2xkZSB7MH0gdGVnbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0ZSBmZWx0ZXQga2FuIG1ha3MgaW5uZWhvbGRlIHswfSB0ZWduIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBkdXRjaCAtIGJlbGdpdW0KCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJubF9CRSI6IHsKCQkJCXJlcXVpcmVkOiAiRGl0IHZlbGQgaXMgdmVycGxpY2h0IiwKCQkJCWludmFsaWQ6ICJEaXQgdmVsZCBpcyBvbmdlbGRpZyIsCgkJCQltb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYWFydCIsICJBcHJpbCIsICJNZWkiLCAiSnVuaSIsICJKdWx5IiwgIkF1Z3VzdHVzIiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlbiIsCgkJCQkJTUlOVVRFOiAibWludXRlbiIsCgkJCQkJSE9VUjogInVyZW4iLAoJCQkJCURBWTogImRhZ2VuIiwKCQkJCQlNT05USDogIm1hYW5kZW4iLAoJCQkJCVlFQVI6ICJqYXJlbiIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRGl0IHZlbGQgaXMgbmlldCBvcHRpb25lZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB6aWpuIHZlcmJvZGVuIHdhYXJkZW4uIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGl0IHZlbGQgbW9ldCDDqcOpbiB2YW4gdm9sZ2VuZGUgYmV2YXR0ZW4gOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJIZXQgbWluaW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkhldCBtYXhpbXVtIGFhbnRhbCBlbGVtZW50ZW4gaXMgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJEZSB3YWFyZGVuIHppam4gdW5pZWsiLAoJCQkJIm5vdEFuQXJyYXkiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBsaWpzdCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGUgZGF0dW0ga29tdCBuaWV0IG92ZXJlZW4gbWV0IGZvcm1hYXQgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiT25nZWxkaWcgZS1tYWlsYWRyZXMsIHZiLjogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdlaGVlbCBnZXRhbC4iLAoJCQkJImludmFsaWRJUHY0IjogIk9uZ2VsZGlnIElQdjQgYWRyZXMsIHZiLjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGUgbWluaW1hbGUgd2FhcmRlIHZvb3IgZGl0IHZlbGQgaXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRlIG1heGltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBncm90ZXIgemlqbiBkYW4gezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIkRlIHdhYXJkZSBtb2V0IGtsZWluZXIgemlqbiBkYW4gezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJEZSB3YWFyZGUgbW9ldCBkZWVsYmFhciB6aWpuIGRvb3IgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIkRlemUgd2FhcmRlIGlzIGdlZW4gZ2V0YWwuIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiT25nZWxkaWcgd2FjaHR3b29yZCIsCgkJCQkiaW52YWxpZFBob25lIjogIk9uZ2VsZGlnIHRlbGVmb29ubnVtbWVyLCB2YjogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkRpdCB2ZWxkIG1vZXQgb3ZlcmVlbmtvbWVuIG1ldCBwYXRyb29uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGl0IHZlbGQgbW9ldCBtaW5zdGVucyB7MH0gdGVrZW5zIGJldmF0dGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpdCB2ZWxkIG1vZXQgbWluZGVyIGRhbiB7MH0gdGVrZW5zIGJldmF0dGVuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBwb2xpc2ggLSBwb2xhbmQKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyAoewogICAgICAgICJpZCI6ICJiYXNlIiwKICAgICAgICAibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJwbF9QTCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiVG8gcG9sZSBqZXN0IHd5bWFnYW5lIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJUbyBwb2xlIGplc3QgbmllcHJhd2lkxYJvd2UiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlN0eWN6ZcWEIiwgIkx1dHkiLCAiTWFyemVjIiwgIkt3aWVjaWXFhCIsICJNYWoiLCAiQ3plcndpZWMiLCAiTGlwaWVjIiwgIlNpZXJwaWXFhCIsICJXcnplc2llxYQiLCAiUGHFumR6aWVybmlrIiwgIkxpc3RvcGFkIiwgIkdydWR6aWXFhCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5keSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXR5IiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiZ29kemlueSIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiZG5pIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1pZXNpxIVjZSIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogImxhdGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlRvIHBvbGUgbmllIGplc3Qgb3Bjam9uYWxuZSIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgZG96d29sb25hOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGplZG7EhSB6IG5hc3TEmXB1asSFY3ljaCB3YXJ0b8WbY2k6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltYWxuYSBsaWN6YmEgZWxlbWVudMOzdyB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiTWFrc3ltYWxuYSBsaWN6YmEgZWxlbWVudMOzdyB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJUZSB3YXJ0b8WbY2kgbmllIHPEhSB1bmlrYWxuZSIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgdGFibGljxIUiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIk5pZXBvcHJhd255IGZvcm1hdCBkYXR5OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJOaWVwb3ByYXdueSBhZHJlcyBlbWFpbCwgbi5wLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgbGljemLEhSBjYcWCa293aXTEhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiTmllcG9wcmF3bnkgYWRyZXMgSVB2NCwgbi5wLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiTWluaW1hbG5hIHdhcnRvxZvEhyBkbGEgdGVnbyBwb2xhIHd5bm9zaSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTWFrc3ltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIldhcnRvxZvEhyBkbGEgdGVnbyBwb2xhIG11c2kgYnnEhyB3acSZa3N6YSBuacW8IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgbW5pZWpzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIldhcnRvxZvEhyBtdXNpIGJ5xIcgcG9kemllbG5hIHByemV6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJXYXJ0b8WbxIcgbmllIGplc3QgbGljemLEhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIk5pZXBvcHJhd25lIGhhc8WCbyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk5pZXBvcHJhd255IG51bWVyIHRlbGVmb251LCBuLnAuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiVG8gcG9sZSBwb3dpbm5vIG1pZcSHIGZvcm1hdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgY28gbmFqbW5pZWogezB9IHpuYWvDs3ciLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBuYWp3ecW8ZWogezB9IHpuYWvDs3ciCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9ydHVndWVzZSAtIHBvcnR1Z2FsCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicHRfQlIiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkVzdGUgY2FtcG8gw6kgb2JyaWdhdMOzcmlvIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJFc3RlIGNhbXBvIMOpIGludsOhbGlkbyIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFuZWlybyIsICJGZXZlcmVpcm8iLCAiTWFyw6dvIiwgIkFicmlsIiwgIk1haW8iLCAiSnVuaG8iLCAiSnVsaG8iLCAiQWdvc3RvIiwgIlNldGVtYnJvIiwgIk91dHVicm8iLCAiTm92ZW1icm8iLCAiRGV6ZW1icm8iXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNlZ3VuZG9zIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dG9zIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiaG9yYXMiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRpYXMiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAibWVzZXMiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJhbm9zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJFc3RlIGNhbXBvIG7Do28gw6kgb3BjaW9uYWwiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IHPDo28gdmFsb3JlcyBwcm9pYmlkb3MiLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJFc3RlIGNhbXBvIGRldmUgdGVyIHVtIGRvcyBzZWd1aW50ZXMgdmFsb3JlczogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiTyBuw7ptZXJvIG3DrW5pbW8gZGUgZWxlbWVudG9zIMOpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk8gbsO6bWVybyBtw6F4aW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIk9zIHZhbG9yZXMgbsOjbyBzw6NvIMO6bmljb3MiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiRXN0ZSB2YWxvciBuw6NvIMOpIHVtYSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRXN0YSBkYXRhIG7Do28gdGVtIG8gZm9ybWF0byB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJFbmRlcmXDp28gZGUgZS1tYWlsIGludsOhbGlkbyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bSBuw7ptZXJvIGludGVpcm8iLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIkVuZGVyZcOnbyBJUHY0IGludsOhbGlkbywgZXg6IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk8gdmFsb3IgbcOtbmltbyBwYXJhIGVzdGUgY2FtcG8gw6kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk8gdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gw6kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIk8gdmFsb3IgZGVzdGUgY2FtcG8gZGV2ZSBzZXIgbWFpb3IgcXVlIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1lbm9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIk8gdmFsb3IgZGV2ZSBzZXIgZGl2aXPDrXZlbCBwb3IgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bSBuw7ptZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiU2VuaGEgaW52w6FsaWRhIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiTsO6bWVybyBkZSB0ZWxlZm9uZSBpbnbDoWxpZG8sIGV4OiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciBvIHBhZHLDo28gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJFc3RlIGNhbXBvIGRldmUgaW5jbHVpciBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkVzdGUgY2FtcG8gcG9kZSBpbmNsdWlyIG5vIG3DoXhpbW8gezB9IGNhcmFjdGVyZXMiLAoJCSJ0aHVtYm5haWwiOiAiTWluaWF0dXJhIiwKICAgICAgICAJImZpbGVuYW1lIjogIkFycXVpdm8iLAogICAgICAgIAkiZmlsZVNpemUiOiAiVGFtYW5obyhieXRlcykiLAogICAgICAgIAkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQ29tYW5kb3MiLAogICAgICAgIAkiY2hvb3NlRmlsZSI6ICJFc2NvbGhlciBhcnF1aXZvLi4uIiwKICAgICAgICAJImNob29zZUZpbGVzIjogIkVzY29saGVyIGFycXVpdm9zLi4uIiwKICAgICAgICAJImRyb3Bab25lU2luZ2xlIjogIkNsaXF1ZSBlbSBFc2NvbGhlciBvdSBhcnJhc3RlIHVtIGFycXVpdm8gYXF1aS4uLiIsCiAgICAgICAgCSJkcm9wWm9uZU11bHRpcGxlIjogIkNsaXF1ZSBlbSBFc2NvbGhlciBvdSBhcnJhc3RlIGFycXVpdm9zIGFxdWkuLi4iLAoJCSJmaWxlVG9vQmlnIjogIkFycXVpdm8gbXVpdG8gZ3JhbmRlOiAiLAogICAgICAgICJub25TZWxlY3RlZFRleHQiOiAiLSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gc3dlZGlzaCAtIHN3ZWRlbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInN2X1NFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJGw6RsdGV0IMOkciBvYmxpZ2F0b3Jpc2t0IiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJWw6RyZGV0IMOkciBmZWxha3RpZ3QiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFycyIsICJBcHJpbCIsICJNYWoiLCAiSnVuaSIsICJKdWxpIiwgIkF1Z3VzdGkiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dGVyIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAidGltbWFyIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkYWdhciIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtw6VuYWRlciIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIsOlciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGV0dGEgZsOkbHQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVzc2EgdsOkcmRlbiDDpHIgaW50ZSB0aWxsw6V0bmE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkbDpGx0ZXQgbcOlc3RlIGlubmVow6VsbGEgZXR0IGF2IGbDtmxqYW5kZSB2w6RyZGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEZXQgbWluc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO2cnN0YSB0aWxsw6V0bmEgYW50YWxldCBlbGVtZW50IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlbDpHJkZW5hIMOkciBpbnRlIHVuaWthIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkludGUgZW4gbGlzdGEgYXYgdsOkcmRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmVsYWt0aWd0IGZvcm1hdCBmw7ZyIGRhdHVtOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJPZ2lsdGlnIGUtcG9zdGFkcmVzcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIlbDpHJkZXQgw6RyIGludGUgZXR0IGhlbHRhbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiT2dpbHRpZyBJUHY0LWFkcmVzcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEZXQgbWluc3RhIHRpbGzDpXRuYSB2w6RyZGV0IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSB2w6RyZGV0IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVsOkcmRldCBtw6VzdGUgdmFyYSBzdMO2cnJlIMOkbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVsOkcmRldCBtw6VzdGUgdmFyYSBtaW5kcmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAiVGFsZXQgbcOlc3RlIHZhcmEgZGVsYmFydCBtZWQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlbDpHJkZXQgw6RyIGludGUgZXR0IHRhbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIk9naWx0aWd0IGzDtnNlbm9yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk9naWx0aWd0IHRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkbDpGx0ZXQgbcOlc3RlIHZhcmEgaSBmw7ZsamFuZGUgZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRldHRhIGbDpGx0IG3DpXN0ZSBpbm5laMOlbGxhIG1pbnN0IHswfSB0ZWNrZW4iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGEgZsOkbHQgZsOlciBpbm5laMOlbGxhIGjDtmdzdCB7MH0gdGVja2VuIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBjaGluZXNlIC0gY2hpbmEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJ6aF9DTiI6IHsKCQkJCXJlcXVpcmVkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjQ1MTc7JiMzOTAzNTsiLAoJCQkJaW52YWxpZDogIiYjMjc0OTI7JiMyMjQ5NTsmIzE5OTgxOyYjMjE1MTI7JiMyNjY4NDsiLAoJCQkJbW9udGhzOiBbIiYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMDEwODsmIzI2Mzc2OyIsICImIzE5OTc3OyYjMjYzNzY7IiwgIiYjMjIyMzU7JiMyNjM3NjsiLCAiJiMyMDExNjsmIzI2Mzc2OyIsICImIzIwODQ1OyYjMjYzNzY7IiwgIiYjMTk5NzE7JiMyNjM3NjsiLCAiJiMyMDg0MzsmIzI2Mzc2OyIsICImIzIwMDYxOyYjMjYzNzY7IiwgIiYjMjEzMTM7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzE5OTY4OyYjMjYzNzY7IiwgIiYjMjEzMTM7JiMyMDEwODsmIzI2Mzc2OyJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAiJiMzMTE4NjsiLAoJCQkJCU1JTlVURTogIiYjMjA5OTg7IiwKCQkJCQlIT1VSOiAiJiMyNjEwMjsiLAoJCQkJCURBWTogIiYjMjYwODU7IiwKCQkJCQlNT05USDogIiYjMjYzNzY7IiwKCQkJCQlZRUFSOiAiJiMyNDE4MDsiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM4NzUwOyYjMjAyMTk7JiMzNjg3MzsiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzY3NTU7JiMyMDgzNzsmIzIxMjUzOyYjMjUzMjQ7IHswfS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICImIzIwODAxOyYjMzU3Njg7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiJiMyNjM2ODsmIzIzNTY3OyYjMjAwMTA7JiMyNTk2ODsgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjAwMTA7JiMyNTk2ODsgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICImIzM2NzU1OyYjMjA4Mzc7JiMyMDU0MDsmIzE5OTgxOyYjMjk0MjA7JiMyOTMwNTsiLAoJCQkJIm5vdEFuQXJyYXkiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjU5Njg7JiMzMjQ1MjsiLAoJCQkJImludmFsaWREYXRlIjogIiYjMjYwODU7JiMyNjM5OTsmIzI2Njg0OyYjMjQzMzU7JiMyMjI0MDsmIzM1ODEzOyYjMjYxNTk7IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIiYjMjAyMzQ7JiMyMjk2OTsmIzIwNzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzE5OTgxOyYjMjM1NDU7LCBleDogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk3MjsmIzI1OTY4Oy4iLAoJCQkJImludmFsaWRJUHY0IjogIiYjMTk5ODE7JiMyNjE1OTsmIzIxNTEyOyYjMjc4NjE7SVAmIzIyMzIwOyYjMjIzMzY7LCBleDogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiJiMyNjM2ODsmIzIzNTY3OyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIiYjMjYzNjg7JiMyMjgyMzsmIzIwNTQwOyYjMjYxNTk7IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzIyODIzOyYjMjAxMTA7IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzIzNTY3OyYjMjAxMTA7IHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiJiMyMDU0MDsmIzI0NTE3OyYjMzkwMzU7JiMzMzAyMTsmIzM0OTg3OyB7MH0gJiMyNTk3MjsmIzM4NTAwOyIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzIzMzgzOy4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICImIzM4NzUwOyYjMjc4NjE7JiMyMzQ5NDsmIzMwNzIxOyIsCgkJCQkiaW52YWxpZFBob25lIjogIiYjMzg3NTA7JiMyNzg2MTsmIzMwMDA1OyYjMzU4MDU7JiMyMTQ5NTsmIzMwNzIxOywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICImIzI3NDkyOyYjMjI0OTU7JiMzOTAzNTsmIzI2Mzc3OyYjMjY2ODQ7JiMyNDMzNTsgezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICImIzI3NDkyOyYjMjI0OTU7JiMzMzI2NzsmIzIzNTY5OyYjMzgyNzE7JiMyNDIzMDsgezB9IiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzI2MzY4OyYjMjI4MTA7JiMzODI3MTsmIzI0MjMwOyB7MH0iCgkJCX0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CgovKioKICogV2ViIFRoZW1lICgid2ViIikKICoKICogRGVmaW5lcyB0aGUgZGVmYXVsdCB3ZWIgdGhlbWUgZm9yIHB1cmUgSFRNTDUgZm9ybXMuCiAqCiAqIFRoZSB2aWV3cyBhcmU6CiAqCiAqICAgIHdlYi12aWV3CiAqICAgIHdlYi1lZGl0CiAqICAgIHdlYi1jcmVhdGUKICoKICogVGhpcyB0aGVtZSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgdmlldzoKICoKICogICAgewogKiAgICAgICAidWkiOiAid2ViIiwKICogICAgICAgInR5cGUiOiBudWxsIHwgInZpZXciIHwgImVkaXQiIHwgImNyZWF0ZSIKICogICAgfQogKgogKi8KCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbmplY3RvciAoIndlYiIpLgogICAgICoKICAgICAqIFRoZSBob29rcyBwcm92aWRlZCBoZXJlIGFyZSBlbXB0eS4gIFRoZSB3ZWIgdmlldyBmYWxscyBiYWNrIG9uIHN0cmFpZ2h0IEhUTUw1IGZvciBwcmV0dHkgbXVjaCBldmVyeXRoaW5nLgogICAgICogQXMgc3VjaCwgdGhlc2UgbW9zdGx5IHNlcnZlIGFzIGEgcmVmZXJlbmNlIGZvciBleHRlbnNpb24uCiAgICAgKi8KICAgIHZhciBjYWxsYmFja3MgPSB7fTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgZmllbGQgcmVuZGVycwogICAgY2FsbGJhY2tzWyJmaWVsZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udHJvbCByZW5kZXJzCiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyBhZnRlciBhIGNvbnRhaW5lciByZW5kZXJzCiAgICBjYWxsYmFja3NbImNvbnRhaW5lciJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgZm9ybSByZW5kZXJzCiAgICBjYWxsYmFja3NbImZvcm0iXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIHJlcXVpcmVkCiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyBvcHRpb25hbAogICAgY2FsbGJhY2tzWyJvcHRpb25hbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVhZG9ubHkKICAgIGNhbGxiYWNrc1sicmVhZG9ubHkiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyBlbmFibGVkCiAgICBjYWxsYmFja3NbImVuYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBjYWxsZWQgd2hlbiB2YWxpZGl0eSBzdGF0ZSBmb3IgYSBmaWVsZCBpcyBiZWluZyBjbGVhcmVkCiAgICBjYWxsYmFja3NbImNsZWFyVmFsaWRpdHkiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGludmFsaWQKICAgIGNhbGxiYWNrc1siaW52YWxpZCJdID0gZnVuY3Rpb24oaGlkZGVuKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYSB2YWxpZAogICAgY2FsbGJhY2tzWyJ2YWxpZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBhIG1lc3NhZ2UgdG8gYW4gaW52YWxpZCBmaWVsZAogICAgY2FsbGJhY2tzWyJhZGRNZXNzYWdlIl0gPSBmdW5jdGlvbihpbmRleCwgbWVzc2FnZUlkLCBtZXNzYWdlVGV4dCwgaGlkZGVuKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHRvIHJlbW92ZSBhbGwgbWVzc2FnZXMgZm9yIGEgZmllbGQKICAgIGNhbGxiYWNrc1sicmVtb3ZlTWVzc2FnZXMiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlQnV0dG9uIl0gPSBmdW5jdGlvbihidXR0b24pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgd2hlbiBhIGJ1dHRvbiBpcyBiZWluZyBkaXNhYmxlZAogICAgY2FsbGJhY2tzWyJkaXNhYmxlQnV0dG9uIl0gPSBmdW5jdGlvbihidXR0b24pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIG9yIHJlbW92ZSB0aGUgYXJyYXkgdG9vbGJhciBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJhcnJheVRvb2xiYXIiXSA9IGZ1bmN0aW9uKHJlbW92ZSkKICAgIHsKICAgICAgICAvLyBOT1RFOiB0aGlzID0gYXJyYXkgZmllbGQKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3dhcCBleGlzdGluZyB0b29sYmFyIHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgZXhpc3RpbmdUb29sYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS10b29sYmFyW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVG9vbGJhci5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX1RPT0xCQVJfRklFTERfSUQgKyAiPSciICsgc2VsZi5nZXRJZCgpICsgIic+PC9kaXY+Iik7CgoJCQkJaWYgKHNlbGYub3B0aW9ucy50b29sYmFyUG9zaXRpb24gJiYgc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiA9PT0gImJvdHRvbSIpIHsKCQkJCQl2YXIgY29udGFpbmVyTGFzdEl0ZW0gPSAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwoJCQkJCWlmIChjb250YWluZXJMYXN0SXRlbS5sZW5ndGggPiAwKXsKCQkJCQkJY29udGFpbmVyTGFzdEl0ZW0uYWZ0ZXIoaW5zZXJ0aW9uUG9pbnRFbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWV4aXN0aW5nVG9vbGJhci5iZWZvcmUoaW5zZXJ0aW9uUG9pbnRFbCk7CgkJCQl9CgkJCQlleGlzdGluZ1Rvb2xiYXIucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gZmluZCB0aGUgdGhlIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRvb2xiYXIKICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItYXJyYXktdG9vbGJhciIsIHNlbGYpOwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9vbGJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyI6IHNlbGYudG9vbGJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMudG9vbGJhclN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAidG9vbGJhclBvc2l0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUodG9vbGJhcik7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSBhY3Rpb25iYXJzIGFsbCBjaGlsZHJlbiBvZiBhbiBhcnJheSBmaWVsZAogICAgY2FsbGJhY2tzWyJhcnJheUFjdGlvbmJhcnMiXSA9IGZ1bmN0aW9uKHJlbW92ZSkKICAgIHsKICAgICAgICAvLyBOT1RFOiB0aGlzID0gYXJyYXkgZmllbGQKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAvLyB3YWxrIG92ZXIgYWxsIGNoaWxkcmVuCiAgICAgICAgZm9yICh2YXIgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2NoaWxkSW5kZXhdOwogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZElkID0gY2hpbGRGaWVsZC5nZXRJZCgpOwoKICAgICAgICAgICAgaWYgKHJlbW92ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgZXhpc3RpbmcgYWN0aW9uIGJhciBmb3IgdGhpcyBjaGlsZAogICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBvbmUsIHJlbW92ZSBpdCBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0FjdGlvbmJhciA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD0nIiArIGNoaWxkRmllbGRJZCArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKCI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgY2hpbGRGaWVsZC5uYW1lICsgIic+PC9kaXY+Iik7CgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbmJhci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZpbmQgb25lLCBiaW5kIGluIHRoZSBhY3Rpb24gdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgY2hpbGRGaWVsZC5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItYXJyYXktYWN0aW9uYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXIgPSBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2hpbGRGaWVsZC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRJZCI6IGNoaWxkRmllbGQuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtSW5kZXgiOiBjaGlsZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhclN0eWxlIjogc2VsZi5vcHRpb25zLmFjdGlvbmJhclN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoYWN0aW9uYmFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgLy8gZmlyZWQgYWZ0ZXIgYSB0ZXh0IGZpZWxkIGlzIGRlZW1lZCB0byBiZSBhdXRvY29tcGxldGUtYWJsZQogICAgY2FsbGJhY2tzWyJhdXRvY29tcGxldGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CgoKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiIjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJhZGRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZXhwYW5kZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbInRhYmxlIl0gPSAiIjsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJwYXJlbnQiOiAiYmFzZSIsCiAgICAgICAgInR5cGUiOiAiZGlzcGxheSIsCiAgICAgICAgInVpIjogIndlYiIsCiAgICAgICAgInRpdGxlIjogIkRlZmF1bHQgSFRNTDUgZGlzcGxheSB2aWV3IiwKICAgICAgICAiZGlzcGxheVJlYWRvbmx5IjogdHJ1ZSwKICAgICAgICAidGVtcGxhdGVzIjoge30sCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJob3Jpem9udGFsIjogZmFsc2UKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBlZGl0IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWVkaXQiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgInRpdGxlIjogIkRlZmF1bHQgSFRNTDUgY3JlYXRlIHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiBmYWxzZSwKICAgICAgICAidGVtcGxhdGVzIjoge30sCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1jcmVhdGUtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItY3JlYXRlIiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBUd2l0dGVyIEJvb3RzdHJhcCBUaGVtZSAoImJvb3RzdHJhcCIpCiAqCiAqIERlZmluZXMgdGhlIEFscGFjYSB0aGVtZSBmb3IgVHdpdHRlciBCb290c3RyYXAgdjMuCiAqCiAqIFRoZSB2aWV3cyBhcmU6CiAqCiAqICAgIGJvb3RzdHJhcC12aWV3CiAqICAgIGJvb3RzdHJhcC1lZGl0CiAqICAgIGJvb3RzdHJhcC1jcmVhdGUKICoKICogVGhpcyB0aGVtZSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgdmlldzoKICoKICogICAgewogKiAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICogICAgICAgInR5cGUiOiAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvLyBjdXN0b20gc3R5bGVzCiAgICB2YXIgc3R5bGVzID0ge307CiAgICBzdHlsZXNbImJ1dHRvbiJdID0gImJ0biBidG4tZGVmYXVsdCI7CiAgICBzdHlsZXNbInNtYWxsQnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLXBsdXMtc2lnbiI7CiAgICBzdHlsZXNbInJlbW92ZUljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLW1pbnVzLXNpZ24iOwogICAgc3R5bGVzWyJ1cEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tdXAiOwogICAgc3R5bGVzWyJkb3duSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duIjsKICAgIHN0eWxlc1siZXhwYW5kZWRJY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93biI7CiAgICBzdHlsZXNbImNvbGxhcHNlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1yaWdodCI7CiAgICBzdHlsZXNbInRhYmxlIl0gPSAidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI7CgogICAgLy8gY3VzdG9tIGNhbGxiYWNrcwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgY2FsbGJhY2tzWyJyZXF1aXJlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcyBnZXQgYSBsaXR0bGUgc3RhciBpbiB0aGVpciBsYWJlbAogICAgICAgIHZhciBsYWJlbCA9ICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKTsKICAgICAgICAkKCc8c3BhbiBjbGFzcz0iYWxwYWNhLWljb24tcmVxdWlyZWQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGFyIj48L3NwYW4+JykucHJlcGVuZFRvKGxhYmVsKTsKCiAgICB9OwogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGNvbnRyb2wgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udHJvbEZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmdldEZpZWxkRWwoKSkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udGFpbmVyIGZpZWxkLCBhZGQgY2xhc3MgImhhcy1lcnJvciIKICAgICAgICBpZiAodGhpcy5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmdldEZpZWxkRWwoKSkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgIH0KICAgICAgICAqLwoKICAgIH07CiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gdmFsaWQgZmllbGRzIHJlbW92ZSB0aGUgY2xhc3MgJ2hhcy1lcnJvcicKICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJyk7CiAgICB9OwogICAgY2FsbGJhY2tzWyJjb250cm9sIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gY29udHJvbHMgZ2V0IHNvbWUgc3BlY2lhbCBmb3JtYXR0aW5nCgogICAgICAgIC8vIGZpZWxkRWwKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwoKICAgICAgICAvLyBjb250cm9sRWwKICAgICAgICB2YXIgY29udHJvbEVsID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgLy8gYWxsIGNvbnRyb2xzIGdldCB0aGUgImZvcm0tY29udHJvbCIgY2xhc3MgaW5qZWN0ZWQKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikuYWRkQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgidGV4dGFyZWEiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJzZWxlY3QiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgLy8gZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9ZmlsZV0iKS5yZW1vdmVDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKCiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0eXBlID09IGNvbG9yLCByZW1vdmUgZm9ybS1jb250cm9sCiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAiY29sb3IiKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dCIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFueSBjaGVja2JveCBpbnB1dHMgZ2V0IHRoZSAiY2hlY2tib3giIGNsYXNzIG9uIHRoZWlyIGNoZWNrYm94CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCJjaGVja2JveCIpOwogICAgICAgIC8vIGFueSByYWRpbyBpbnB1dHMgZ2V0IHRoZSAicmFkaW8iIGNsYXNzIG9uIHRoZWlyIHJhZGlvCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpbyIpOwoKICAgICAgICAvLyBpZiBmb3JtIGhhcyAiZm9ybS1pbmxpbmUiIGNsYXNzLCB0aGVuIHJhZGlvIGFuZCBjaGVja2JveCBsYWJlbHMgZ2V0IGlubGluZSBjbGFzc2VzCiAgICAgICAgaWYgKCQoZmllbGRFbCkucGFyZW50cygiZm9ybSIpLmhhc0NsYXNzKCJmb3JtLWlubGluZSIpKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY2hlY2tib3hlcwogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94LWlubGluZSIpOwoKICAgICAgICAgICAgLy8gcmFkaW9zCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1yYWRpb10iKS5wYXJlbnQoKS5hZGRDbGFzcygicmFkaW8taW5saW5lIik7CiAgICAgICAgfQoKICAgICAgICAvLyBhbGwgY29udHJvbCBsYWJlbHMgZ2V0IGNsYXNzICJjb250cm9sLWxhYmVsIgogICAgICAgICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKS5hZGRDbGFzcygiY29udHJvbC1sYWJlbCIpOwoKICAgICAgICAvLyBpZiBpbiBob3Jpem9udGFsIG1vZGUsIGFkZCBhIHdyYXBwZXIgZGl2IChjb2wtc20tOSkgYW5kIGxhYmVsIGdldHMgKGNvbC1zbS0zKQogICAgICAgIGlmICh0aGlzLnZpZXcuaG9yaXpvbnRhbCkKICAgICAgICB7CiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKS5hZGRDbGFzcygiY29sLXNtLTMiKTsKCiAgICAgICAgICAgIC8vYWxpZ24gaGVscCB0ZXh0IHdpdGggaW5wdXQuCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiLmhlbHAtYmxvY2siKS5hZGRDbGFzcygiY29sLXNtLW9mZnNldC0zIGNvbC1zbS05Iik7CgogICAgICAgICAgICB2YXIgd3JhcHBlciA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2xhc3MoImNvbC1zbS05Iik7CgogICAgICAgICAgICAkKGNvbnRyb2xFbCkuYWZ0ZXIod3JhcHBlcik7CiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kKGNvbnRyb2xFbCk7CgogICAgICAgICAgICAkKGZpZWxkRWwpLmFwcGVuZCgiPGRpdiBzdHlsZT0nY2xlYXI6Ym90aDsnPjwvZGl2PiIpOwogICAgICAgIH0KICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRhaW5lciJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBjb250YWluZXJFbCA9IHRoaXMuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImZvcm0taG9yaXpvbnRhbCIpOwogICAgICAgIH0KICAgIH07CiAgICBjYWxsYmFja3NbImZvcm0iXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZm9ybUVsID0gdGhpcy5nZXRGb3JtRWwoKTsKCiAgICAgICAgLy8gdXNlIHB1bGwtcmlnaHQgZm9yIGZvcm0gYnV0dG9ucwogICAgICAgIC8vJChmb3JtRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b25zLWNvbnRhaW5lciIpLmFkZENsYXNzKCJwdWxsLXJpZ2h0Iik7CiAgICB9OwogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgICAgICAkKGJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgICAgICAkKGJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbGxhcHNpYmxlIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKICAgICAgICB2YXIgbGVnZW5kRWwgPSAkKGZpZWxkRWwpLmZpbmQoImxlZ2VuZCIpLmZpcnN0KCk7CiAgICAgICAgdmFyIGFuY2hvckVsID0gJCgiW2RhdGEtdG9nZ2xlPSdjb2xsYXBzZSddIiwgbGVnZW5kRWwpOwogICAgICAgIGlmICgkKGFuY2hvckVsKS5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICAgICAgLy8gY29udGFpbmVyIGlkCiAgICAgICAgICAgIHZhciBpZCA9ICQoY29udGFpbmVyRWwpLmF0dHIoImlkIik7CiAgICAgICAgICAgIGlmICghaWQpIHsKICAgICAgICAgICAgICAgIGlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmF0dHIoImlkIiwgaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgdXAgY29udGFpbmVyIHRvIGJlIGNvbGxhcHNpYmxlCiAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmFkZENsYXNzKCJjb2xsYXBzZSIpOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb2xsYXBzZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmFkZENsYXNzKCJpbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgdXAgbGVnZW5kIGFuY2hvcgogICAgICAgICAgICBpZiAoISQoYW5jaG9yRWwpLmF0dHIoImRhdGEtdGFyZ2V0IikpIHsKICAgICAgICAgICAgICAgICQoYW5jaG9yRWwpLmF0dHIoImRhdGEtdGFyZ2V0IiwgIiMiICsgaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKGFuY2hvckVsKS5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoImN1cnNvciIsICJwb2ludGVyIik7CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfTsKCiAgICAvLyB0YWJsZS1jb250cm9sIGNhbGxiYWNrcwogICAgY2FsbGJhY2tzWyJ0YWJsZUhlYWRlclJlcXVpcmVkIl0gPSBmdW5jdGlvbihzY2hlbWEsIG9wdGlvbnMsIGRvbUVsKQogICAgewogICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcyBnZXQgYSBsaXR0bGUgc3RhciBpbiB0aGVpciBsYWJlbAogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8oZG9tRWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyT3B0aW9uYWwiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInR5cGUiOiAiZGlzcGxheSIsCiAgICAgICAgInVpIjogImJvb3RzdHJhcCIsCiAgICAgICAgInRpdGxlIjogIkRpc3BsYXkgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAidGVtcGxhdGVzIjoge30KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZGlzcGxheS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZWRpdCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiZWRpdCIsCiAgICAgICAgInVpIjogImJvb3RzdHJhcCIsCiAgICAgICAgInRpdGxlIjogIkVkaXQgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAidGVtcGxhdGVzIjoge30KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZWRpdC1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtY3JlYXRlIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAidGl0bGUiOiAiQ3JlYXRlIFZpZXcgZm9yIEJvb3RzdHJhcCAzIiwKICAgICAgICAidHlwZSI6ICJjcmVhdGUiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJib290c3RyYXAtY3JlYXRlIiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCiAgICAgICAgCiAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0VmlldyA9ICdib290c3RyYXAnOwogICAgICAgIAogICAgICAgIHJldHVybiBBbHBhY2E7CgogICAgCgp9KSk7Cg==</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigndmFsJywgJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCQkJZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CQkJCgkJfSwgMjAwMCk7Cgl9CgkKCWNhcnJlZ2FDdXN0b21Qcm9wcyhhY3RpdmVRdWV1ZSk7Cn07CgoKdmFyIHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYyA9IGZ1bmN0aW9uKGZvcm0pIHsKCWZvcm1PcHRpb25zID0gZm9ybS5vcHRpb25zLmZpZWxkczsKCWZvcm1BbHBhY2EgPSBmb3JtOwoJCglpZiAoZm9ybSkgewoJCSQoJy5zZWxlY3RwaWNrZXInKS5zZWxlY3RwaWNrZXIoKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.14</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.14">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-07-26 06:07:58</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbD4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQkJPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9Ii9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBhdXRoZW50aWNhdGUiKSB8IGh0bWwgJV08L0E+ClslIFJlbmRlckJsb2NrRW5kKCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCQkKCTwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD0iZm9ybVBhbmVsIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgVHJhbnNsYXRlKCJQbGVhc2UgZmlsbCB0aGUgZm9sbG93aW5nIGZvcm0gdG8gb3BlbiB5b3VyIHRpY2tldCIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSIgaWQ9ImZvcm1UaWNrZXQiPgoJCgk8L2Rpdj4KPC9kaXY+CiAKIDxzY3JpcHQgc3JjPSJbJSBDb25maWcoIkZyb250ZW5kOjpSaWNoVGV4dFBhdGgiKSAlXWNrZWRpdG9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCgkkLmFscGFjYS5zZXREZWZhdWx0TG9jYWxlKChuYXZpZ2F0b3IubGFuZ3VhZ2VzID8gbmF2aWdhdG9yLmxhbmd1YWdlc1swXSA6IChuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkpLnJlcGxhY2UoIi0iLCJfIikpOwoJCQkKCSQuYWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewoJCSJub25lTGFiZWwiOiAiLSIsCgl9KTsKCQoJJCgiI1NlcnZpY2VJRCIpLmNoYW5nZShmdW5jdGlvbigpIHsKCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CgkgICAJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsKICAgCQl9IGVsc2UgewogICAJCQlkZXN0cnVpckZvcm0oKTsKICAgCQkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoIiIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuaGlkZSgpOwogICAJCX0gIAkKICAJfSk7CiAgCQogICAJaWYgKCQoIiNTZXJ2aWNlSUQiKS5oYXMoJ1tzZWxlY3RlZF0nKSkgewogIAkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewogIAkJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOyAgCQkJICAJCQkKICAJCX0KICAJfQogIAkKICAJJCgiI1Jlc3BvbnNpdmVGb290ZXIiKS5yZW1vdmUoKTsKPC9zY3JpcHQ+ICAgIApbJSBFTkQgJV0=</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KICAJCQk8YSAgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgaHJlZj0iL290cnMvWyUgRGF0YS5Nb2R1bGUgJV0ucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFslIERhdGEuUHVibGljTW9kZSAlXSI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQiKSB8IGh0bWwgJV08L2E+CgkJPC9kaXY+CQkKCTwvZGl2PgkJCjwvZGl2PgoJClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KWyUgRU5EICVd</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgRW5jb2RlIHF3KCBlbmNvZGVfdXRmOCBkZWNvZGVfdXRmOCApOwp1c2UgSlNPTiBxdyhlbmNvZGVfanNvbiBkZWNvZGVfanNvbik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lTDo6U3lzdGVtOjpMb2ciLAoiS2VybmVMOjpTeXN0ZW06OlRpY2tldCIsCiJLZXJuZUw6OlN5c3RlbTo6VHlwZSIsCiJLZXJuZWw6OlN5c3RlbTo6WUFNIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9ucyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWF9Owp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIHN5c3RlbSBmaWVsZCB2YWx1ZXMgKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIFJlcGxhY2VPVFJTVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApID0gJFNlbGYtPkdldE9UUlNTZXJ2aWNlc0RhdGEoKTsKCSRzY2hlbWEgID1+IHMvT1RSU19zZXJ2aWNlX3ZhbHVlcy8kc2VydmljZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3NlcnZpY2VfbGFiZWxzLyRzZXJ2aWNlTmFtZXMvZzsKCglteSAoICR0eXBlTmFtZXMsICR0eXBlSURzICkgPSAkU2VsZi0+R2V0T1RSU1R5cGVzRGF0YShVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0pOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3R5cGVfdmFsdWVzLyR0eXBlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfdHlwZV9sYWJlbHMvJHR5cGVOYW1lcy9nOwoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIHNlcnZpY2VzIGluZm8gKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIEdldE9UUlNTZXJ2aWNlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzZXJ2aWNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJbXkgJXNlcnZpY2VMaXN0ID0gJHNlcnZpY2VzLT5TZXJ2aWNlTGlzdCggVmFsaWQgPT4gMSwgVXNlcklEID0+ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpICk7CglteSAkc2VydmljZU5hbWVzID0gIiI7CglteSAkc2VydmljZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICRzZXJ2aWNlTGlzdHskYX0gY21wICRzZXJ2aWNlTGlzdHskYn0gKSB9IGtleXMgJXNlcnZpY2VMaXN0ICkgewoJCSRzZXJ2aWNlTmFtZXMgLj0gIlwiJHNlcnZpY2VMaXN0eyRffVwiLCI7CgkJJHNlcnZpY2VJRHMgICAuPSAiJF8sIjsKCX0KCSRzZXJ2aWNlTmFtZXMgPSBzdWJzdHIoJHNlcnZpY2VOYW1lcywgMCwgLTEpOwoJJHNlcnZpY2VJRHMgPSBzdWJzdHIoJHNlcnZpY2VJRHMsIDAsIC0xKTsKCXJldHVybiAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICk7Cn0KCj1oZWFkCkdldCBPVFJTIHRpY2tldCB0eXBlcyAKPWN1dApzdWIgR2V0T1RSU1R5cGVzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCglteSAldHlwZUxpc3QgID0gJHRpY2tldE9iamVjdC0+VGlja2V0VHlwZUxpc3QoIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwoJbXkgJHR5cGVOYW1lcyA9ICIiOwoJbXkgJHR5cGVJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdHlwZUxpc3R7JGF9IGNtcCAkdHlwZUxpc3R7JGJ9ICkgfSBrZXlzICV0eXBlTGlzdCApIHsKCQlpZiAoaW5kZXgoJHR5cGVMaXN0eyRffSwgJzo6JykgPT0gLTEpIHsKCQkJJHR5cGVOYW1lcyAuPSAiXCIkdHlwZUxpc3R7JF99XCIsIjsKCQkJJHR5cGVJRHMgICAuPSAiJF8sIjsKCQl9Cgl9CgkKCSR0eXBlTmFtZXMgPSBzdWJzdHIoJHR5cGVOYW1lcywgMCwgLTEpOwoJJHR5cGVJRHMgPSBzdWJzdHIoJHR5cGVJRHMsIDAsIC0xKTsKCQoJcmV0dXJuICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBkeW5hbWljIGZpZWxkcwo9Y3V0CnN1YiBSZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAkZGZpZWxkcyAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15IEBkZmllbGRMaXN0ID0gQHsgJGRmaWVsZHMtPkR5bmFtaWNGaWVsZExpc3RHZXQoIFZhbGlkID0+IDEgKSB9OwoKCWZvcmVhY2ggKEBkZmllbGRMaXN0KSB7CgkJbXkgJGNhbXBvID0gJF87CgoJCW15ICRuYW1lICAgICAgICAgID0gJGNhbXBvLT57TmFtZX07CgkJbXkgJGNvbmZpZyAgICAgICAgPSAkY2FtcG8tPntDb25maWd9OwoJCW15ICR0eXBlICAgICAgICAgID0gJGNhbXBvLT57RmllbGRUeXBlfTsKCQlteSAkaWRGaWVsZFZhbHVlcyA9ICJERl8iIC4gJG5hbWUgLiAiX3ZhbHVlcyI7CgkJbXkgJGlkRmllbGRMYWJlbHMgPSAiREZfIiAuICRuYW1lIC4gIl9sYWJlbHMiOwoJCWlmICggJHR5cGUgZXEgIkRyb3Bkb3duIiApIHsKCQkJbXkgKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApID0gJFNlbGYtPkdldER5bmFtaWNGaWVsZFZhbHVlcyggQ29uZmlnREYgPT4gJGNvbmZpZyApOwoJCQkkc2NoZW1hICA9fiBzLyRpZEZpZWxkVmFsdWVzLyRkZlZhbHVlcy9nOwoJCQkkb3B0aW9ucyA9fiBzLyRpZEZpZWxkTGFiZWxzLyRkZkxhYmVscy9nOwoJCX0KCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBkeWFubWljIGZpZWxkIHZhbHVlcwo9Y3V0CnN1YiBHZXREeW5hbWljRmllbGRWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRjb25maWcgPSAkUGFyYW17Q29uZmlnREZ9OwoJbXkgJHZhbHVlcyA9ICRjb25maWctPntQb3NzaWJsZVZhbHVlc307CgoJbXkgJGRmVmFsdWVzID0gIiI7CglteSAkZGZMYWJlbHMgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHZhbHVlcy0+eyRhfSBjbXAgJHZhbHVlcy0+eyRifSApIH0ga2V5cyAleyR2YWx1ZXN9ICkgewoJCSRkZlZhbHVlcyAuPSAiXCIkX1wiLCI7CgkJJGRmTGFiZWxzIC49ICJcIiR2YWx1ZXMtPnskX31cIiwiOwoJfQoKCSRkZlZhbHVlcyA9IHN1YnN0cigkZGZWYWx1ZXMsIDAsIC0xKTsKCSRkZkxhYmVscyA9IHN1YnN0cigkZGZMYWJlbHMsIDAsIC0xKTsKCXJldHVybiAoICRkZlZhbHVlcywgJGRmTGFiZWxzICk7Cgp9Cgo9aGVhZApCdWlsZHMgc2VydmljZSBjaG9vc2luZyBjb21ibwo9Y3V0CnN1YiBCdWlsZFNlcnZpY2VzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJFJlc3RyaWN0ZWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2UiKTsKCW15ICRQdWJsaWMgPSAkUGFyYW17UHVibGljfTsKCQoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCW15ICVTZXJ2aWNlcyA9ICgpOwoKCWlmICggISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCSVTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCggVXNlcklEID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLCApOwoJfQoJZWxzZSB7CgkJJVNlcnZpY2VzID0KCQkgICRRdWV1ZVNlcnZpY2VPYmplY3QtPkdldFNlcnZpY2VMaXN0KCBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLCApOwoJfQoJbXkgQFNlcnZpY2VzQ29tYm8gPSAoKTsKCQoJbXkgQHJlc3RyaWN0ZWRTZXJ2aWNlcyA9ICRSZXN0cmljdGVkT2JqZWN0LT5HZXRSZXN0cmljdGVkU2VydmljZXMoKTsKCQoJZm9yIG15ICRzZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlcyApIHsKCQlpZiAoIGdyZXAgeyBpbmRleCggJFNlcnZpY2VzeyRffSwgJFNlcnZpY2VzeyRzZXJ2aWNlSUR9IC4gIjo6IiApID49IDAgfSAoIGtleXMgJVNlcnZpY2VzICkgKSB7CQkJCgkJCWlmICgoISAkUHVibGljKSB8fCAoISAoICRzZXJ2aWNlSUQgfn4gQHJlc3RyaWN0ZWRTZXJ2aWNlcyApKSkgewoJCQkJbXkgJXNlcnYgPSAoKTsKCQkJCSRzZXJ2e1ZhbHVlfSAgICA9ICRTZXJ2aWNlc3skc2VydmljZUlEfTsKCQkJCSRzZXJ2e0tleX0gICAgICA9ICRzZXJ2aWNlSUQ7CgkJCQkkc2VydntEaXNhYmxlZH0gPSAxOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJCWVsc2UgewoJCQlpZiAoKCEgJFB1YmxpYykgfHwgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSkpIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIiI7CglteSAkc2VydmljZVByZURlZmluZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApOwoJJHJldG9ybm8gPSAiPHNlbGVjdCBkYXRhLXdpZHRoPVwiYXV0b1wiIGlkPVwiU2VydmljZUlEXCIgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgY2xhc3M9XCJzZWxlY3RwaWNrZXJcIiBkYXRhLWxpdmUtc2VhcmNoPVwidHJ1ZVwiPlxuPG9wdGlvbiB2YWx1ZT1cIlwiPi08L29wdGlvbj4iOwkKCglpZiAoJHNlcnZpY2VQcmVEZWZpbmVkKSB7CgkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIHNwZWNpZmllZDogJHNlcnZpY2VQcmVEZWZpbmVkIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiU2VydmljZSBub3Qgc3BlY2lmaWVkIik7CgkJCgl9CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCWlmICgkc2VydmljZVByZURlZmluZWQgZXEgJHNlcnZpY2UtPntLZXl9KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0gZWxzZSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0KCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCQkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTRHluYW1pY0ZpZWxkcyggU2NoZW1hID0+ICRzY2hlbWEsIE9wdGlvbnMgPT4gJGZpZWxkcyApOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoKCQkjIEluY2x1ZGUgZHluYW1pYyBmaWVsZHMgaW4gcmVwbGFjZSBjb21tYW5kCgkJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQkKCQkjIFNldCBmaXhlZCBmaWVsZCB2YWx1ZXMsIGlmIGRlZmluZWQKCQlpZiAoJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSkgewoJCQkoJHNjaGVtYSwgJGZpZWxkcykgPSAkU2VsZi0+QWRqdXN0Rml4ZWRGaWVsZHMoU2NoZW1hID0+ICRzY2hlbWEsIEZpZWxkcyA9PiAkZmllbGRzLCBGaXhlZFZhbHVlcyA9PiAkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KTsKCQl9CQoJfQoJCgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgoJCSRTZWxmLT5EZWJ1ZygiQWRqdXN0aW5nIGZpeGVkIGZpZWxkIHsgJGZpZWxkS2V5IH0gd2l0aCB2YWx1ZSBbICRmaXhlZFZhbHVlIF0iKTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoKCQkkU2VsZi0+RGVidWcoIkFkanVzdGluZyBmaXhlZCBmaWVsZHMgaW4gc2NoZW1hOiBcbiAiIC4gJHNjaGVtYSk7CgkJCgkJJHNjaGVtYSA9fiBzLyRrZXkvJHJlcGxhY2UvOwoJCQoJCSRTZWxmLT5EZWJ1ZygiQWRqdXN0aW5nIGZpeGVkIGZpZWxkcyBpbiBmb3JtOiBcbiAiIC4gJGZvcm0pOwoKCQkkZm9ybSA9ICJ7IiAuICRmb3JtIC4gIn0iOwoJCSRmb3JtID0gZW5jb2RlX3V0ZjgoJGZvcm0pOwoJCW15ICRmb3JtU3RydWN0ID0gZGVjb2RlX2pzb24oJGZvcm0pOwoJCW15ICRoaWRkZW5TdHJ1Y3QgPSB7fTsJCQoJCSRoaWRkZW5TdHJ1Y3QtPnsidHlwZSJ9ID0gImhpZGRlbiI7CgkJJGZvcm1TdHJ1Y3QtPnskZmllbGRLZXl9ID0gJGhpZGRlblN0cnVjdDsKCQkKCQlwcmludCBTVERFUlIgRHVtcGVyKCRmb3JtU3RydWN0KTsKCgkJJGZvcm0gPSBlbmNvZGVfanNvbigkZm9ybVN0cnVjdCk7CgkJJGZvcm0gPSBkZWNvZGVfdXRmOCgkZm9ybSk7CgkJc3Vic3RyKCRmb3JtLCAwLCAxLCAiIik7CgkJc3Vic3RyKCRmb3JtLCAtMSwgMSwgIiIpOwkJCgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCSMgQ2hlY2sgaWYgcXVldWUgd2FzIHByZS1kZWZpbmVkCglteSAkcXVldWVGaXhlZCA9IDA7CglpZiAoJERhdGF7UXVldWVJRH0pIHsKCQkkcXVldWVGaXhlZCA9IDE7Cgl9CQoJCgkjIEdldCBxdWV1ZSBuYW1lIGFuZCBpZCB1c2luZyBydWxlcywgaWYgbm8gcXVldWUgd2FzIHByZWRlZmluZWQKCW15ICggJFF1ZXVlLCAkUXVldWVJRCApID0gJFRpY2tldFdpemFyZC0+R2V0UXVldWVJRCglUGFyYW0pOwoJJERhdGF7UXVldWVJRH0gPSAkUXVldWVJRDsKCgkjIE1vZHVsZSBjb25maWcKCSRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIik7CgoJIyBUaWNrZXQgY3JlYXRpb24KCW15ICRjdXN0b21lcklEOwoJbXkgJGN1c3RvbWVyVXNlcjsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJGN1c3RvbWVySUQgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCQkkY3VzdG9tZXJVc2VyID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7Cgl9IGVsc2UgewoJCSRjdXN0b21lcklEID0gJFBhcmFte0N1c3RvbWVySUR9OwoJCSRjdXN0b21lclVzZXIgPSAkUGFyYW17Q3VzdG9tZXJVc2VyfTsKCX0KCQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyB0aWNrZXQiKTsKCW15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKCQlUaXRsZSAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCVF1ZXVlSUQgICAgPT4gJFF1ZXVlSUQsCgkJUHJpb3JpdHkgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9LAoJCUxvY2sgICAgICAgPT4gJ3VubG9jaycsCgkJU3RhdGUgICAgICA9PiAnbmV3JywKCQlTZXJ2aWNlSUQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzZXJ2aWNlIiApLAoJCVR5cGVJRCAgICAgPT4kUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAidHlwZSIgKSwKCQlDdXN0b21lcklEID0+ICRjdXN0b21lcklELAoJCUN1c3RvbWVyVXNlciA9PiAkY3VzdG9tZXJVc2VyLAoJCU93bmVySUQgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkpOwoJJFNlbGYtPkRlYnVnKCJDcmVhdGVkIHRpY2tldCBJRCAkVGlja2V0SUQiKTsKCglteSAkTWltZVR5cGUgICAgICA9ICd0ZXh0L2h0bWwnOwoJbXkgJXNlcnZpY2VGaWVsZHNWYWx1ZXMgPSAoKTsKCW15ICRzZXJ2aWNlRmllbGRzID0gIiI7CglteSBAc2VydmljZUZpZWxkc0tleXMgPSAoKTsKCgkjIFNlcnZpY2UgRmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmb3JtIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCggc3Vic3RyKCAkXywgMCwgMyApIGVxICJTRl8iICkgJiYgKCBzdWJzdHIoICRfLCAwLCA1ICkgbmUgIlNGX1RfIiApKSB7CgkJCWlmICgkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApKSB7CgkJCQlteSBAcGFyYW1WYWxzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKTsJCQkJCgkJCQlmb3IgbXkgJHBhcmFtVmFsdWUgKEBwYXJhbVZhbHMpIHsKCQkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0JCQkJCgkJCX0gZWxzZSB7CgkJCQlteSAkcGFyYW1WYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7IAoJCQkJCgkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJfQkJCQkJCQoJCQkJfQoJCQl9CgkJfQoJfQoJCglmb3IgKEBzZXJ2aWNlRmllbGRzS2V5cykgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiBzdWJzdHIoICRfLCAzICkpIC4gIjogPC9CPiIgLiAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLiAiPEJSLz4iOwoJfQkKCQoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPklQOiA8L0I+IiAuICAkRU5WeydSRU1PVEVfQUREUid9IC4gIjxCUi8+IjsKCSRzZXJ2aWNlRmllbGRzIC49ICI8QlIvPjxCUi8+IjsKCgkjIER5bmFtaWMgRmllbGRzCglteSAkdXNlcklEREY7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkdXNlcklEREYgPSAkU2VsZi0+e0RlZmF1bHRVc2VySUR9OwoJfSBlbHNlIHsKCQkkdXNlcklEREYgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKTsKCX0KCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBkeW5hbWljIGZpZWxkcyB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgMyApIGVxICJERl8iICkgewoJCQlteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKCQkJCUR5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoIE5hbWUgPT4gc3Vic3RyKCAkXywgMyApICksCgkJCQlPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAoJCQkJVmFsdWUgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICksCgkJCQlVc2VySUQgPT4gJHVzZXJJRERGLAoJCQkpOwoJCX0KCX0KCgkjIFNlcnZpY2UgRmllbGRzIC0gVGFibGUgZmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmaWVsZHMgLSB0YWJsZSBmaWVsZHMiKTsKCW15ICRsYXN0VGFiID0gIiI7CglteSAla2V5c0ZvdW5kID0gKCk7CglteSAkbmV3VGFiID0gMTsKCQoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCA1ICkgZXEgIlNGX1RfIiApIHsKCQkJbXkgJHBhcmFtTmFtZSA9ICRfOwoJCQlteSBAcGFydHMgPSBzcGxpdCgnXycsICRfKTsKCQkJbXkgJGN1cnJUYWIgPSAkcGFydHNbMl07CgkJCW15ICRjdXJyS2V5ID0gJHBhcnRzWzRdOwoJCQkKCQkJaWYgKCRjdXJyVGFiIG5lICRsYXN0VGFiKSB7CgkJCQlpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkJCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCQkJCX0KCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VEFCTEUgc3R5bGU9J2JvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA3MDBweDsnIGJvcmRlcj0nMXB4Jz4iOwoJCQkJJGxhc3RUYWIgPSAkY3VyclRhYjsKCQkJCSRuZXdUYWIgPSAxOwoJCQl9IGVsc2UgewoJCQkJJG5ld1RhYiA9IDA7CgkJCX0KCQkJCgkJCSMjIG5ldyBsaW5lIGR1ZSB0byByZXBldGl0aW9uIG9yIG5ldyB0YWJsZQoJCQlpZiAoJGtleXNGb3VuZHskY3VycktleX0gfHwgKCRuZXdUYWIpICkgewoJCQkJJWtleXNGb3VuZCA9ICgpOwkJCQkKCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIENPTFNQQU49JzInIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogbGFyZ2UnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyVGFiKSAuICI8L0I+PC9URD48L1RSPiI7IAoJCQl9CgkJCSRrZXlzRm91bmR7JGN1cnJLZXl9ID0gMTsKCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgc3R5bGU9J3dpZHRoOiAxMDBweDsnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyS2V5KSAuICI8L0I+PC9URD48VEQ+IiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRwYXJhbU5hbWUgKSAuICI8L1REPjwvVFI+IjsJCQkKCQl9Cgl9CgkKCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJfQoJCglteSAkYm9keSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJkZXNjcmlwdGlvbiIgKTsKCgkjIEltYWdlcwoJJFNlbGYtPkRlYnVnKCJMb2FkaW5nIGltYWdlcyBmcm9tIGNhY2hlIik7CglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCW15ICRDb250ZW50SUQgPSAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfTsKICAgICAgICBpZiAoJENvbnRlbnRJRCAmJiAoICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSAmJiAoICR1cGxvYWRlZEZpbGUtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogcmVwbGFjaW5nIGltYWdlIFVSTCBpbiBib2R5IHdpdGggYXR0YWNobWVudCIpOwogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogQm9keTogJGJvZHkiKTsKICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoVGV4dCA9PiAkQ29udGVudElELCk7CgkJCSMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgJGJvZHkgPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKICAgICAgICAgICAgJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IG5ldyBib2R5OiAkYm9keSIpOwogICAgICAgIH0KCX0KCQoJIyBDcmVhdGUgYXJ0aWNsZQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyBhcnRpY2xlIik7CglteSAkRnVsbE5hbWU7CglteSAkRW1haWw7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRGdWxsTmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJuYW1lIiApOwoJCSRFbWFpbCAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKTsJCQoJfSBlbHNlIHsKCQkkRnVsbE5hbWUgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSk7CgkJJEVtYWlsICAgID0gJFBhcmFte1VzZXJFbWFpbH07Cgl9CgkJCglteSAkRnJvbSAgICAgPSAiXCIkRnVsbE5hbWVcIiA8JEVtYWlsPiI7CglteSAkQXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKCQlUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKCQlBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKCQlTZW5kZXJUeXBlICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAoJCUZyb20gICAgICAgICAgICAgPT4gJEZyb20sCgkJVG8gICAgICAgICAgICAgICA9PiAkUXVldWUsCgkJU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlCb2R5ICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksCgkJTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCgkJQ2hhcnNldCAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAoJCVVzZXJJRCAgICAgICAgICAgPT4gJHVzZXJJRERGLAoJCUhpc3RvcnlUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAoJCUhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCgkJQXV0b1Jlc3BvbnNlVHlwZSA9PiAoICRDb25maWdPYmplY3QtPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkKCQk/ICdhdXRvIHJlcGx5JwoJCTogJycsCgkJT3JpZ0hlYWRlciA9PiB7CgkJCUZyb20gICAgPT4gJEZyb20sCgkJCVRvICAgICAgPT4gJFF1ZXVlLAoJCQlTdWJqZWN0ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCQlCb2R5ICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksLAoJCX0sCgkJUXVldWUgPT4gJFF1ZXVlLAoJKTsKCQoJIyBBdHRhY2htZW50cwoJJFNlbGYtPkRlYnVnKCJJbmNsdWRpbmcgYXR0YWNobWVudHMiKTsKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCSRUaWNrZXRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCgkJCUZpbGVuYW1lID0+ICR1cGxvYWRlZEZpbGUtPntGaWxlbmFtZX0sCgkJCUNvbnRlbnQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnR9LAoJCQlDb250ZW50VHlwZSA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9LAoJCQlBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKCQkJQ29udGVudElEID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9LAoJCQlVc2VySUQgICAgPT4gJHVzZXJJRERGLAoJCSk7Cgl9CgkKCSREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CglteSAkaWRDdXN0b21UZW1wbGF0ZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJDdXN0b21UZW1wbGF0ZSJ9OwoJCgkjIGJ1aWxkIG91dHB1dAoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7UHVibGljTW9kZX0gPSAiUHVibGljIjsKCQkkRGF0YXtNb2R1bGV9ID0gInB1YmxpYyI7Cgl9IGVsc2UgewoJCSREYXRhe01vZHVsZX0gPSAiY3VzdG9tZXIiOwoJfQoJaWYgKCEgJHF1ZXVlRml4ZWQpIHsKCQlkZWxldGUgJERhdGF7UXVldWVJRH0gCgl9CglteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSwgVGl0bGUgPT4gIlRpY2tldCBjcmVhdGVkIiApOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZFRpY2tldENyZWF0ZWQnLAoJKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKCn0KCj1oZWFkCklmIHB1YmxpYyBpbnRlcmZhY2Ugd2FzIHVzZWQsIHRyeSB0byBndWVzcyB0aGUgdXNlciBmcm9tIHRoZSBpbmZvcm1lZCBlLW1haWwKPWN1dApzdWIgR2V0VXNlcklERnJvbUVtYWlsIHsKCW15ICRTZWxmICAgICAgID0gc2hpZnQ7CglteSAkZW1haWwgICAgICA9IHNoaWZ0OwoJbXkgJHJlc3VsdCAgICAgPSAkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfTsKCW15ICRkb21haW5MaXN0ID0gJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn07CgkKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CgoJaWYgKCRkb21haW5MaXN0KSB7CgkJbXkgQGRvbWFpbnMgPSBzcGxpdCggIiwiLCAkZG9tYWluTGlzdCApOwoJCQoJCWZvciBteSAkZG9tYWluIChAZG9tYWlucykgewoJCQlteSBAcGFydHMgPSBzcGxpdCggIkAiLCAkZW1haWwgKTsKCQkJaWYgKCAkcGFydHNbMV0gZXEgJGRvbWFpbiApIHsKCQkJCW15ICRpZCAgID0gJHBhcnRzWzBdOwoJCQkJbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKCQkJCQlVc2VyTG9naW4gPT4gJGlkLAoJCQkJCVZhbGlkICAgICA9PiAxLCAgICAgICAgICAgICAgIyBub3QgcmVxdWlyZWQsIGRlZmF1bHQgMQoJCQkJKTsKCQkJCWlmICgga2V5cyAlTGlzdCApIHsKCQkJCQkkcmVzdWx0ID0gJGlkOwoJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiAkcmVzdWx0Owp9Cgo9aGVhZApEZWZhdWx0IGFjdGlvbiB0byBvcGVuIGEgbmV3IGZvcm0gKGZyb250ZW5kIG1ldGhvZCBzaGFyZSBieSBwdWJsaWMgYW5kIGN1c3RvbWVyIGZyb250ZW5kIG1vZHVsZXMpCj1jdXQKc3ViIE9wZW5Gb3JtIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CQkKCW15ICVEYXRhID0gKCk7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBwdWJsaWMgZm9ybSIpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgYXV0aGVudGljYXRlZCBmb3JtIik7Cgl9CgkKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgkKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSwgUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gdW5hdXRoZW50aWNhdGVkIG1lc3NhZ2UgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJCSRTZWxmLT5EZWJ1ZygiUHVibGljIHZpZXcgLSBwdWJsaWMgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCU5hbWUgPT4gJ1Rvb2xCYXJQdWJsaWMnLAoJCSk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJDdXN0b21lciB2aWV3IC0gY3VzdG9tZXIgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCQkKCQkJTmFtZSA9PiAnVG9vbEJhckN1c3RvbWVyJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlucHV0VHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5wdXRUeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpbnB1dFR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBpZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC10ZXh0YXJlYSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicm93cz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiY29scz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiZGF0YS0iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJvd3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbHMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdXJsIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsYWJlbCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtYnV0dG9uIGFscGFjYS1jb250cm9sLWJ1dHRvbi0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3R5bGVzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdHlsZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InN0eWxlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVuZGVyQnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9uIGFscGFjYS1mb3JtLWJ1dHRvbi0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3R5bGVzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdHlsZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InN0eWxlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmF0dHJpYnV0ZXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lc3NhZ2UgYWxwYWNhLW1lc3NhZ2UtIgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJ3aXphcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLW5hdlwiPlxuICAgICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdmJhciBuYXZiYXItZGVmYXVsdFwiIHJvbGU9XCJuYXZpZ2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBhbHBhY2Etd2l6YXJkLWJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdmJhci1uYXZcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdGVwcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmF2PlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRpdGxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aXRsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGl0bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hldnJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtcHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW5vdz1cIjBcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MCU7XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxoMz4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aXphcmRUaXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoid2l6YXJkVGl0bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvaDM+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxoND4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aXphcmREZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkRGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoid2l6YXJkRGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvaDQ+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hbGlnbiA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjE0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkXCI+XG5cbiAgICAgICAgPCEtLSBuYXYgYmFyIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dTdGVwcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPCEtLSB3aXphcmQgcHJvZ3Jlc3MgYmFyIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dQcm9ncmVzc0JhciA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aXphcmRUaXRsZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkRGVzY3JpcHRpb24gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHN0ZXBzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1zdGVwc1wiPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gd2l6YXJkIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLWJ1dHRvbnNcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjbGVhcjpib3RoXCI+PC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGVnZW5kIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvbGVnZW5kPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiICI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIj5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgIDwvc3Bhbj5cbiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciBoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLTE2IGdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRhaW5lcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1yYWRpbyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5kYXRhIDogZGVwdGhzWzFdKSx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXNlbGVjdCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kaXNwbGF5YWJsZVRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRpc3BsYXlhYmxlVGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkaXNwbGF5YWJsZVRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLWRvd25sb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImVycm9yXCIgY29sc3Bhbj1cIjJcIj5cbiAgICAgICAgICAgIEVycm9yOlxuICAgICAgICAgICAgIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgdGl0bGU9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWdhbGxlcnk9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGEgaHJlZj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgdGl0bGU9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWdhbGxlcnk9XCJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8L2E+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0RlbGV0ZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlbGV0ZSBidG4gYnRuLWRhbmdlclwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10cmFzaCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiBidG4gIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5idXR0b25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImJ1dHRvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczQoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmljb25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Imljb25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRyIGNsYXNzPVwidGVtcGxhdGUtZG93bmxvYWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFkZVwiPjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4iOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cImVycm9yXCIgY29sc3Bhbj1cIjJcIj48c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLWltcG9ydGFudFwiPkVycm9yPC9zcGFuPiAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90ZD5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS52YWxpZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRhdGEgJiYgZGF0YS5pbmRleCksMCx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPHRkIGNsYXNzPVwic3RhcnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF1dG9VcGxvYWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzIHByb2dyZXNzLXN1Y2Nlc3MgcHJvZ3Jlc3Mtc3RyaXBlZCBhY3RpdmVcIiByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBhcmlhLXZhbHVlbm93PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHN0eWxlPVwid2lkdGg6MCU7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCI+IFxcXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWQgZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TdGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhbmNlbFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRhdGEgJiYgZGF0YS5pbmRleCksMCx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCIxNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWJhbi1jaXJjbGUgZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DYW5jZWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMz1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRyIGNsYXNzPVwidGVtcGxhdGUtdXBsb2FkXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+PC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jc3NDbGFzc2VzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jc3NDbGFzc2VzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImNzc0NsYXNzZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPk5hbWU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+U2l6ZTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+PCEtLSBlcnJvciBvciBzdGFydCBvciBwcm9ncmVzcyBpbmRpY2F0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5BY3Rpb25zPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5UaHVtYm5haWw8L3RkPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jc3NDbGFzc2VzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFscGFjYS1maWxldXBsb2FkLWNob29zZXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIiCiAgICArIGFsaWFzMihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmlldyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiIGZpbGVpbnB1dC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZXVwbG9hZC1hZGQtYnV0dG9uXCI+IgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jaG9vc2VCdXR0b25MYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY2hvb3NlQnV0dG9uTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImNob29zZUJ1dHRvbkxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQtaGlkZGVuXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNfaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFscGFjYS1maWxldXBsb2FkLXdlbGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGZpbGV1cGxvYWQtYWN0aXZlLXpvbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0hlYWRlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDxwIGFsaWduPVwiY2VudGVyXCIgY2xhc3M9XCJkcm9wem9uZS1tZXNzYWdlXCI+IgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kcm9wWm9uZU1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRyb3Bab25lTWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZHJvcFpvbmVNZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicHJvZ3Jlc3NcIiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjb250cm9sLWxhYmVsIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWxwLWJsb2NrXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCI+PC9pPiZuYnNwOyIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gPSB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXSB8fCB7fTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lci1ncmlkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIGJ0bi1ncm91cCI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7CgogIHJldHVybiAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25cIiBkYXRhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCksIGRlcHRoMCkpCiAgICArICI8L2E+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczI9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbiAiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMix7Im5hbWUiOiJhY3Rpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmljb25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Imljb25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS10b29sYmFyXCIgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJidXR0b24iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhckFjdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXJcIj48L2Rpdj5cblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPCEtLSBoaWRkZW4gY29sdW1uIHN0b3Jpbmcgc29ydCBvcmRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtaGVhZGVyXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBkcmFnZ2FibGUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXJcIj48L3RoPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtaGVhZGVyLWlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGlkZGVuIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L3RoPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2xhc3M9XCJhbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlblwiIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFjdGlvbnM8L3RoPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRyYWdSb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGVhZGVycyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGJvZHkgLS0+XG4gICAgICAgICAgICA8dGJvZHk+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtY29sb3JwaWNrZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPjxpPjwvaT48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb21wb25lbnQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXR0cmlidXRlcyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb21wb25lbnQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZW5hbWVMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZW5hbWVMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZW5hbWVMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVTaXplTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVTaXplTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVTaXplTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlVXBsb2FkQWN0aW9uc0xhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGh1bWJuYWlsTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRodW1ibmFpbExhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6InRodW1ibmFpbExhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjb250cm9sLWxhYmVsIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWxwLWJsb2NrIGFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwovKioKICogVXNpbmcgZm9yazoKICogaHR0cHM6Ly9naXRodWIuY29tL2tjbW9vdC9CYXNlLmpzLUZvcmsvYmxvYi9tYXN0ZXIvYnVpbGQvYmFzZS5qcwogKi8KKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CiAgICAvKgogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS4KICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIChyb290LnJldHVybkV4cG9ydHNHbG9iYWwgPSBmYWN0b3J5KCkpOwogICAgICAgIH0pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAogICAgICAgIC8vIGxpa2UgTm9kZS4KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgIH0gZWxzZSB7CiAgICAqLwogICAgICAgIHJvb3RbJ0Jhc2UnXSA9IGZhY3RvcnkoKTsKICAgIC8qCiAgICB9CiAgICAqLwp9KHRoaXMsIGZ1bmN0aW9uICgpIHsKCiAgICAvKioKICAgICAqICAgQmFzZS5qcywgdmVyc2lvbiAxLjFhCiAgICAgKiAgIENvcHlyaWdodCAyMDA2LTIwMTAsIERlYW4gRWR3YXJkcwogICAgICogICBMaWNlbnNlOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogICAgICoKICAgICAqICAgTW9kaWZpZWQgYnkgdGhlIE5lcmRlcnkgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlIGFuZCB2YXJpb3VzIGJ1Z2ZpeGVzCiAgICAgKi8KCiAgICAvKioKICAgICAqIEZ1bmN0aW9uIHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7CgogICAgLyoqCiAgICAgKiBPYmplY3QgdHlwZQogICAgICoKICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQGlnbm9yZQogICAgICogQGZpbmFsCiAgICAgKi8KICAgIHZhciBUWVBFX09CSkVDVCA9ICdvYmplY3QnOwoKICAgIC8qKgogICAgICogU3RyaW5nIHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9TVFJJTkcgPSAnc3RyaW5nJzsKCiAgICAvKioKICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIGFyZSBjdXJyZW50bHkgY3JlYXRpbmcgYSBjbGVhbiBwcm90b3R5cGUgb2YgYSBjbGFzcwogICAgICoKICAgICAqIEB0eXBlIEJvb2xlYW4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHZhciBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE1ldGhvZCB0byBleHRlbmQgbWFudWFsbHkgLSBkbyBub3QgZG8gYXV0b21hdGljYWxseQogICAgICoKICAgICAqIEB0eXBlIEFycmF5CiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2hpZGRlbk1ldGhvZHMgPSBbJ2NvbnN0cnVjdG9yJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXTsKCiAgICAvKioKICAgICAqIExlbnRoIG9mIGhpZGRlbiBtZXRob2RzIGFycmF5CiAgICAgKgogICAgICogQHR5cGUgTnVtYmVyCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2hpZGRlbk1ldGhvZHNMZW5ndGggPSBfaGlkZGVuTWV0aG9kcy5sZW5ndGg7CgogICAgLyoqCiAgICAgKiBSZWdleCB0byBmaW5kIGFueSBjYWxscyB0byBhIHBhcmVudCBtZXRob2QKICAgICAqCiAgICAgKiBAdHlwZSBSZWdFeHAKICAgICAqIEBwcml2YXRlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHZhciBfc3VwZXJNZXRob2RSZWdleCA9IC9cYmJhc2VcYi87CgogICAgLyoqCiAgICAgKiBCbGFuayBmdW5jdGlvbgogICAgICoKICAgICAqIEB0eXBlIEZ1bmN0aW9uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2JsYW5rRnVuY3Rpb24gPSBmdW5jdGlvbigpIHt9OwoKICAgIC8qKgogICAgICogUHJvdG90eXBlIGRlZmF1bHQgdmFsdWVzLiBXaGVuIGV4dGVuZGluZyBtZXRob2RzLCBpZiBib3RoIHNvdXJjZXMgaGF2ZSB0aGVzZSB2YWx1ZXMsIGRvIG5vdCBjb3B5IHRoZW0uCiAgICAgKgogICAgICogQHR5cGUgT2JqZWN0CiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwZURlZmF1bHRzID0geyB0b1NvdXJjZTogbnVsbCwgYmFzZTogX2JsYW5rRnVuY3Rpb24gfTsKCiAgICAvKioKICAgICAqIEJhc2VMaWIgY2xhc3MKICAgICAqCiAgICAgKiBBIGxpYnJhcnkgdG8gY3JlYXRlIGEgbW9yZSB0cmFkaXRpb25hbCBPT1AgaW50ZXJmYWNlIGZvciBkZXZlbG9wZXJzIHRvIHdvcmsgd2l0aAogICAgICoKICAgICAqIEBjbGFzcyBMaWIuQmFzZS5CYXNlCiAgICAgKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIHZhciBCYXNlID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFN1YmNsYXNzIGEgY2xhc3MKICAgICAqCiAgICAgKiBAbWV0aG9kIGV4dGVuZAogICAgICogQHBhcmFtIHtPYmplY3R9IFtpbnN0YW5jZU1ldGhvZHNdIEluc3RhbmNlIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGF0aWNNZXRob2RzXSBTdGF0aWMgbWVtYmVycy9tZXRob2RzCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgQmFzZS5leHRlbmQgPSBmdW5jdGlvbihpbnN0YW5jZU1ldGhvZHMsIHN0YXRpY01ldGhvZHMpIHsgLy8gc3ViY2xhc3MKICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAvLyBidWlsZCB0aGUgcHJvdG90eXBlCiAgICAgICAgX3Byb3RvdHlwaW5nID0gdHJ1ZTsKCiAgICAgICAgdmFyIHByb3RvID0gbmV3IHRoaXMoKTsKICAgICAgICBleHRlbmQuY2FsbChwcm90bywgaW5zdGFuY2VNZXRob2RzKTsKCiAgICAgICAgLy8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGFueSBvdGhlciBtZXRob2QgdG8gaW52b2tlIHRoYXQgbWV0aG9kJ3MgYW5jZXN0b3IKICAgICAgICBwcm90by5iYXNlID0gX3Byb3RvdHlwZURlZmF1bHRzLmJhc2U7CgogICAgICAgIF9wcm90b3R5cGluZyA9IGZhbHNlOwoKICAgICAgICAvLyBjcmVhdGUgdGhlIHdyYXBwZXIgZm9yIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvLmNvbnN0cnVjdG9yOwogICAgICAgIHZhciBrbGFzcyA9IHByb3RvLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nKSB7CiAgICAgICAgICAgICAgICAvLyBpbnN0YW50aWF0aW9uCiAgICAgICAgICAgICAgICBpZiAodGhpcyAmJiAodGhpcy5fY29uc3RydWN0aW5nIHx8IHRoaXMuY29uc3RydWN0b3IgPT09IGtsYXNzKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN0cnVjdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdGluZwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgQmFzZS5jYXN0LmFwcGx5KGtsYXNzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBidWlsZCB0aGUgY2xhc3MgaW50ZXJmYWNlCiAgICAgICAgZXh0ZW5kLmNhbGwoa2xhc3MsIHRoaXMpOwogICAgICAgIGtsYXNzLmFuY2VzdG9yID0gdGhpczsKICAgICAgICBrbGFzcy5wcm90b3R5cGUgPSBwcm90bzsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIG9yaWdpbmFsIG1ldGhvZAogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB2YWx1ZU9mCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFt0eXBlXQogICAgICAgICAqIEByZXR1cm4gRnVuY3Rpb24KICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICovCiAgICAgICAga2xhc3MudmFsdWVPZiA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlID09PSBUWVBFX09CSkVDVCkgPyBrbGFzcyA6IGNvbnN0cnVjdG9yLnZhbHVlT2YoKTsKICAgICAgICB9OwogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCBzdGF0aWNNZXRob2RzKTsKCiAgICAgICAgLy8gaWYgc3RhdGljIGluaXQgbWV0aG9kIGV4aXN0cywgY2FsbCBpdAogICAgICAgIGlmICh0eXBlb2Yga2xhc3MuaW5pdCA9PT0gVFlQRV9GVU5DVElPTikgewogICAgICAgICAgICBrbGFzcy5pbml0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICAgIC8qKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gc291cmNlCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdmFsdWVdCiAgICAgKiBAY2hhaW5hYmxlCiAgICAgKi8KICAgIEJhc2UucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgdmFsdWUpIHsKICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBhIG5hbWUvdmFsdWUgcGFpcgogICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBUWVBFX1NUUklORyAmJiBhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzW3NvdXJjZV07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGFuY2VzdG9yICYmCiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGluZyBhIG1ldGhvZD8KICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUgPT09IFRZUEVfRlVOQ1RJT04pICYmCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlT2YoKSBjb21wYXJpc29uIGlzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgICghYW5jZXN0b3IudmFsdWVPZiB8fCBhbmNlc3Rvci52YWx1ZU9mKCkgIT09IHZhbHVlLnZhbHVlT2YoKSkgJiYKICAgICAgICAgICAgICAgIF9zdXBlck1ldGhvZFJlZ2V4LnRlc3QodmFsdWUpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB1bmRlcmx5aW5nIG1ldGhvZAogICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlLnZhbHVlT2YoKTsKCiAgICAgICAgICAgICAgICAvLyBvdmVycmlkZQogICAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5iYXNlIHx8IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IGFuY2VzdG9yOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBwb2ludCB0byB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlID09PSBUWVBFX09CSkVDVCkgPyB2YWx1ZSA6IG1ldGhvZDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZyA9IEJhc2UudG9TdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc1tzb3VyY2VdID0gdmFsdWU7CgogICAgICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbAogICAgICAgIH0gZWxzZSBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIHZhciBleHRlbmQgPSBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CgogICAgICAgICAgICAvLyBpZiB0aGlzIG9iamVjdCBoYXMgYSBjdXN0b21pc2VkIGV4dGVuZCBtZXRob2QgdGhlbiB1c2UgaXQKICAgICAgICAgICAgaWYgKCFfcHJvdG90eXBpbmcgJiYgdHlwZW9mIHRoaXMgIT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IHRoaXMuZXh0ZW5kIHx8IGV4dGVuZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZG8gaGlkZGVuIG1ldGhvZHMgc2VwYXJhdGVseQogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgcHJvdG90eXBpbmcgdGhlbiBpbmNsdWRlIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB2YXIgaSA9IF9wcm90b3R5cGluZyA/IDAgOiAxOwogICAgICAgICAgICB2YXIga2V5OwogICAgICAgICAgICBmb3IgKDsgaSA8IF9oaWRkZW5NZXRob2RzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGtleSA9IF9oaWRkZW5NZXRob2RzW2ldOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZVtrZXldICE9PSBfcHJvdG90eXBlRGVmYXVsdHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKHRoaXMsIGtleSwgc291cmNlW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IGVhY2ggb2YgdGhlIHNvdXJjZSBvYmplY3QncyBwcm9wZXJ0aWVzIHRvIHRoaXMgb2JqZWN0CiAgICAgICAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKCFfcHJvdG90eXBlRGVmYXVsdHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKHRoaXMsIGtleSwgc291cmNlW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLy8gaW5pdGlhbGlzZQogICAgQmFzZSA9IEJhc2UuZXh0ZW5kKHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBzdGF0aWMgYmFzZSBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgYmFzZQogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICBiYXNlOiBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZQoKICAgIH0sIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogUGFyZW50IG9iamVjdC9jbGFzcwogICAgICAgICAqCiAgICAgICAgICogQHByb3BlcnR5IGFuY2VzdG9yCiAgICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICBhbmNlc3RvcjogT2JqZWN0LAoKICAgICAgICAvKioKICAgICAgICAgKiBCYXNlLmpzIHZlcnNpb24KICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSB2ZXJzaW9uCiAgICAgICAgICogQHR5cGUgU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICB2ZXJzaW9uOiAnMS4xJywKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5kIGN1cnJlbnQgY2xhc3MgaW50byBhbm90aGVyIG9iamVjdCBvciBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIElmIGFuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZSBpcyBwYXNzZWQsIG9ubHkgcHJvdG90eXBlIG1ldGhvZHMKICAgICAgICAgKiB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBhIGNsYXNzICh3aXRoIGNvbnN0cnVjdG9yKSBpcyBwYXNzZWQsIGJvdGggc3RhdGljIGFuZAogICAgICAgICAqIHByb3RvdHlwZSBtZXRob2RzIHdpbGwgYmUgY2FzdCBFWENFUFQgZm9yIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgY2FzdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjbGFzcyogQ2xhc3NlcyBvciBvYmplY3RzIHRvIGNhc3QKICAgICAgICAgKiBAY2hhaW5hYmxlCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGNhc3Q6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICB2YXIgZXh0ZW5kOwogICAgICAgICAgICB2YXIgY2FzdGVyOwoKICAgICAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgY2FzdGVyID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgZXh0ZW5kID0gY2FzdGVyLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CgogICAgICAgICAgICAgICAgLy8gY2FzdCBwcm90b3R5cGUgYW5kIHN0YXRpYyBtZXRob2RzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhc3RlciA9PT0gVFlQRV9GVU5DVElPTikgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5wcm90b3R5cGUuZXh0ZW5kIHx8IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbChjYXN0ZXIucHJvdG90eXBlLCB0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBjYXN0ZXIuYW5jZXN0b3IgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICAvLyBjYXN0IG9ubHkgcHJvdG90eXBlIG1ldGhvZHMKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLCB0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudCBhIGNsYXNzIGludG8gdGhlIGN1cnJlbnQgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBBbGwgcHJvdG90eXBlIGFuZCBzdGF0aWMgcHJvcGVydGllcyB3aWxsIGJlIGV4dGVuZGVkIGludG8KICAgICAgICAgKiBgdGhpc2AgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGltcGxlbWVudAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjbGFzcyogQ2xhc3NlcyBvciBvYmplY3RzIHRvIGNhc3QKICAgICAgICAgKiBAY2hhaW5hYmxlCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGltcGxlbWVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhc3QuY2FsbChhcmd1bWVudHNbaV0sIHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgc3RyaW5nIHZhbHVlIG9mIGNsYXNzCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIHRvU3RyaW5nCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgKyAnJzsKICAgICAgICB9CgogICAgfSk7CgogICAgcmV0dXJuIEJhc2U7CgoKfSkpOwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCi8qanNoaW50IC1XMDgzICovIC8vIGlubGluZSBmdW5jdGlvbnMgYXJlIHVzZWQgc2FmZWx5Ci8qKgogKiBBbHBhY2EgZm9ybXMgZW5naW5lIGZvciBqUXVlcnkKICovCihmdW5jdGlvbigkKSB7CgogICAgLyoqCiAgICAgKiBSZW5kZXJzIGFuIEFscGFjYSBmaWVsZCBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogVGhlIGJhc2ljIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIGNvbmZpZyk7CiAgICAgKiAgICAgPC9wcmU+CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogVGhlIGZ1bGwgc3ludGF4IGlzOgogICAgICoKICAgICAqIDxjb2RlPgogICAgICogICAgIDxwcmU+CiAgICAgKiAgICAgICAgIEFscGFjYShlbCwgewogICAgICogICAgICAgICAgICAgICJkYXRhIiA6IHtBbnl9IGZpZWxkIGRhdGEgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAic2NoZW1hIjoge09iamVjdH0gZmllbGQgc2NoZW1hIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgIm9wdGlvbnMiIDoge09iamVjdH0gZmllbGQgb3B0aW9ucyAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJ2aWV3Ijoge09iamVjdHxTdHJpbmd9IGZpZWxkIHZpZXcgKG9iamVjdCBvciBpZCByZWZlcmVuY2UpIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInJlbmRlciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlcGxhY2luZyBkZWZhdWx0IHJlbmRlcmluZyBtZXRob2QgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHBvc3QtcmVuZGVyaW5nICAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJlcnJvciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVycm9yIGhhbmRsaW5nICAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJjb25uZWN0b3IiOiB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yIGZvciByZXRyaWV2aW5nIG9yIHN0b3JpbmcgZGF0YSwgc2NoZW1hLCBvcHRpb25zLCB2aWV3IGFuZCB0ZW1wbGF0ZXMuIChvcHRpb25hbCkKICAgICAqICAgICAgICAgfSk7CiAgICAgKiAgICAgPC9wcmU+CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIHZhciBBbHBhY2EgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIC8vIGlsbGVnYWwKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiWW91IG11c3Qgc3VwcGx5IGF0IGxlYXN0IG9uZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgY2FuIGVpdGhlciBiZSBhIERPTSBlbGVtZW50IGFnYWluc3Qgd2hpY2ggQWxwYWNhIHdpbGwgZ2VuZXJhdGUgYSBmb3JtIG9yIGl0IGNhbiBiZSBhIGZ1bmN0aW9uIG5hbWUuICBTZWUgaHR0cDovL3d3dy5hbHBhY2Fqcy5vcmcgZm9yIG1vcmUgZGV0YWlscy4iKTsKICAgICAgICB9CgogICAgICAgIC8vIGVsZW1lbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IChlaXRoZXIgYSBzdHJpbmcgb3IgYSBET00gZWxlbWVudCkKICAgICAgICB2YXIgZWwgPSBhcmdzWzBdOwogICAgICAgIGlmIChlbCAmJiBBbHBhY2EuaXNTdHJpbmcoZWwpKSB7CiAgICAgICAgICAgIGVsID0gJCgiIyIgKyBlbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBvdGhlciBhcmd1bWVudHMgd2UgbWF5IHdhbnQgdG8gZmlndXJlIG91dAogICAgICAgIHZhciBkYXRhID0gbnVsbDsKICAgICAgICB2YXIgc2NoZW1hID0gbnVsbDsKICAgICAgICB2YXIgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgdmFyIHZpZXcgPSBudWxsOwogICAgICAgIHZhciBjYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIHJlbmRlcmVkQ2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgY29ubmVjdG9yID0gbnVsbDsKICAgICAgICB2YXIgbm90VG9wTGV2ZWwgPSBmYWxzZTsKICAgICAgICB2YXIgaW5pdGlhbFNldHRpbmdzID0ge307CgogICAgICAgIC8vIGlmIHRoZXNlIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCB0aGVuIGRhdGEsIHNjaGVtYSwgb3B0aW9ucyBhbmQgc291cmNlIGFyZSBsb2FkZWQgdmlhIGNvbm5lY3RvcgogICAgICAgIHZhciBkYXRhU291cmNlID0gbnVsbDsKICAgICAgICB2YXIgc2NoZW1hU291cmNlID0gbnVsbDsKICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSBudWxsOwoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB0aGUgQWxwYWNhIGZpZWxkIGluc3RhbmNlIGJvdW5kIHRvIHRoZSBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEZpcnN0IGNvbnNpZGVycyB0aGUgaW1tZWRpYXRlIGRvbSBlbGVtZW50IGFuZCB0aGVuIGxvb2tzIDEgbGV2ZWwgZGVlcCB0byBjaGlsZHJlbiBhbmQgdGhlbiB1cCB0byBwYXJlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICB2YXIgZmluZEV4aXN0aW5nQWxwYWNhQmluZGluZyA9IGZ1bmN0aW9uKGRvbUVsZW1lbnQsIHNraXBQaXZvdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IG51bGw7CgogICAgICAgICAgICAvLyBsb29rIGF0ICJkYXRhLWFscGFjYS1maWVsZC1pZCIKICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkSWQgPSAkKGRvbUVsZW1lbnQpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FGaWVsZElkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYWxwYWNhRmllbGQgPSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbYWxwYWNhRmllbGRJZF07CiAgICAgICAgICAgICAgICBpZiAoYWxwYWNhRmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBhbHBhY2FGaWVsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBsb29rIGF0ICJkYXRhLWFscGFjYS1mb3JtLWlkIgogICAgICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZm9ybUlkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIik7CiAgICAgICAgICAgICAgICBpZiAoZm9ybUlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdWJFbGVtZW50cyA9ICQoZG9tRWxlbWVudCkuZmluZCgiOmZpcnN0Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRmllbGRJZCA9ICQoc3ViRWxlbWVudHNbMF0pLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJGaWVsZElkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRmllbGQgPSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbc3ViRmllbGRJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBzdWJGaWVsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBmb3IgY2hpbGRyZW4gMHRoIGVsZW1lbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGREb21FbGVtZW50cyA9ICQoZWwpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkRG9tRWxlbWVudHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcoY2hpbGREb21FbGVtZW50c1swXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IGNoaWxkRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgZm91bmQsIGNoZWNrIHBhcmVudAogICAgICAgICAgICBpZiAoIWV4aXN0aW5nICYmICFza2lwUGl2b3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRFbCA9ICQoZWwpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZCA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcocGFyZW50RWwsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gcGFyZW50RmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIHNwZWNpYWxGdW5jdGlvbk5hbWVzID0gWyJnZXQiLCAiZXhpc3RzIiwgImRlc3Ryb3kiXTsKICAgICAgICB2YXIgaXNTcGVjaWFsRnVuY3Rpb24gPSAoYXJncy5sZW5ndGggPiAxICYmIEFscGFjYS5pc1N0cmluZyhhcmdzWzFdKSAmJiAoc3BlY2lhbEZ1bmN0aW9uTmFtZXMuaW5kZXhPZihhcmdzWzFdKSA+IC0xKSk7CgogICAgICAgIHZhciBleGlzdGluZyA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcoZWwpOwogICAgICAgIGlmIChleGlzdGluZyB8fCBpc1NwZWNpYWxGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc1NwZWNpYWxGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBzcGVjaWFsIGZ1bmN0aW9uIG5hbWUKICAgICAgICAgICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lID0gYXJnc1sxXTsKICAgICAgICAgICAgICAgIGlmICgiZ2V0IiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJleGlzdHMiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleGlzdGluZyA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZGVzdHJveSIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5rbm93biBzcGVjaWFsIGZ1bmN0aW9uOiAiICsgc3BlY2lhbEZ1bmN0aW9uTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbmZpZyA9IG51bGw7CgogICAgICAgICAgICAvLyBqdXN0IGEgZG9tIGVsZW1lbnQsIG5vIG90aGVyIGFyZ3M/CiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ3JhYiB0aGUgZGF0YSBpbnNpZGUgb2YgdGhlIGVsZW1lbnQgYW5kIHVzZSB0aGF0IGZvciBjb25maWcKICAgICAgICAgICAgICAgIHZhciBqc29uU3RyaW5nID0gJChlbCkudGV4dCgpOwoKICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7CiAgICAgICAgICAgICAgICAkKGVsKS5odG1sKCIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoYXJnc1sxXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gYXJnc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogYXJnc1sxXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghY29uZmlnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIEFscGFjYSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRhdGEgPSBjb25maWcuZGF0YTsKICAgICAgICAgICAgc2NoZW1hID0gY29uZmlnLnNjaGVtYTsKICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zOwogICAgICAgICAgICB2aWV3ID0gY29uZmlnLnZpZXc7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLnJlbmRlcjsKICAgICAgICAgICAgaWYgKGNvbmZpZy5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayA9IGNvbmZpZy5wb3N0UmVuZGVyOwogICAgICAgICAgICBlcnJvckNhbGxiYWNrID0gY29uZmlnLmVycm9yOwogICAgICAgICAgICBjb25uZWN0b3IgPSBjb25maWcuY29ubmVjdG9yOwoKICAgICAgICAgICAgLy8gc291cmNlcwogICAgICAgICAgICBkYXRhU291cmNlID0gY29uZmlnLmRhdGFTb3VyY2U7CiAgICAgICAgICAgIHNjaGVtYVNvdXJjZSA9IGNvbmZpZy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSBjb25maWcub3B0aW9uc1NvdXJjZTsKICAgICAgICAgICAgdmlld1NvdXJjZSA9IGNvbmZpZy52aWV3U291cmNlOwoKICAgICAgICAgICAgLy8gb3RoZXIKICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkgewogICAgICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzWyJ1aSJdID0gY29uZmlnLnVpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSkgewogICAgICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzWyJ0eXBlIl0gPSBjb25maWcudHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZy5ub3RUb3BMZXZlbCkpIHsKICAgICAgICAgICAgICAgIG5vdFRvcExldmVsID0gY29uZmlnLm5vdFRvcExldmVsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBubyBlcnJvciBjYWxsYmFjayBpcyBwcm92aWRlZCwgd2UgZmFsbCBiYWNrIHRvIGEgYnJvd3NlciBhbGVydAogICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShlcnJvckNhbGxiYWNrKSkgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrID0gQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrOwogICAgICAgIH0KCiAgICAgICAgLy8gaW5zdGFudGlhdGUgdGhlIGNvbm5lY3RvciAoaWYgbm90IGFscmVhZHkgaW5zdGFudGlhdGVkKQogICAgICAgIC8vIGlmIGNvbmZpZyBpcyBwYXNzZWQgaW4gKGFzIG9iamVjdCksIHdlIGluc3RhbnRpYXRlCiAgICAgICAgaWYgKCFjb25uZWN0b3IgfHwgIWNvbm5lY3Rvci5jb25uZWN0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvcklkID0gImRlZmF1bHQiOwogICAgICAgICAgICB2YXIgY29ubmVjdG9yQ29uZmlnID0ge307CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoY29ubmVjdG9yKSkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KGNvbm5lY3RvcikgJiYgY29ubmVjdG9yLmlkKSB7CiAgICAgICAgICAgICAgICBjb25uZWN0b3JJZCA9IGNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgIGlmIChjb25uZWN0b3IuY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yQ29uZmlnID0gY29ubmVjdG9yLmNvbmZpZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkKTsKICAgICAgICAgICAgaWYgKCFDb25uZWN0b3JDbGFzcykgewogICAgICAgICAgICAgICAgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQsIGNvbm5lY3RvckNvbmZpZyk7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3Igc2Vjb25kIG9yIGRlZXBlciBsZXZlbCBvZiBmaWVsZHMsIGRlZmF1bHQgbG9hZGVyIHNob3VsZCBiZSB0aGUgb25lIHRvIGRvIGxvYWRBbGwKICAgICAgICAvLyBzaW5jZSBzY2hlbWEsIGRhdGEsIG9wdGlvbnMgYW5kIHZpZXcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICAgICAgICAvLyBVbmxlc3Mgd2Ugd2FudCB0byBsb2FkIGluZGl2aWR1YWwgZmllbGRzIChvdGhlciB0aGFuIHRoZSB0ZW1wbGF0ZXMpIHVzaW5nIHRoZSBwcm92aWRlZAogICAgICAgIC8vIGxvYWRlciwgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guIFRoZSBiZW5lZml0IGlzIHNhdmluZyB0aW1lIG9uIGxvYWRlciBmb3JtYXQgY2hlY2tpbmcuCgogICAgICAgIHZhciBsb2FkQWxsQ29ubmVjdG9yID0gY29ubmVjdG9yOwoKICAgICAgICBpZiAobm90VG9wTGV2ZWwpIHsKICAgICAgICAgICAgdmFyIExvYWRBbGxDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIpOwogICAgICAgICAgICBsb2FkQWxsQ29ubmVjdG9yID0gbmV3IExvYWRBbGxDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9CgogICAgICAgIC8vIHJlc2V0cyB0aGUgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgYmFjayB0byBkZWZhdWx0IHN0YXRlIGFmdGVyIGZpcnN0IHJlbmRlcgogICAgICAgIHZhciBfcmVzZXRJbml0VmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oZmllbGQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAvLyB3cmFwIHJlbmRlcmVkIGNhbGxiYWNrIHRvIGFsbG93IGZvciBVSSB0cmVhdG1lbnQgKGRvbSBmb2N1cywgZXRjKQogICAgICAgIHZhciBfcmVuZGVyZWRDYWxsYmFjayA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdG9wIGxldmVsLCBhcHBseSBhIHVuaXF1ZSBvYnNlcnZhYmxlIHNjb3BlIGlkCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWVsZC5vYnNlcnZhYmxlU2NvcGUgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgdGhlIHRvcC1tb3N0IGNvbnRyb2wKICAgICAgICAgICAgLy8gZmlyZSAicmVhZHkiIGV2ZW50IG9uIGV2ZXJ5IGNvbnRyb2wKICAgICAgICAgICAgLy8gZ28gZG93biBkZXB0aCBmaXJzdCBhbmQgZmlyZSB0byBsb3dlc3QgY29udHJvbHMgYmVmb3JlIHRyaWNrbGluZyBiYWNrIHVwCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KGZpZWxkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdG9wIGxldmVsIGFuZCBmb2N1cyBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLCB0aGVuIGF1dG8tc2V0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQob3B0aW9ucy5mb2N1cykgJiYgIWZpZWxkLnBhcmVudCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb2N1cyA9IEFscGFjYS5kZWZhdWx0Rm9jdXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGF1dG8tc2V0IHRoZSBmb2N1cz8KICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb2N1cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBkb0ZvY3VzID0gZnVuY3Rpb24oX19maWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX19maWVsZC5zdXNwZW5kQmx1ckZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNDb250cm9sRmllbGQgJiYgZmllbGQuaXNBdXRvRm9jdXNhYmxlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZm9jdXMgb24gdGhpcyBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZvY3VzID0gdHJ1ZSwgdGhlbiBmb2N1cyBvbiB0aGUgZmlyc3QgY2hpbGQgY29udHJvbCBpZiBpdCBpcyBhdXRvLWZvY3VzYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vdCByZWFkLW9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgZmlyc3QgZWxlbWVudCBpbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW5bel0uaXNDb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQXV0b0ZvY3VzYWJsZSgpICYmICFmaWVsZC5jaGlsZHJlblt6XS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhmaWVsZC5jaGlsZHJlblt6XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKG9wdGlvbnMuZm9jdXMpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSBwYXRoIHRvIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmdldENvbnRyb2xCeVBhdGgob3B0aW9ucy5mb2N1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmlzQ29udHJvbEZpZWxkICYmIGNoaWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBfcmVzZXRJbml0VmFsaWRhdGlvbkVycm9yKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZW5kZXJlZENhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZW5kZXJlZENhbGxiYWNrKGZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGxvYWRBbGxDb25uZWN0b3IubG9hZEFsbCh7CiAgICAgICAgICAgICJkYXRhIjogZGF0YSwKICAgICAgICAgICAgInNjaGVtYSI6IHNjaGVtYSwKICAgICAgICAgICAgIm9wdGlvbnMiOiBvcHRpb25zLAogICAgICAgICAgICAidmlldyI6IHZpZXcsCiAgICAgICAgICAgICJkYXRhU291cmNlIjogZGF0YVNvdXJjZSwKICAgICAgICAgICAgInNjaGVtYVNvdXJjZSI6IHNjaGVtYVNvdXJjZSwKICAgICAgICAgICAgIm9wdGlvbnNTb3VyY2UiOiBvcHRpb25zU291cmNlLAogICAgICAgICAgICAidmlld1NvdXJjZSI6IHZpZXdTb3VyY2UKICAgICAgICB9LCBmdW5jdGlvbihsb2FkZWREYXRhLCBsb2FkZWRPcHRpb25zLCBsb2FkZWRTY2hlbWEsIGxvYWRlZFZpZXcpIHsKCiAgICAgICAgICAgIC8vIGZvciBjYXNlcyB3aGVyZSB0aGluZ3MgY291bGQgbm90IGJlIGxvYWRlZCB2aWEgc291cmNlIGxvYWRlcnMsIGZhbGwgYmFjayB0byB3aGF0IG1heSBoYXZlIGJlZW4gcGFzc2VkCiAgICAgICAgICAgIC8vIGluIGRpcmVjdGx5IGFzIHZhbHVlcwoKICAgICAgICAgICAgbG9hZGVkRGF0YSA9IGxvYWRlZERhdGEgPyBsb2FkZWREYXRhIDogZGF0YTsKICAgICAgICAgICAgbG9hZGVkU2NoZW1hID0gbG9hZGVkU2NoZW1hID8gbG9hZGVkU2NoZW1hOiBzY2hlbWE7CiAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMgPSBsb2FkZWRPcHRpb25zID8gbG9hZGVkT3B0aW9ucyA6IG9wdGlvbnM7CiAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRWaWV3ID8gbG9hZGVkVmlldyA6IHZpZXc7CgogICAgICAgICAgICAvLyBzb21lIGRlZmF1bHRzIGZvciB0aGUgY2FzZSB3aGVyZSBkYXRhIGlzIG51bGwKICAgICAgICAgICAgLy8gaWYgc2NoZW1hICsgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkLCB3ZSBhc3N1bWUgYSB0ZXh0IGZpZWxkCgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkRGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRTY2hlbWEpICYmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zKSB8fCBBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zLnR5cGUpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWREYXRhID0gIiI7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMgPSAidGV4dCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgJiYgQWxwYWNhLmlzT2JqZWN0KG9wdGlvbnMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkT3B0aW9ucy50eXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxvYWRlZE9wdGlvbnMudmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9hZGVkVmlldyA9IGxvYWRlZE9wdGlvbnMudmlldzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaW5pdCBhbHBhY2EKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbml0KGVsLCBsb2FkZWREYXRhLCBsb2FkZWRPcHRpb25zLCBsb2FkZWRTY2hlbWEsIGxvYWRlZFZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIF9yZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sobG9hZEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWVzcGFjZSBOYW1lc3BhY2UgZm9yIGFsbCBBbHBhY2EgRmllbGQgQ2xhc3MgSW1wbGVtZW50YXRpb25zLgogICAgICovCiAgICBBbHBhY2EuRmllbGRzID0geyB9OwoKICAgIC8qKgogICAgICogQG5hbWVzcGFjZSBOYW1lc3BhY2UgZm9yIGFsbCBBbHBhY2EgQ29ubmVjdG9yIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkNvbm5lY3RvcnMgPSB7IH07CgogICAgQWxwYWNhLkV4dGVuZCA9ICQuZXh0ZW5kOwoKICAgIEFscGFjYS5DcmVhdGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgIGFyZ3MudW5zaGlmdCh7fSk7CgogICAgICAgIHJldHVybiAkLmV4dGVuZC5hcHBseSh0aGlzLCBhcmdzKTsKICAgIH07CgogICAgLy8gc3RhdGljIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMKICAgIEFscGFjYS5FeHRlbmQoQWxwYWNhLAogICAgLyoqIEBsZW5kcyBBbHBhY2EgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBub25BcnJheSBBIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG91dCBvZiB0aGUgbm9uLWFycmF5IHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIG1ha2VBcnJheSA6IGZ1bmN0aW9uKG5vbkFycmF5KSB7CiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub25BcnJheSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGZ1bmN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBmdW5jdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNTdHJpbmc6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICJzdHJpbmciKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gIUFscGFjYS5pc1VuZGVmaW5lZChvYmopICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYSBwbGFpbiwgbm9uLXByb3RvdHlwZWQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBwbGFpbiBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICQuaXNQbGFpbk9iamVjdChvYmopOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBudW1iZXIuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIG51bWJlciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzTnVtYmVyOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAibnVtYmVyIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYXJyYXksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0FycmF5OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBib29sZWFuLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBib29sZWFuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNCb29sZWFuOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAiYm9vbGVhbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHVuZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVW5kZWZpbmVkOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09ICJ1bmRlZmluZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdHJpcHMgYW55IGV4Y2VzcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4gdGV4dC4KICAgICAgICAgKiBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzdHIKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gdHJpbW1lZCBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICB0cmltOiBmdW5jdGlvbih0ZXh0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSB0ZXh0OwoKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgQWxwYWNhLmlzU3RyaW5nKHRyaW1tZWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cmltbWVkID0gdHJpbW1lZC5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJpbW1lZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBhIHNhZmUgY29udmVyc2lvbiBvZiBhbiBIVE1MIHRleHR1YWwgc3RyaW5nIGludG8gYSBET00gb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHgKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIHNhZmVEb21QYXJzZTogZnVuY3Rpb24oeCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4ICYmIEFscGFjYS5pc1N0cmluZyh4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgeCA9IEFscGFjYS50cmltKHgpOwoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZG9tCiAgICAgICAgICAgICAgICB2YXIgY29udmVydGVkID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9ICQoeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGFub3RoZXIgYXR0ZW1wdCB0byBhY2NvdW50IGZvciBzYWZldHkgaW4gc29tZSBicm93c2VycwogICAgICAgICAgICAgICAgICAgIHggPSAiPGRpdj4iICsgeCArICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpLmNoaWxkcmVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciBhIHZhcmlhYmxlIGlzIGVtcHR5LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0gW2Jvb2xlYW5dIGluY2x1ZGVGdW5jdGlvbnMgd2hldGhlciB0byBpbmNsdWRlIGZ1bmN0aW9ucyBpbiBhbnkgY291bnRzCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNFbXB0eTogZnVuY3Rpb24ob2JqLCBpbmNsdWRlRnVuY3Rpb25zKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IHNlbGYuY291bnRQcm9wZXJ0aWVzKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucyk7CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmoKICAgICAgICAgKiBAcGFyYW0gaW5jbHVkZUZ1bmN0aW9ucwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBjb3VudFByb3BlcnRpZXM6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICB2YXIgY291bnQgPSAwOwoKICAgICAgICAgICAgaWYgKG9iaiAmJiBBbHBhY2EuaXNPYmplY3Qob2JqKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvYmopCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRnVuY3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvYmpba10pICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb2R1Y2VzIGEgY29weSBvZiB0aGUgZ2l2ZW4gSlMgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSBzaW1wbGUgYXJyYXkgb3IgYSBzaW1wbGUgb2JqZWN0LCB0aGVuIGEgcHVyZSBjb3B5IGlzIHByb2R1Y2VkLgogICAgICAgICAqCiAgICAgICAgICogSWYgaXQncyBhIGNvbXBsZXggb2JqZWN0IG9yIGEgZnVuY3Rpb24sIHRoZW4gdGhlIHJlZmVyZW5jZSBpcyBjb3BpZWQgKGkuZS4gbm90IHRydWx5IGEgY29weSkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGhpbmcKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIGNvcHlPZjogZnVuY3Rpb24odGhpbmcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29weSA9IHRoaW5nOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29weSA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29weS5wdXNoKEFscGFjYS5jb3B5T2YodGhpbmdbaV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodGhpbmcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBEYXRlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGRhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpbmcuZ2V0VGltZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaW5nIGluc3RhbmNlb2YgUmVnRXhwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaW5nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaW5nLm5vZGVUeXBlICYmICJjbG9uZU5vZGUiIGluIHRoaW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlCiAgICAgICAgICAgICAgICAgICAgY29weSA9IHRoaW5nLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdCh0aGluZykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29weSA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaW5nKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmhhc093blByb3BlcnR5KGspKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2tdID0gQWxwYWNhLmNvcHlPZih0aGluZ1trXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCdzIHNvbWUgb3RoZXIga2luZCBvZiBvYmplY3Qgc28gd2UganVzdCBkbyBhIHJlZmVyZW50aWFsIGNvcHkKICAgICAgICAgICAgICAgICAgICAvLyBpbiBvdGhlciB3b3Jkcywgbm90IGEgY29weQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY29weTsKICAgICAgICB9LAoKICAgICAgICBjb3B5SW50bzogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShpKSAmJiAhdGhpcy5pc0Z1bmN0aW9uKHRoaXNbaV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IHNvdXJjZVtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2VzLiAgQWxpYXMgZm9yIGNvcHlPZigpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG9iamVjdAogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGNsb25lT2JqZWN0OiBmdW5jdGlvbihvYmplY3QpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNvcHlPZihvYmplY3QpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNwbGljZXMgYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlIFNvdXJjZSBzdHJpbmcgdG8gYmUgc3BsaWNlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZVBvaW50IFNwbGljZSBsb2NhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3BsaWNlIFN0cmluZyB0byBiZSBzcGxpY2VkIGluLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNwbGljZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgc3BsaWNlSW46IGZ1bmN0aW9uKHNvdXJjZSwgc3BsaWNlUG9pbnQsIHNwbGljZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnN0cmluZygwLCBzcGxpY2VQb2ludCkgKyBzcGxpY2UgKyBzb3VyY2Uuc3Vic3RyaW5nKHNwbGljZVBvaW50LCBzb3VyY2UubGVuZ3RoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYWN0cyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciBTb3VyY2UgYXJyYXkgdG8gYmUgY29tcGFjdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gQ29tcGFjdGVkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGNvbXBhY3RBcnJheTogZnVuY3Rpb24oYXJyKSB7CiAgICAgICAgICAgIHZhciBuID0gW10sIGwgPSBhcnIubGVuZ3RoLGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghbGFuZy5pc051bGwoYXJyW2ldKSAmJiAhbGFuZy5pc1VuZGVmaW5lZChhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGFycltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhY2NlbnRzIGZyb20gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFNvdXJjZSBzdHJpbmcuCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gQ2xlYW5lZCBzdHJpbmcgd2l0aG91dCBhY2NlbnRzLgogICAgICAgICAqLwogICAgICAgIHJlbW92ZUFjY2VudHM6IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1vDoMOhw6LDo8Okw6VdL2csICJhIikucmVwbGFjZSgvW8Oow6nDqsOrXS9nLCAiZSIpLnJlcGxhY2UoL1vDrMOtw67Dr10vZywgImkiKS5yZXBsYWNlKC9bw7LDs8O0w7XDtl0vZywgIm8iKS5yZXBsYWNlKC9bw7nDusO7w7xdL2csICJ1IikucmVwbGFjZSgvW8O9w79dL2csICJ5IikucmVwbGFjZSgvW8OxXS9nLCAibiIpLnJlcGxhY2UoL1vDp10vZywgImMiKS5yZXBsYWNlKC9bxZNdL2csICJvZSIpLnJlcGxhY2UoL1vDpl0vZywgImFlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gZWwKICAgICAgICAgKiBAcGFyYW0gYXJyCiAgICAgICAgICogQHBhcmFtIGZuCiAgICAgICAgICovCiAgICAgICAgaW5kZXhPZjogZnVuY3Rpb24oZWwsIGFyciwgZm4pIHsKICAgICAgICAgICAgdmFyIGwgPSBhcnIubGVuZ3RoLGk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0Z1bmN0aW9uKGZuKSkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZWx0CiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXJyRWx0CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oZWx0LCBhcnJFbHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0ID09PSBhcnJFbHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoZm4uY2FsbCh7fSwgZWwsIGFycltpXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFN0YXRpYyBjb3VudGVyIGZvciBnZW5lcmF0aW5nIGEgdW5pcXVlIElELgogICAgICAgICAqLwogICAgICAgIHVuaXF1ZUlkQ291bnRlcjogMCwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBMb2NhbGUuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdExvY2FsZTogImVuX1VTIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byBzZXQgZm9jdXMgYnkgZGVmYXVsdAogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRGb2N1czogdHJ1ZSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBmdW5jdGlvbiB0byB1c2UgZm9yIGVudW1lcmF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U29ydDogZnVuY3Rpb24oYSwgYikgewoKICAgICAgICAgICAgaWYgKGEudGV4dCA+IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYS50ZXh0IDwgYi50ZXh0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGRlZmF1bHQgTG9jYWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBOZXcgZGVmYXVsdCBsb2NhbGUuCiAgICAgICAgICovCiAgICAgICAgc2V0RGVmYXVsdExvY2FsZTogZnVuY3Rpb24obG9jYWxlKSB7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExvY2FsZSA9IGxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaWVsZCBUeXBlIHRvIFNjaGVtYSBUeXBlIE1hcHBpbmdzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBmaWVsZCB0eXBlIHRvIHNjaGVtYSBkYXRhIHR5cGUgbWFwcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzY2hlbWFUeXBlIFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZzogZnVuY3Rpb24oc2NoZW1hVHlwZSwgZmllbGRUeXBlKSB7CiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlICYmIGZpZWxkVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nW3NjaGVtYVR5cGVdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgRm9ybWF0IE1hcHBpbmdzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmc6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBmaWVsZCB0eXBlIHRvIHNjaGVtYSBmb3JtYXQgbWFwcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgU2NoZW1hIGZvcm1hdC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGRUeXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiBmdW5jdGlvbihmb3JtYXQsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoZm9ybWF0ICYmIGZpZWxkVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nW2Zvcm1hdF0gPSBmaWVsZFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHNjaGVtYSB0eXBlIG9mIGEgdmFyaWFibGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBUaGUgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gU2NoZW1hIHR5cGUgb2YgdGhlIHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYVR5cGU6IGZ1bmN0aW9uKGRhdGEpIHsKCiAgICAgICAgICAgIHZhciBzY2hlbWFUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG1hcCBkYXRhIHR5cGVzIHRvIGRlZmF1bHQgZmllbGQgdHlwZXMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gInN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJvYmplY3QiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyhkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJudW1iZXIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0Jvb2xlYW4oZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAiYm9vbGVhbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTGFzdCBjaGVjayBmb3IgZGF0YSB0aGF0IGNhcnJpZXMgZnVuY3Rpb25zIC0tIEdpdGFuYUNvbm5lY3RvciBjYXNlLgogICAgICAgICAgICBpZiAoIXNjaGVtYVR5cGUgJiYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYSBiZXN0IGd1ZXNzIGF0IHRoZSBvcHRpb25zIGZpZWxkIHR5cGUgaWYgbm9uZSBwcm92aWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZmllbGQgdHlwZQogICAgICAgICAqLwogICAgICAgIGd1ZXNzT3B0aW9uc1R5cGU6IGZ1bmN0aW9uKHNjaGVtYSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0eXBlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzY2hlbWEgJiYgdHlwZW9mKHNjaGVtYVsiZW51bSJdKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzY2hlbWFbImVudW0iXS5sZW5ndGggPiAzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2VsZWN0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhZGlvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWEudHlwZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBmb3JtYXQgZGVmaW5lZAogICAgICAgICAgICBpZiAoc2NoZW1hLmZvcm1hdCAmJiBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHlwZSA9IEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nW3NjaGVtYS5mb3JtYXRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbHBhY2EgVmlld3MuCiAgICAgICAgICovCiAgICAgICAgdmlld3M6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB2YWxpZCB2aWV3IGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gQSB2YWxpZCB1bmlxdWUgdmlldyBpZC4KICAgICAgICAgKi8KICAgICAgICBnZW5lcmF0ZVZpZXdJZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICJ2aWV3LSIgKyB0aGlzLmdlbmVyYXRlSWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB2aWV3IHdpdGggdGhlIGZyYW1ld29yay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3T2JqZWN0CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJWaWV3OiBmdW5jdGlvbih2aWV3T2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXdPYmplY3QuaWQ7CgogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHZpZXcgd2l0aCBtaXNzaW5nIHZpZXcgaWQ6ICIgKyB2aWV3SWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZXhpc3RpbmdWaWV3ID0gdGhpcy52aWV3c1t2aWV3SWRdOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdWaWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QoZXhpc3RpbmdWaWV3LCB2aWV3T2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHZpZXdPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0LnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlcyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IHByZWNvbXBpbGVkIHZpZXdzLCBmbGFnIHRoZW0KICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZHMgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5pZHMoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5naW5lSWRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZCA9IGVuZ2luZUlkc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhc2sgdGhlIGVuZ2luZSBpZiBpdCBoYXMgYW55IGNhY2hlIGtleXMgZm9yIHZpZXcgdGVtcGxhdGVzIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IGVuZ2luZS5maW5kQ2FjaGVLZXlzKHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHogPSAwOyB6IDwgY2FjaGVLZXlzLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBBbHBhY2Euc3BsaXRDYWNoZUtleShjYWNoZUtleXNbel0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcHJlY29tcGlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdPYmplY3QudGVtcGxhdGVzW3BhcnRzLnRlbXBsYXRlSWRdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogZW5naW5lSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleXNbel0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYSBub3JtYWxpemVkIHZpZXcgYnkgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIGdldE5vcm1hbGl6ZWRWaWV3OiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNvbHZlcyB3aGljaCB2aWV3IGhhbmRsZXMgYSBnaXZlbiB0aGVtZSBhbmQgdHlwZSBvZiBvcGVyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdWkKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBsb29rdXBOb3JtYWxpemVkVmlldzogZnVuY3Rpb24odWksIHR5cGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGhlVmlld0lkID0gbnVsbDsKCiAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiB0aGlzLm5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLm5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3LnVpID09PSB1aSAmJiB2aWV3LnR5cGUgPT09IHR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhlVmlld0lkID0gdmlld0lkOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhlVmlld0lkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIHRlbXBsYXRlIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZUlkIFRlbXBsYXRlIGlkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdGVtcGxhdGUgRWl0aGVyIHRoZSB0ZXh0IG9mIHRoZSB0ZW1wbGF0ZSBvciBhbiBvYmplY3QgY29udGFpbmluZyB7ICJ0eXBlIjogIjx0ZW1wbGF0ZUVuZ2luZUlkZW50aWZpZXI+IiwgInRlbXBsYXRlIjogIjxtYXJrdXA+IiB9CiAgICAgICAgICogQHBhcmFtIFtTdHJpbmddIHZpZXdJZCB0aGUgb3B0aW9uYWwgdmlldyBpZC4gIElmIG5vbmUgaXMgcHJvdmlkZWQsIHRoZW4gYWxsIHJlZ2lzdHJhdGlvbnMgYXJlIHRvIHRoZSBkZWZhdWx0IHZpZXcuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGVJZCwgdGVtcGxhdGUsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSA9IHRlbXBsYXRlOwoKICAgICAgICAgICAgLy8gaWYgbm9ybWFsaXplZCB2aWV3cyBoYXZlIGFscmVhZHkgYmVlbiBjb21wdXRlZCwgdGhlbiB3aXBlIHRoZW0gZG93bgogICAgICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGVtIHRvIGJlIHJlLWNvbXB1dGVkIG9uIHRoZSBuZXh0IHJlbmRlciBhbmQgYWxsb3dzIHRoaXMgdGVtcGxhdGUgdG8gcGFydGljaXBhdGUKICAgICAgICAgICAgaWYgKEFscGFjYS5jb3VudFByb3BlcnRpZXMoQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Eubm9ybWFsaXplZFZpZXdzID0ge307CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbGlzdCBvZiB0ZW1wbGF0ZXMgdG8gYSB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdGVtcGxhdGVzIFRlbXBsYXRlcyBiZWluZyByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSB0ZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlclRlbXBsYXRlczogZnVuY3Rpb24odGVtcGxhdGVzLCB2aWV3SWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB0ZW1wbGF0ZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJUZW1wbGF0ZSh0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZXNbdGVtcGxhdGVJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBtZXNzYWdlIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgSWQgb2YgdGhlIG1lc3NhZ2UgYmVpbmcgcmVnaXN0ZXJlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIHJlZ2lzdGVyZWQKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmlld0lkIElkIG9mIHRoZSB2aWV3IHRoYXQgdGhlIG1lc3NhZ2UgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2VJZCwgbWVzc2FnZSwgdmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgbm8gdmlldyBzcGVjaWZpZWQsIGZhbGwgYmFjayB0byB0aGUgYmFzZSB2aWV3IHdoaWNoIGlzICJiYXNlIgogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gImJhc2UiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdID0ge307CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0uaWQgPSB2aWV3SWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0ubWVzc2FnZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzW21lc3NhZ2VJZF0gPSBtZXNzYWdlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBtZXNzYWdlcyB3aXRoIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2VzIE1lc3NhZ2VzIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlcyBiZWluZyByZWdpc3RlcmVkIHRvLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyTWVzc2FnZXM6IGZ1bmN0aW9uKG1lc3NhZ2VzLCB2aWV3SWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIG1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXMuaGFzT3duUHJvcGVydHkobWVzc2FnZUlkKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlKG1lc3NhZ2VJZCwgbWVzc2FnZXNbbWVzc2FnZUlkXSwgdmlld0lkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgZGF0ZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdERhdGVGb3JtYXQ6ICJNTS9ERC9ZWVlZIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCB0aW1lIGZvcm1hdC4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0VGltZUZvcm1hdDogIkhIOm1tOnNzIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVndWxhciBleHByZXNzaW9ucyBmb3IgZmllbGRzLgogICAgICAgICAqLwogICAgICAgIHJlZ2V4cHM6CiAgICAgICAgewogICAgICAgICAgICAiZW1haWwiOiAvXlthLXowLTkhXCNcJCUmJ1wqXC1cLz1cP1wrXC1cXl9gXHtcfFx9fl0rKD86XC5bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKykqQCg/OlthLXowLTldKD86W2EtejAtOS1dKlthLXowLTldKT9cLikrW2Etel17Miw2fSQvaSwKICAgICAgICAgICAgInVybCI6IC9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvW2EtejAtOV0rKFtcLVwuXXsxfVthLXowLTldKykqXC5bYS16XXsyLDV9KFw6WzAtOV17MSw1fSk/KFwvLiopPyQvaSwKICAgICAgICAgICAgImludHJhbmV0LXVybCI6IC9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvW2EtejAtOV0rKFtcLVwuXXsxfVthLXowLTldKykqKFw6WzAtOV17MSw1fSk/KFwvLiopPyQvaSwKICAgICAgICAgICAgInBhc3N3b3JkIjogL15bMC05YS16QS1aXHgyMC1ceDdFXSokLywKICAgICAgICAgICAgImRhdGUiOiAvXigwWzEtOV18MVswMTJdKVstIC8uXSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVstIC8uXVxkXGQkLywKICAgICAgICAgICAgImludGVnZXIiOiAvXihbXCtcLV0/KFsxLTldXGQqKXwwKSQvLAogICAgICAgICAgICAibnVtYmVyIjovXihbXCtcLV0/KCgoWzAtOV0rKFwuKT8pfChbMC05XSpcLlswLTldKykpKFtlRV1bKy1dP1swLTldKyk/KSkkLywKICAgICAgICAgICAgInBob25lIjovXihcRD8oXGR7M30pXEQ/XEQ/KFxkezN9KVxEPyhcZHs0fSkpPyQvLAogICAgICAgICAgICAiaXB2NCI6L14oPzoxXGQ/XGQ/fDIoPzpbMC00XVxkP3xbNjc4OV18NVswLTVdPyk/fFszLTldXGQ/fDApKD86XC4oPzoxXGQ/XGQ/fDIoPzpbMC00XVxkP3xbNjc4OV18NVswLTVdPyk/fFszLTldXGQ/fDApKXszfSQvLAogICAgICAgICAgICAiemlwY29kZS1maXZlIjogL14oXGR7NX0pPyQvLAogICAgICAgICAgICAiemlwY29kZS1uaW5lIjogL14oXGR7NX0oLVxkezR9KT8pPyQvLAogICAgICAgICAgICAid2hpdGVzcGFjZSI6IC9eXHMrJC8KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXAgb2YgaW5zdGFudGlhdGVkIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZEluc3RhbmNlczoge30sCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcHMgb2YgZmllbGQgdHlwZXMgdG8gZmllbGQgY2xhc3MgaW1wbGVtZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGZpZWxkQ2xhc3NSZWdpc3RyeToge30sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgdGhpcy5maWVsZENsYXNzUmVnaXN0cnlbdHlwZV0gPSBmaWVsZENsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHR5cGUgb2YgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgY2xhc3MgbWFwcGVkIHRvIGZpZWxkIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnlbdHlwZV07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZmllbGQgdHlwZSBpZCBmb3IgYSBnaXZlbiBmaWVsZCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkZpZWxkfSBmaWVsZENsYXNzIEZpZWxkIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRmllbGQgdHlwZSBvZiB0aGUgZmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRDbGFzc1R5cGU6IGZ1bmN0aW9uKGZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgZm9yICh2YXIgdHlwZSBpbiB0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5Lmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID09PSBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGNvbm5lY3RvciB0eXBlcyB0byBjb25uZWN0b3IgY2xhc3MgaW1wbGVtZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RvckNsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgY29ubmVjdG9yIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBjQ29ubmVjdCB0eXBlCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3JDbGFzcyBDb25uZWN0b3IgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSwgY29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gY29ubmVjdG9yQ2xhc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgY29ubmVjdG9yIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBDb25uZWN0IHR5cGUuCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5Db25uZWN0b3J9IENvbm5lY3RvciBjbGFzcyBtYXBwZWQgdG8gY29ubmVjdCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldENvbm5lY3RvckNsYXNzOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RvckNsYXNzUmVnaXN0cnlbdHlwZV07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgZWFjaCBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gcmVwbGFjZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBTb3VyY2Ugc3RyaW5nIGJlaW5nIHJlcGxhY2VkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXBsYWNlIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcmVwbGFjaW5nLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB3aXRoX3RoaXMgUmVwbGFjZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXBsYWNlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgcmVwbGFjZUFsbDogZnVuY3Rpb24odGV4dCwgcmVwbGFjZSwgd2l0aF90aGlzKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChyZXBsYWNlLCAnZycpLCB3aXRoX3RoaXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCB3aXRoIGEgZ2l2ZW4gdGFnIG5hbWUsIGRvbS9zdHlsZSBhdHRyaWJ1dGVzIGFuZCBjbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0YWcgVGFnIG5hbWUuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gZG9tQXR0cmlidXRlcyBET00gYXR0cmlidXRlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzdHlsZUF0dHJpYnV0ZXMgU3R5bGUgYXR0cmlidXRlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBjbGFzc05hbWVzIENsYXNzIG5hbWVzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTmV3IGVsZW1lbnQgd2l0aCB0aGUgdGFnIG5hbWUgYW5kIGFsbCBvdGhlciBwcm92aWRlZCBhdHRyaWJ1dGVzLgogICAgICAgICAqLwogICAgICAgIGVsZW1lbnQ6IGZ1bmN0aW9uKHRhZywgZG9tQXR0cmlidXRlcywgc3R5bGVBdHRyaWJ1dGVzLCBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgIHZhciBlbCA9ICQoIjwiICsgdGFnICsgIi8+Iik7CgogICAgICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuYXR0cihkb21BdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3R5bGVBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBlbC5jc3Moc3R5bGVBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xhc3NOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgYSB0ZW1wbGF0ZSB3aXRoIGxpc3Qgb2YgcmVwbGFjZW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlIFRlbXBsYXRlIGJlaW5nIHByb2Nlc3NlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3Vic3RpdHV0aW9ucyBMaXN0IG9mIHN1YnN0aXR1dGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXBsYWNlZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50RnJvbVRlbXBsYXRlOiBmdW5jdGlvbih0ZW1wbGF0ZSwgc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICB2YXIgaHRtbCA9IHRlbXBsYXRlOwogICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBzdWJzdGl0dXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IEFscGFjYS5yZXBsYWNlQWxsKGh0bWwsICIkeyIgKyB4ICsgIn0iLCBzdWJzdGl0dXRpb25zW3hdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJChodG1sKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHVuaXF1ZSBhbHBhY2EgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFscGFjYS51bmlxdWVJZENvdW50ZXIrKzsKICAgICAgICAgICAgcmV0dXJuICJhbHBhY2EiICsgQWxwYWNhLnVuaXF1ZUlkQ291bnRlcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJvdmlkZSBZQUhPTyBsYXRlciBsaWtlIGNhcGFiaWxpdGllcy4KICAgICAgICAgKi8KICAgICAgICBsYXRlcjogZnVuY3Rpb24od2hlbiwgbywgZm4sIGRhdGEsIHBlcmlvZGljKSB7CiAgICAgICAgICAgIHdoZW4gPSB3aGVuIHx8IDA7CiAgICAgICAgICAgIG8gPSBvIHx8IHt9OwogICAgICAgICAgICB2YXIgbSA9IGZuLCBkID0gJC5tYWtlQXJyYXkoZGF0YSksIGYsIHI7CgogICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgbSA9IG9bZm5dOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIW0pIHsKICAgICAgICAgICAgICAgIC8vIFRocm93IGFuIGVycm9yIGFib3V0IHRoZSBtZXRob2QKICAgICAgICAgICAgICAgIHRocm93IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVHlwZUVycm9yJywKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4iCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbS5hcHBseShvLCBkKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHIgPSAocGVyaW9kaWMpID8gc2V0SW50ZXJ2YWwoZiwgd2hlbikgOiBzZXRUaW1lb3V0KGYsIHdoZW4pOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiByLAogICAgICAgICAgICAgICAgaW50ZXJ2YWw6IHBlcmlvZGljLAogICAgICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYW4gc3RyaW5nIGVuZHMgd2l0aCBhIGdpdmVuIHN1ZmZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWZmaXggU3VmZml4LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBlbmRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHN1ZmZpeCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHN1ZmZpeCwgdGV4dC5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYW4gc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gcHJlZml4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHN0cmluZyBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeCBQcmVmaXgKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBzdGFydHNXaXRoIDogZnVuY3Rpb24odGV4dCwgcHJlZml4KSB7CiAgICAgICAgICAgIC8vcmV0dXJuICh0ZXh0Lm1hdGNoKCJeIiArIHByZWZpeCkgPT0gcHJlZml4KTsKICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYSB2YXJpYWJsZSBpcyBhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBVUkksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VyaSA6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzU3RyaW5nKG9iaikgJiYgKEFscGFjYS5zdGFydHNXaXRoKG9iaiwgImh0dHA6Ly8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgImh0dHBzOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICIvIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICIuLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi4vIikpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGEgc3ViLWVsZW1lbnQgZnJvbSBhbiBvYmplY3QgdXNpbmcgYSBrZXlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBPYmplY3QgdG8gYmUgdHJhdmVyc2VkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGtleXMgRWl0aGVyIGFuIGFycmF5IG9mIHRva2VucyBvciBhIGRvdC1kZWxpbWl0ZWQgc3RyaW5nIChpLmUuICJkYXRhLnVzZXIuZmlyc3RuYW1lIikKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VicHJvcCBPcHRpb25hbCBzdWJwcm9wZXJ0eSB0byB0cmF2ZXJzZSAoaS5lLi4gImRhdGEucHJvcGVydGllcy51c2VyLnByb3BlcnRpZXMuZmlyc3RuYW1lIikKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFN1YiBlbGVtZW50IG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5IHBhdGgKICAgICAgICAgKi8KICAgICAgICB0cmF2ZXJzZU9iamVjdCA6IGZ1bmN0aW9uKG9iamVjdCwga2V5cywgc3VicHJvcCkgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGtleXMpKSB7CiAgICAgICAgICAgICAgICBrZXlzID0ga2V5cy5zcGxpdCgiLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZWxlbWVudCA9IG51bGw7CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gb2JqZWN0OwoKICAgICAgICAgICAgdmFyIGtleSA9IG51bGw7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGtleSA9IGtleXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIGlmIChzdWJwcm9wICYmIGtleSA9PT0gc3VicHJvcCkgewogICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY3VycmVudFtrZXldKSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAga2V5cyA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlIChrZXlzLmxlbmd0aCA+IDApOwoKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHVwb24gZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheQogICAgICAgICAqIFRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBiZWNvbWVzIHRoZSAidGhpcyIgdmFyaWFibGUgaW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gZGF0YSBFaXRoZXIgYW4gYXJyYXkgb3IgYW4gb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBGdW5jdGlvbiB0byBiZSBleGVjdXRlZC4KICAgICAgICAgKi8KICAgICAgICBlYWNoIDogZnVuY3Rpb24oZGF0YSwgZnVuYykgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoZGF0YVtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoZGF0YVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uIG9iajIgaW50byBvYmoxIHVzaW5nIGEgcmVjdXJzaXZlIGFwcHJvYWNoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajEgRGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyIFNvdXJjZSBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdmFsaWRLZXlGdW5jdGlvbiBGdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGluY2x1ZGUgYSBnaXZlbiBrZXkgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTWVyZ2VkIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBtZXJnZSA6IGZ1bmN0aW9uKG9iajEsIG9iajIsIHZhbGlkS2V5RnVuY3Rpb24pIHsKICAgICAgICAgICAgaWYgKCFvYmoxKSB7CiAgICAgICAgICAgICAgICBvYmoxID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iajIpIHsKICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkS2V5RnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkS2V5RnVuY3Rpb24oa2V5KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdChvYmoyW2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iajFba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gQWxwYWNhLm1lcmdlKG9iajFba2V5XSwgb2JqMltrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG9iajE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWVyZ2VzIGpzb24gInNvdXJjZSIgaW50byAidGFyZ2V0IiB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4gVGhlIG1lcmdlIHdpbGwgaW5jbHVkZSBlbXB0eSB2YWx1ZXMKICAgICAgICAgKiBvZiBvYmoyIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRhcmdldCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTWVyZ2VkIG9iamVjdAogICAgICAgICAqLwogICAgICAgIG1lcmdlT2JqZWN0IDogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKCiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0YXJnZXQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHNvdXJjZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm1lcmdlT2JqZWN0Mihzb3VyY2UsIHRhcmdldCk7CgogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH0sCgogICAgICAgIG1lcmdlT2JqZWN0MjogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNBcnJheSA9IEFscGFjYS5pc0FycmF5OwogICAgICAgICAgICB2YXIgaXNPYmplY3QgPSBBbHBhY2EuaXNPYmplY3Q7CiAgICAgICAgICAgIHZhciBpc1VuZGVmaW5lZCA9IEFscGFjYS5pc1VuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvcHlPZiA9IEFscGFjYS5jb3B5T2Y7CgogICAgICAgICAgICB2YXIgX21lcmdlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFycmF5IGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChjb3B5T2Yoc291cmNlW2luZGV4XSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIEFSUkFZCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdCh0YXJnZXQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2Ugb2JqZWN0IHByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHNvdXJjZSwgZnVuY3Rpb24oa2V5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHRhcmdldFtrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gY29weU9mKHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBfbWVyZ2Uoc291cmNlW2tleV0sIHRhcmdldFtrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgaXMgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IHRoYXQgaXNuJ3QgYW4gT0JKRUNUCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBhIHNjYWxhciwgYWx3YXlzIG92ZXJ3cml0ZQogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvcHlPZihzb3VyY2UpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBfbWVyZ2Uoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdWJzdGl0dXRlcyBhIHN0cmluZyB3aXRoIGEgbGlzdCBvZiB0b2tlbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGV4dCBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEBwYXJhbSBhcmdzIExpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgU3Vic3RpdHV0ZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHN1YnN0aXR1dGVUb2tlbnMgOiBmdW5jdGlvbih0ZXh0LCBhcmdzKSB7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRleHQpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAieyIgKyBpICsgIn0iOwoKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHRleHQuaW5kZXhPZih0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnQgPSB0ZXh0LnN1YnN0cmluZygwLCB4KSArIGFyZ3NbaV0gKyB0ZXh0LnN1YnN0cmluZyh4ICsgMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBudDsKICAgICAgICAgICAgICAgICAgICAgICAgLy90ZXh0ID0gQWxwYWNhLnJlcGxhY2VBbGwodGV4dCwgdG9rZW4sIGFyZ3NbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0d28gb2JqZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIEZpcnN0IG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTZWNvbmQgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdHdvIG9iamVjdHMgYXJlIHNhbWUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBjb21wYXJlT2JqZWN0IDogZnVuY3Rpb24ob2JqMSwgb2JqMikgewogICAgICAgICAgICByZXR1cm4gZXF1aXYob2JqMSwgb2JqMik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgY29udGVudCBvZiB0d28gYXJyYXlzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyXzEgRmlyc3QgYXJyYXkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyXzIgU2Vjb25kIGFycmF5LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBhcnJheXMgaGF2ZSBzYW1lIGNvbnRlbnQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBjb21wYXJlQXJyYXlDb250ZW50IDogZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICB2YXIgZXF1YWwgPSBhICYmIGIgJiYgKGEubGVuZ3RoID09PSBiLmxlbmd0aCk7CgogICAgICAgICAgICBpZiAoZXF1YWwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBhW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkodiwgYikgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBlcXVhbDsKICAgICAgICB9LAoKICAgICAgICB0ZXN0UmVnZXg6IGZ1bmN0aW9uKGV4cHJlc3Npb24sIHRleHRWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoZXhwcmVzc2lvbik7CgogICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh0ZXh0VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBoYXMgZW1wdHkgdmFsdWUgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbCBWYXJpYWJsZSB0byBiZSBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbiBpbiBhbnkgY291bnRzCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNWYWxFbXB0eSA6IGZ1bmN0aW9uKHZhbCwgaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICB2YXIgZW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCwgaW5jbHVkZUZ1bmN0aW9ucykpIHsKICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSAmJiB2YWwgPT09ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWwpICYmICQuaXNFbXB0eU9iamVjdCh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc051bWJlcih2YWwpICYmIGlzTmFOKHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbXB0eTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIGZpZWxkIGluc3RhbmNlIGFuZCBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIG5lZWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBDb250YWluZXIgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluaXRpYWxTZXR0aW5ncyBhbnkgYWRkaXRpb25hbCBzZXR0aW5ncyBwcm92aWRlZCB0byB0aGUgdG9wLWxldmVsIEFscGFjYSBvYmplY3QKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBSZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVuZGVyZWRDYWxsYmFjayBQb3N0LXJlbmRlciBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5jb25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IE5ldyBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKi8KICAgICAgICBpbml0OiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCByZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBDT01QSUxBVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgYW4gaW5saW5lIHZpZXcgb2JqZWN0LCB3ZSBhc3NpZ24gYW4gaWQgYW5kIHN0b3JlIG9udG8gdmlld3MgbWFwCiAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgZ2V0cyBjb21waWxlZCBhbG9uZyB3aXRoIHRoZSByZXN0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmlldykpIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3LmlkOwogICAgICAgICAgICAgICAgaWYgKCF2aWV3SWQpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LmlkID0gdGhpcy5nZW5lcmF0ZVZpZXdJZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gdmlldy5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpZXcucGFyZW50ID0gImJvb3RzdHJhcC1lZGl0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHZpZXcpOwogICAgICAgICAgICAgICAgdmlldyA9IHZpZXcuaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbXBpbGUgYWxsIG9mIHRoZSB2aWV3cyBhbmQgdGVtcGxhdGVzCiAgICAgICAgICAgIHRoaXMuY29tcGlsZShjb25uZWN0b3IsIGZ1bmN0aW9uKHJlcG9ydCkgewoKICAgICAgICAgICAgICAgIGlmIChyZXBvcnQuZXJyb3JzICYmIHJlcG9ydC5lcnJvcnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBvcnQuZXJyb3JzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHJlcG9ydC5lcnJvcnNbaV0udmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gcmVwb3J0LmVycm9yc1tpXS5jYWNoZUtleQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gcmVwb3J0LmVycm9yc1tpXS5lcnI7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICJUaGUgdGVtcGxhdGUgd2l0aCBjYWNoZSBrZXk6ICIgKyBjYWNoZUtleSArICIgZm9yIHZpZXc6ICIgKyB2aWV3SWQgKyAiIGZhaWxlZCB0byBjb21waWxlIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiLCBtZXNzYWdlOiAiICsgZXJyLm1lc3NhZ2U7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiLCBlcnI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcih0ZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLm5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi52aWV3c1t2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJWaWV3IGNvbXBpbGF0aW9uIGZhaWxlZCwgY2Fubm90IGluaXRpYWxpemUgQWxwYWNhLiAiICsgbWVzc2FnZXMuam9pbigiLCAiKSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5faW5pdChlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCByZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgUkVTT0xVVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgogICAgICAgICAgICAvLyBtYWtlIHNvbWUgaW50ZWxsaWdlbnQgZ3Vlc3NlcyBhYm91dCB3aGF0IHZpZXcgaWQgd2UgbWlnaHQgZGVmYXVsdCB0byBpbiBjYXNlIHRoZXkgd2FudCB0byB1c2UKICAgICAgICAgICAgLy8gYXV0by12aWV3IHNlbGVjdGlvbi4gIFdlIGRldGVjdCBqcXVlcnktdWksIGJvb3RzdHJhcCBhbmQganF1ZXJ5bW9iaWxlLiAgSWYgbm90aGluZyBjYW4gYmUgZGV0ZWN0ZWQsCiAgICAgICAgICAgIC8vIHdlIGZhbGwgYmFjayB0byBzdHJhaWdodCB3ZWIgdmlld3MuCiAgICAgICAgICAgIHZhciBmYWxsYmFja1VJICAgPSBBbHBhY2EuZGVmYXVsdFZpZXcgfHwgbnVsbDsKICAgICAgICAgICAgdmFyIGZhbGxiYWNrVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBkZXRlY3QgalF1ZXJ5IE1vYmlsZQogICAgICAgICAgICBpZiAoJC5tb2JpbGUgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5bW9iaWxlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IHR3aXR0ZXIgYm9vdHN0cmFwCiAgICAgICAgICAgIHZhciBib290c3RyYXBEZXRlY3RlZCA9ICh0eXBlb2YgJC5mbi5tb2RhbCA9PT0gJ2Z1bmN0aW9uJyk7CiAgICAgICAgICAgIGlmIChib290c3RyYXBEZXRlY3RlZCAmJiAhZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9ICJib290c3RyYXAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZXRlY3QganF1ZXJ5IHVpCiAgICAgICAgICAgIHZhciBqUXVlcnlVSURldGVjdGVkID0gKHR5cGVvZigkLnVpKSAhPT0gInVuZGVmaW5lZCIpOwogICAgICAgICAgICBpZiAoalF1ZXJ5VUlEZXRlY3RlZCAmJiAhZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9ICJqcXVlcnl1aSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmYWxsYmFja1VJKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJlZGl0IjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tUeXBlID0gImNyZWF0ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgcHJvdmlkZWQsIGJ1dCB0aGV5IHByb3ZpZGVkICJ1aSIgYW5kIG9wdGlvbmFsbHkgInR5cGUiLCB0aGVuIHdlIHRyeSB0byBhdXRvLXNlbGVjdCB0aGUgdmlldwogICAgICAgICAgICBpZiAoIXZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB1aSA9IGluaXRpYWxTZXR0aW5ncy51aTsKICAgICAgICAgICAgICAgIHZhciB0eXBlID0gaW5pdGlhbFNldHRpbmdzLnR5cGU7CgogICAgICAgICAgICAgICAgaWYgKCF1aSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9IEFscGFjYS5kZWZhdWx0VUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpID0gZmFsbGJhY2tVSTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHVpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBmYWxsYmFja1R5cGUgPyBmYWxsYmFja1R5cGUgOiAiZWRpdCI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgcHJvdmlkZWQgYnV0IGZvdW5kIHJlcXVlc3QgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gYXV0by1zZWxlY3QgYSB2aWV3CiAgICAgICAgICAgICAgICAgICAgdmlldyA9IHRoaXMubG9va3VwTm9ybWFsaXplZFZpZXcodWksIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRm91bmQgdmlldzogIiArIHZpZXcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiTm8gdmlldyBmb3VuZCBmb3IgVUk6ICIgKyB1aSArICIgYW5kIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgdmlldyBpcyBhIHN0cmluZyAodGhlIHZpZXcgaWQpIG9yIGl0IGlzIGVtcHR5L251bGwKCiAgICAgICAgICAgIC8vIGlmIHN0aWxsIG5vIHZpZXcsIHRoZW4gZGVmYXVsdCBmYWxsYmFjayB0byBvdXIgZGV0ZWN0ZWQgdmlldyBvciB0aGUgZGVmYXVsdAogICAgICAgICAgICBpZiAoIXZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQSB2aWV3IHdhcyBub3Qgc3BlY2lmaWVkIGFuZCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVidWdnaW5nOiBpZiB0aGUgdmlldyBpc24ndCBhdmFpbGFibGUsIHdlIHdhbnQgdG8gcmVwb3J0IGl0IHJpZ2h0IGF3YXkKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vcm1hbGl6ZWRWaWV3c1t2aWV3XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVGhlIGRlc2lyZWQgdmlldzogIiArIHZpZXcgKyAiIGNvdWxkIG5vdCBiZSBsb2FkZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGxvYWRlZCBhbmQgbm90IG1pc3NwZWxsZWQuIiwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBGSUVMRCBJTlNUQU5USUFUSU9OCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAgICAgLy8gVEVTVCAtIHN3YXAgY29kZQogICAgICAgICAgICAgICAgLy8gc3dhcCBlbCAtPiBwbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgLy92YXIgdGVtcEhvbGRlciA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLmJlZm9yZSh0ZW1wSG9sZGVyKTsKICAgICAgICAgICAgICAgIC8vJChlbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gQWxwYWNhLmNyZWF0ZUZpZWxkSW5zdGFuY2UoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGZpZWxkIHdoaWxlIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtcmVuZGVyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuYWRkQ2xhc3MoImFscGFjYS1oaWRkZW4iKTsKCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2ZpZWxkLmdldElkKCldID0gZmllbGQ7CgogICAgICAgICAgICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgbG9va2luZyB1cCBmaWVsZCBpbnN0YW5jZXMgYnkgaWQKICAgICAgICAgICAgICAgICAgICBmaWVsZC5hbGxGaWVsZEluc3RhbmNlcyA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZmllbGRJbnN0YW5jZXM7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgY2FsbGJhY2tzIGRlZmluZWQgdGhyb3VnaCB2aWV3CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZpZWxkLnZpZXcucmVuZGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkocmVuZGVyZWRDYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayA9IGZpZWxkLnZpZXcucG9zdFJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBmaW4gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB3ZSBhcHBseSBzb21lIGFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLSIgKyBzZWxmLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXcpLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB3ZSBtYXJrIGFzIHRvcAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtdG9wIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBhbHBhY2EgZmllbGQsIHRoZW4gd2UgY2FsbCBmb3IgdmFsaWRhdGlvbiBzdGF0ZSB0byBiZSByZWNhbGN1bGF0ZWQgYWNyb3NzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBjaGlsZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIGNhbGwgdG8gdXBkYXRlIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gc3VzcGVuZCBpbml0aWFsIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgdG8gZmFsc2UgZm9yIGZpZWxkIGFuZCBhbGwgY2hpbGRyZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC52aWV3LnR5cGUgIT09ICd2aWV3JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oZmllbGQsIGZ1bmN0aW9uKGZpZWxkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gZmFsc2UgYWZ0ZXIgZmlyc3QgdmFsaWRhdGlvbiAoZXZlbiBpZiBpbiBDUkVBVEUgbW9kZSwgd2Ugb25seSBmb3JjZSBpbml0IHZhbGlkYXRpb24gZXJyb3IgZmFsc2Ugb24gZmlyc3QgcmVuZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvciA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVEVTVCAtIHN3YXAgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FwIHBsYWNlaG9sZGVyIC0+IGVsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0ZW1wSG9sZGVyKS5iZWZvcmUoZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlYWwgZmllbGQgYWZ0ZXIgcmVuZGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtcmVuZGVyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBmaWVsZCB0aGF0IG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAsIGRvIHNvIG5vdwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuX29sZEZpZWxkRWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmllbGQuX29sZEZpZWxkRWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZmllbGQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZpZWxkLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVuZGVyZWRDYWxsYmFjayA9IHJlbmRlcmVkQ2FsbGJhY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgY2FuIGJlIG51bGwgaWYgYW4gZXJyb3Igd2FzIHRocm93biBvciBpZiBhIHZpZXcgd2Fzbid0IGZvdW5kCiAgICAgICAgICAgIC8vIEFjdHVhbGx5IGl0J2QgYWx3YXlzIGJlIHVuZGVmaW5lZCBiZWNhdXNlIGZpZWxkIGlzIGluIGFub3RoZXIgc2NvcGUuCiAgICAgICAgICAgIC8vIHJldHVybiBmaWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGVsIFRoZSBkb20gZWxlbWVudCB0byBhY3QgYXMgdGhlIGNvbnRhaW5lciBvZiB0aGUgY29uc3RydWN0ZWQgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIGRhdGEgdG8gYmUgYm91bmQgaW50byB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIFRoZSBzY2hlbWEgZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgVGhlIHZpZXcgZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5jb25uZWN0b3J9IGNvbm5lY3RvciBUaGUgZmllbGQgY29ubmVjdG9yIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlRmllbGRJbnN0YW5jZSA6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG9wdGlvbnMgYW5kIHNjaGVtYSBhcmUgbm90IGVtcHR5CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eShvcHRpb25zLCB0cnVlKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eShzY2hlbWEsIHRydWUpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3B0aW9ucyBjYW4gYmUgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGZpZWxkIHRvIGNvbnN0cnVjdCAoaS5lLiAidGV4dCIpCiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIEFscGFjYS5pc1N0cmluZyhvcHRpb25zKSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSBmaWVsZFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIG5vdGhpbmcgcGFzc2VkIGluLCB3ZSBjYW4gdHJ5IHRvIG1ha2UgYSBndWVzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBkYXRhCiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSBBbHBhY2EuZ2V0U2NoZW1hVHlwZShkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBBbHBhY2EuaXNBcnJheShkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEudHlwZSA9ICJhcnJheSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEudHlwZSA9ICJvYmplY3QiOyAvLyBmYWxsYmFjawogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB1c2luZyB3aGF0IHdlIG5vdyBhYm91dCBzY2hlbWEsIHRyeSB0byBndWVzcyB0aGUgdHlwZQogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gQWxwYWNhLmd1ZXNzT3B0aW9uc1R5cGUoc2NoZW1hKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmaW5kIHRoZSBmaWVsZCBjbGFzcyByZWdpc3RlcmVkIGZvciB0aGlzIGZpZWxkIHR5cGUKICAgICAgICAgICAgdmFyIEZpZWxkQ2xhc3MgPSBBbHBhY2EuZ2V0RmllbGRDbGFzcyhvcHRpb25zLnR5cGUpOwogICAgICAgICAgICBpZiAoIUZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGZpbmQgZmllbGQgY2xhc3MgZm9yIHR5cGU6ICIgKyBvcHRpb25zLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJGSUVMRF9JTlNUQU5USUFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGRhdGEsIGJpbmQgaXQgaW4KICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENsYXNzKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBmb3JtZXIgalF1ZXJ5IDEuOC4zIHBhcnNlSlNPTiBmdW5jdGlvbiAodGhpcyB3YXMgY2hhbmdlZAogICAgICAgICAqIGZvciBqUXVlcnkgMS45LjAgYW5kIGludHJvZHVjZXMgYWxsIGtpbmRzIG9mIGlzc3VlcykuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGV4dAogICAgICAgICAqLwogICAgICAgIHBhcnNlSlNPTjogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTih0ZXh0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyBhbGwgb2YgdGhlIHZpZXdzLCBub3JtYWxpemluZyB0aGVtIGZvciB1c2UgYnkgQWxwYWNhLgogICAgICAgICAqIEFsc28gY29tcGlsZXMgYW55IHRlbXBsYXRlcyB0aGF0IHRoZSB2aWV3cyBtYXkgcmVmZXJlbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbm5lY3RvciB0aGUgY29ubmVjdG9yCiAgICAgICAgICogQHBhcmFtIGNiIHRoZSBjYWxsYmFjayB0aGF0IGdldHMgZmlyZWQgb25jZSBjb21waWxhdGlvbiBoYXMgZW5kZWQKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBmaXJlZCBpZiB0aGUgY29tcGlsZSBmYWlscyBmb3IgYW55IHJlYXNvbgogICAgICAgICAqLwogICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGNvbm5lY3RvciwgY2IsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB2YXIgdDEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCiAgICAgICAgICAgIHZhciByZXBvcnQgPSB7CiAgICAgICAgICAgICAgICAiZXJyb3JzIjogW10sCiAgICAgICAgICAgICAgICAiY291bnQiOiAwLAogICAgICAgICAgICAgICAgInN1Y2Nlc3NDb3VudCI6IDAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaW5hbENhbGxiYWNrID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2YXIgdDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDb21waWxhdGlvbiBFeGl0ZWQgd2l0aCAiICsgcmVwb3J0LmVycm9ycy5sZW5ndGggKyAiIGVycm9ycyBpbjogIiArICh0Mi10MSkrICIgbXMiKTsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycy5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcyEKCiAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdXIgdmlld3MgaW50byB0aGUgbm9ybWFsaXplZCBzZXQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzW2tdID0gbm9ybWFsaXplZFZpZXdzW2tdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYihyZXBvcnQpOwogICAgICAgICAgICB9OwoKCgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVklFVyBURU1QTEFURSBDT01QSUxBVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIC8vIGZvciBhbGwgb2YgdGhlIHZpZXdzICh0aGUgb3JpZ2luYWwgb25lcywgbm90IHRoZSBjb21waWxlZCBvbmVzKSwgd2FsayB0aHJvdWdoIHRoZW0gYW5kIGZpbmQgYW55CiAgICAgICAgICAgIC8vIGFuZCBhbGwgdGVtcGxhdGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZCwgY29tcGlsZSB0aGVtLCBldGMuCgogICAgICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZpcmVkIHdoZW4gYSBjb21waWxhdGlvbiBlaXRoZXIgZmFpbHMgb3Igc3VjY2VlZHMKICAgICAgICAgICAgLy8gaWYgaXQgZmFpbHMsIGVyciBpcyBzZXQsIG90aGVyd2lzZSBjYWNoZUtleSBoYXMgdGhlCiAgICAgICAgICAgIHZhciB2aWV3Q29tcGlsZUNhbGxiYWNrID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKCiAgICAgICAgICAgICAgICByZXBvcnQuY291bnQrKzsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LmVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiB2aWV3SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IGNhY2hlS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyIjogZXJyCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LnN1Y2Nlc3NDb3VudCsrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChyZXBvcnQuY291bnQgPT0gdG90YWxDYWxscykgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluYWxDYWxsYmFjayhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNvbXBpbGVWaWV3VGVtcGxhdGUgPSBmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkKTsKCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaGFuZGxlYmFycyBhcyB0aGUgZW5naW5lIHdlJ2xsIHVzZQogICAgICAgICAgICAgICAgdmFyIGVuZ2luZVR5cGUgPSAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiOwoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhlIHRlbXBsYXRlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gb2JqZWN0IHRvIGV4cGxpY2l0bHkgZGVmaW5lIHRoZSB0eXBlIG9mIGVuZ2luZSB0byB1c2UuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSAmJiBBbHBhY2EuaXNPYmplY3QodGVtcGxhdGUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSB0ZW1wbGF0ZS50eXBlOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcHJlY29tcGlsZWQgdGVtcGxhdGUsIHN3YXAgY2FjaGUga2V5cwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5jYWNoZUtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSA9IHRlbXBsYXRlLmNhY2hlS2V5OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIElmIHRlbXBsYXRlIGlzIGEgc3RyaW5nLCB0aGVuIGl0IGlzIGVpdGhlciBzb21lIHRleHQgdGhhdCB3ZSBjYW4gdHJlYXQgYXMgYSB0ZW1wbGF0ZSBvciBpdCBpcwogICAgICAgICAgICAgICAgICogYSBVUkwgdGhhdCB3ZSBzaG91bGQgZHluYW1pY2FsbHkgbG9hZCBhbmQgdHJlYXQgdGhlIHJlc3VsdCBhcyBhIHRlbXBsYXRlLiAgSXQgbWF5IGFsc28gYmUgYQogICAgICAgICAgICAgICAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gbG9jYXRlIHNvbWV0aGluZyB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgd2Ugc2hvdWxkIGxvYWQgdGV4dCBmcm9tLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgdHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVcmkoeCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhpcyBpcyBhIFVSTCBhbmQgbGV0IHRoZSB0ZW1wbGF0ZSBlbmdpbmUgZGVhbCB3aXRoIGl0CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlICYmICgodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwKSB8fCAodGVtcGxhdGUuaW5kZXhPZigiLiIpID09PSAwKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBqUXVlcnkgc2VsZWN0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21FbCA9ICQodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lVHlwZSA9ICQoZG9tRWwpLmF0dHIoInR5cGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAkKGRvbUVsKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgcmVmZXJlbmNlZCBieSB0ZW1wbGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1RlbXBsYXRlID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBleGlzdGluZ1RlbXBsYXRlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZW5naW5lIHR5cGUgaGVyZSwgdGhyb3cKICAgICAgICAgICAgICAgIGlmICghZW5naW5lVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkVuZ2luZSB0eXBlIHdhcyBlbXB0eSIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb29rIHVwIHRoZSBlbmdpbmUKICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICAgICAgaWYgKCFlbmdpbmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgZm9yIHR5cGU6ICIgKyB0eXBlKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGVtcGxhdGUgPT09IHRydWUsIHRoZW4gdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGVtcGxhdGUgaXMgcHJlLWNvbXBpbGVkLgogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlID09PSB0cnVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUuaXNDYWNoZWQoY2FjaGVLZXkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGdvb2QKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG51bGwsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1aCBvaCwgY2xhaW1zIHRvIGJlIHByZWNvbXBpbGVkLCBidXQgdGhlIHRlbXBsYXRpbmcgZW5naW5lIGRvZXNuJ3Qga25vdyBhYm91dCBpdAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyaW5nID0gIlZpZXcgY29uZmlndXJhdGlvbiBmb3IgdmlldzogIiArIHZpZXcuaWQgKyAiIGNsYWltcyB0byBoYXZlIHByZWNvbXBpbGVkIHRlbXBsYXRlIGZvciBjYWNoZUtleTogIiArIGNhY2hlS2V5ICsgIiBidXQgaXQgY291bGQgbm90IGJlIGZvdW5kIjsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKGVyclN0cmluZyk7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgbmV3IEVycm9yKGVyclN0cmluZyksIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZW5naW5lIGFscmVhZHkgaGFzIHRoaXMgY2FjaGVkCiAgICAgICAgICAgICAgICAvLyB0aGlzIG1pZ2h0IGJlIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiBzdGVwCiAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBpbGVkLCBzbyBza2lwCiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG51bGwsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgICAgIGVuZ2luZS5jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgY29ubmVjdG9yLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVGVtcGxhdGVzID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG5vcm1hbGl6ZWQgdmlld3MgdGhhdCB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCBjb21waWxlIHRoZSB0ZW1wbGF0ZXMgd2l0aGluCiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25BcnJheSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwoKICAgICAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlSWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJ2aWV3Iiwgdmlldy5pZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgbGV2ZWwgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcGF0aCBpbiB2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImZpZWxkIiwgcGF0aCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGxheW91dCB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmxheW91dCAmJiB2aWV3LmxheW91dC50ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcubGF5b3V0LnRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAibGF5b3V0IiwgImxheW91dCIsICJsYXlvdXRUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5nbG9iYWxUZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcuZ2xvYmFsVGVtcGxhdGU7CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJnbG9iYWwiLCAiZ2xvYmFsIiwgImdsb2JhbFRlbXBsYXRlIiwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbm93IGludm9rZSBhbGwgb2YgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgLy8gdGhpcyB0ZWxscyBlYWNoIHRlbXBsYXRlIHRvIGNvbXBpbGUKICAgICAgICAgICAgICAgIHZhciB0b3RhbENhbGxzID0gZnVuY3Rpb25BcnJheS5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheVtpXSh0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBub3JtYWxpemVWaWV3cyA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhlIHZpZXdzIHRoYXQgd2UncmUgZ29pbmcgdG8gbm9ybWFsaXplCiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXdzID0ge307CiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXdDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgLy8gc29tZSBpbml0aWFsIHNlbGYtYXNzdXJhbmNlIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBub3JtYWxpemVkVmlld3MgbWFwIHNldCB1cAogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVkVmlld3MgPSBBbHBhY2Eubm9ybWFsaXplZFZpZXdzOwoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBhbGwgb2Ygb3VyIHZpZXdzCiAgICAgICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gc2VsZi52aWV3cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmlldyBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQgb24gdGhlIEFscGFjYSBnbG9iYWwsIHdlIGRvIG5vdCBib3RoZXIKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5ub3JtYWxpemVkVmlld3Nbdmlld0lkXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkVmlldyA9IG5ldyBBbHBhY2EuTm9ybWFsaXplZFZpZXcodmlld0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lm5vcm1hbGl6ZShzZWxmLnZpZXdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0gPSBub3JtYWxpemVkVmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBub3JtYWxpemF0aW9uIGZhaWxlZCwgY2Fubm90IGluaXRpYWxpemUgQWxwYWNhLiAgUGxlYXNlIGNoZWNrIHRoZSBlcnJvciBsb2dzLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlld0NvdW50ID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21waWxlVGVtcGxhdGVzKG5vcm1hbGl6ZWRWaWV3cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluYWxDYWxsYmFjayhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbm9ybWFsaXplVmlld3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb29rcyB1cCB0aGUgcHJvcGVyIHRlbXBsYXRlIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGEgcmVxdWVzdGVkIHRlbXBsYXRlIGlkIGZvciBhIHZpZXcgYW5kIGEgZmllbGQuCiAgICAgICAgICogUGVyZm9ybXMgYW4gb3ZlcnJpZGUgbG9va3VwIHRvIGZpbmQgdGhlIHByb3BlciB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEhhbmRzIGJhY2sgYSBkZXNjcmlwdG9yIG9mIGV2ZXJ5dGhpbmcgdGhhdCBpcyBrbm93biBhYm91dCB0aGUgcmVzb2x2ZWQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlldwogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUlkCiAgICAgICAgICogQHBhcmFtIGZpZWxkCiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odmlldywgdGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IG51bGw7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBGSUdVUkUgT1VUIFdIRVJFIFRIRSBURU1QTEFURSBJUyBJTiBUSEUgVklFVyBDT05GSUdVUkFUSU9OIChSRVNQRUNUSU5HIEZJRUxEIE9WRVJSSURFUykKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIHZhciBfZW5naW5lSWQgPSBudWxsOwogICAgICAgICAgICB2YXIgX2NhY2hlS2V5ID0gbnVsbDsKCiAgICAgICAgICAgIC8vIGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgdmlldyBsZXZlbD8KICAgICAgICAgICAgaWYgKHZpZXcudGVtcGxhdGVzICYmIHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlSWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJ2aWV3Iiwgdmlldy5pZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gaXMgdGhpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlPwogICAgICAgICAgICAgICAgdmFyIHQgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodCkgJiYgdC5jYWNoZUtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSB0LmNhY2hlS2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBvdmVycmlkZGVuIGF0IHRoZSBmaWVsZCBsZXZlbD8KICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoID0gZmllbGQucGF0aDsKCiAgICAgICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyB0cnkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgLy8gY29tYmluYXRpb25zIG9mIHBlcm11dGF0ZWQgYW5kIGdlbmVyYWxpemVkIGxvb2t1cHMgdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgYmVzdCBmaXQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCBpZiB0aGV5IHBhdGggaXM6IC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gbG9vayBmb3IgdGhlIGZvbGxvd2luZyBnZW5lcmFsaXplZCBwZXJtdXRhdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBhcHBsaWNhYmlsaXR5OgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0WzFdL3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3Qvc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZC90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgcGF0aC5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxlY3RNYXRjaGVzID0gZnVuY3Rpb24odG9rZW5zLCBpbmRleCwgbWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGFycmF5LCB3ZSdyZSBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdG9rZW5zLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VG9rZW5zID0gdG9rZW5zLnNsaWNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhcnJheSBpbiB0aGUgcGF0aCBhdCB0aGlzIGVsZW1lbnQsIHVwZGF0ZSBuZXdUb2tlbnMgdG8gcmVmbGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvZ2dsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeDEgPSB0b2tlbi5pbmRleE9mKCJbIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeDEgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cmluZygwLCB4MSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUb2tlbnNbaW5kZXhdID0gdG9rZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgbWF0Y2ggZm9yIHRoaXMgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXRoID0gbmV3VG9rZW5zLmpvaW4oIi8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5maWVsZHNbX3BhdGhdICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXMgJiYgdmlldy5maWVsZHNbX3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2NrID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBfcGF0aCwgdGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6IF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZWVkIGRvd24gdGhlIHRva2VuIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyh0b2tlbnMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgdG9nZ2xlZCwgcHJvY2VlZCB3aXRoIHRoYXQgYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyhuZXdUb2tlbnMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gcGF0aC5zcGxpdCgiLyIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyh0b2tlbnMsIDAsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gbWF0Y2hlc1swXS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMgJiYgdmlldy5maWVsZHNbcGF0aF0gJiYgdmlldy5maWVsZHNbcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsVGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJnbG9iYWwiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJnbG9iYWwiLCAiZ2xvYmFsIiwgImdsb2JhbFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGxheW91dCBsZXZlbD8KICAgICAgICAgICAgaWYgKHRlbXBsYXRlSWQgPT09ICJsYXlvdXRUZW1wbGF0ZSIgfHwgdGVtcGxhdGVJZCA9PT0gImxheW91dCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKF9jYWNoZUtleSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aGljaCBlbmdpbmUgaGFzIHRoaXMKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZHMgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5pZHMoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5naW5lSWRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZCA9IGVuZ2luZUlkc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUuaXNDYWNoZWQoX2NhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lbmdpbmVJZCA9IGVuZ2luZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKF9lbmdpbmVJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZW5naW5lIjogX2VuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBfY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlcyBhIHRlbXBsYXRlIGFuZCByZXR1cm5zIGEgRE9NIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVEZXNjcmlwdG9yCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICovCiAgICAgICAgdG1wbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBodG1sID0gQWxwYWNhLnRtcGxIdG1sKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5zYWZlRG9tUGFyc2UoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBIVE1MLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGxIdG1sOiBmdW5jdGlvbih0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFtb2RlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbW9kZWwgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZ2luZVR5cGUgPSB0ZW1wbGF0ZURlc2NyaXB0b3IuZW5naW5lOwoKICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lVHlwZSk7CiAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgZm9yIHR5cGU6ICIgKyBlbmdpbmVUeXBlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGVtcGxhdGVEZXNjcmlwdG9yLmNhY2hlS2V5OwogICAgICAgICAgICB2YXIgaHRtbCA9IGVuZ2luZS5leGVjdXRlKGNhY2hlS2V5LCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgdmFyIHN0ciA9IEpTT04uc3RyaW5naWZ5KGVycik7CiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICBzdHIgPSBlcnIubWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlRoZSBjb21waWxlZCB0ZW1wbGF0ZTogIiArIGNhY2hlS2V5ICsgIiBmYWlsZWQgdG8gZXhlY3V0ZTogIiArIHN0cik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfQoKICAgIH0pOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gTE9HR0VSCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5ERUJVRyA9IDA7CiAgICBBbHBhY2EuSU5GTyA9IDE7CiAgICBBbHBhY2EuV0FSTiA9IDI7CiAgICBBbHBhY2EuRVJST1IgPSAzOwoKICAgIC8vIGJ5IGRlZmF1bHQsIGxvZ2dpbmcgb25seSBzaG93cyB3YXJuaW5ncyBhbmQgYWJvdmUKICAgIC8vIHRvIGRlYnVnLCBzZXQgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLkRFQlVHCiAgICBBbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuV0FSTjsKCiAgICBBbHBhY2EubG9nRGVidWcgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5ERUJVRywgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nSW5mbyA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIEFscGFjYS5sb2coQWxwYWNhLklORk8sIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ1dhcm4gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5XQVJOLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dFcnJvciA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIEFscGFjYS5sb2coQWxwYWNhLkVSUk9SLCBvYmopOwogICAgfTsKCiAgICBBbHBhY2EuTE9HX01FVEhPRF9NQVAgPSB7CiAgICAgICAgMDogJ2RlYnVnJywKICAgICAgICAxOiAnaW5mbycsCiAgICAgICAgMjogJ3dhcm4nLAogICAgICAgIDM6ICdlcnJvcicKICAgIH07CgogICAgQWxwYWNhLmxvZyA9IGZ1bmN0aW9uKGxldmVsLCBvYmopIHsKCiAgICAgICAgaWYgKEFscGFjYS5sb2dMZXZlbCA8PSBsZXZlbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtZXRob2QgPSBBbHBhY2EuTE9HX01FVEhPRF9NQVBbbGV2ZWxdOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlW21ldGhvZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgiZGVidWciID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiaW5mbyIgPT09IG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIndhcm4iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJlcnJvciIgPT09IG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Iob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5jaGVja2VkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJjaGVja2VkIiwgdmFsdWUpOwogICAgfTsKCiAgICBBbHBhY2EuZGlzYWJsZWQgPSBmdW5jdGlvbihlbCwgdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIEFscGFjYS5hdHRyUHJvcChlbCwgImRpc2FibGVkIiwgdmFsdWUpOwogICAgfTsKCiAgICBBbHBhY2EuYXR0clByb3AgPSBmdW5jdGlvbihlbCwgbmFtZSwgdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgLy8galF1ZXJ5IDEuNisKICAgICAgICAgICAgaWYgKCQoZWwpLnByb3ApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLnByb3AobmFtZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuYXR0cihuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUF0dHIobmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIG5vdyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUKCiAgICAgICAgLy8galF1ZXJ5IDEuNisKICAgICAgICBpZiAoJChlbCkucHJvcCkgewogICAgICAgICAgICByZXR1cm4gJChlbCkucHJvcChuYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkKGVsKS5hdHRyKG5hbWUpOwogICAgfTsKCiAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnMgPSBmdW5jdGlvbih0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgY2FsbGJhY2spCiAgICB7CiAgICAgICAgdmFyIGZucyA9IFtdOwoKICAgICAgICAvLyBob2xkcyByZXNvbHV0aW9uIGluZm9ybWF0aW9uCiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB7fTsKCiAgICAgICAgLy8gc2NoZW1hIGxvYWRpbmcgZnVuY3Rpb24KICAgICAgICB2YXIgZm4xID0gZnVuY3Rpb24oc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihkb25lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYVJlZmVyZW5jZUlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYVJlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5zY2hlbWEgPSBzY2hlbWE7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYVJlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUmVmZXJlbmNlSWQgPSBzY2hlbWFSZWZlcmVuY2VJZC5zdWJzdHJpbmcoMik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0IGludG8gdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNjaGVtYVJlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZTY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2hlbWEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZlNjaGVtYVt0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlNjaGVtYSA9IGRlZlNjaGVtYVt0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmU2NoZW1hLnByb3BlcnRpZXMgJiYgZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEucHJvcGVydGllc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmU2NoZW1hLmRlZmluaXRpb25zICYmIGRlZlNjaGVtYS5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlNjaGVtYSA9IGRlZlNjaGVtYS5kZWZpbml0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gZGVmU2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHdpdGggb3Igd2l0aG91dCBhICIjIiBpbiBpdCB0byBwb2ludCB0byBhIHNwZWNpZmljIGxvY2F0aW9uIGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzY2hlbWEKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVBhcnRzID0gQWxwYWNhLnBhdGhQYXJ0cyhzY2hlbWFSZWZlcmVuY2VJZCk7CgogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkLmNvbm5lY3Rvci5sb2FkUmVmZXJlbmNlU2NoZW1hKHJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChzY2hlbWEpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VQYXJ0cy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkU2NoZW1hID0gQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2Uoc2NoZW1hLCByZWZlcmVuY2VQYXJ0cy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5zY2hlbWEgPSByZXNvbHZlZFNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMSh0b3BGaWVsZC5zY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkLCByZXNvbHV0aW9uKSk7CgogICAgICAgIHZhciBmbjIgPSBmdW5jdGlvbihvcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zUmVmZXJlbmNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zUmVmZXJlbmNlSWQgPT09ICIjIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zUmVmZXJlbmNlSWQuaW5kZXhPZigiIy8iKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcHJvcGVydHkgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBzY2hlbWEKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBvcHRpb25zUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBvcHRpb25zUmVmZXJlbmNlSWQuc3BsaXQoIi8iKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZk9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmT3B0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZPcHRpb25zLmZpZWxkcyAmJiBkZWZPcHRpb25zLmZpZWxkc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmZpZWxkc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5kZWZpbml0aW9ucyAmJiBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmT3B0aW9ucyA9IGRlZk9wdGlvbnMuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmT3B0aW9ucyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gZGVmT3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBJRCBvZiBhIG5vZGUgaW4gdGhlIGN1cnJlbnQgc2NoZW1hIGRvY3VtZW50CgogICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhlIGN1cnJlbnQgZG9jdW1lbnQgc2NoZW1hIHVudGlsIHdlIGZpbmQgdGhlIHJlZmVyZW5jZWQgbm9kZSAodXNpbmcgaWQgcHJvcGVydHkpCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShvcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZE9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHdpdGggb3Igd2l0aG91dCBhICIjIiBpbiBpdCB0byBwb2ludCB0byBhIHNwZWNpZmljIGxvY2F0aW9uIGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzY2hlbWEKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvblJlZmVyZW5jZVBhcnRzID0gQWxwYWNhLnBhdGhQYXJ0cyhvcHRpb25zUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZU9wdGlvbnMob3B0aW9uUmVmZXJlbmNlUGFydHMucGF0aCwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25SZWZlcmVuY2VQYXJ0cy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShvcHRpb25zLCBvcHRpb25SZWZlcmVuY2VQYXJ0cy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IHJlc29sdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgZm5zLnB1c2goZm4yKHRvcEZpZWxkLm9wdGlvbnMsIG9wdGlvbnNSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICAvLyBydW4gbG9hZHMgaW4gcGFyYWxsZWwKICAgICAgICBBbHBhY2EucGFyYWxsZWwoZm5zLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2socmVzb2x1dGlvbi5zY2hlbWEsIHJlc29sdXRpb24ub3B0aW9ucyk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIEFscGFjYS5ERUZBVUxUX0VSUk9SX0NBTExCQUNLID0gZnVuY3Rpb24oZXJyb3IpCiAgICB7CiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2cgdG8gZGVidWcKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7CgogICAgICAgICAgICAvLyBlcnJvciBvdXQKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbHBhY2EgY2F1Z2h0IGFuIGVycm9yIHdpdGggdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcjogIiArIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7CgogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGVycm9yIGNhbGxiYWNrIGhhbmRsZXIgZm9yIEFscGFjYS4KICAgICAqCiAgICAgKiBUaGlzIGVycm9yIGhhbmRsZXIgd2lsbCBiZSB1c2VkIGlmIGFuICJlcnJvciIgYXJndW1lbnQgaXNuJ3QgcGFzc2VkIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgYW4gQWxwYWNhIGZpZWxkLgogICAgICoKICAgICAqIEBwYXJhbSBlcnJvcgogICAgICovCiAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2sgPSBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSzsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGEgZ2VuZXJhbCBlcnJvciBhbmQgZGlzcGF0Y2hlcyB0byB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyLgogICAgICoKICAgICAqIEBwYXJhbSBtZXNzYWdlCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpCiAgICB7CiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgQWxwYWNhLmlzT2JqZWN0KG1lc3NhZ2UpKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGVyciA9IHsKICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlCiAgICAgICAgfTsKCiAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICB9OwoKICAgIC8qKgogICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCB0aHJvd3MgYW4gZXJyb3IgYmFjayB0byB0aGUgZ2l2ZW4gY2FsbGJhY2sgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAqLwogICAgQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2sgPSBmdW5jdGlvbihtZXNzYWdlLCBlcnJvckNhbGxiYWNrKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIGlmIChlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYSBzY2hlbWEgcGF0aCByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIHN1Yi1zY2hlbWEuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtYQogICAgICogQHBhcmFtIHJlZmVyZW5jZUlkCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2UgPSBmdW5jdGlvbihzY2hlbWEsIHJlZmVyZW5jZUlkKQogICAgewogICAgICAgIGlmICgoc2NoZW1hLmlkID09PSByZWZlcmVuY2VJZCkgfHwgKCgiIyIgKyBzY2hlbWEuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2NoZW1hLml0ZW1zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5pdGVtczsKCiAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2Uoc3ViU2NoZW1hLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHJlZmVyZW5jZUlkKQogICAgewogICAgICAgIGlmICgob3B0aW9ucy5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgb3B0aW9ucy5pZCkgPT09IHJlZmVyZW5jZUlkKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmZpZWxkcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGZpZWxkSWQgaW4gb3B0aW9ucy5maWVsZHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gb3B0aW9ucy5maWVsZHNbZmllbGRJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uoc3ViT3B0aW9ucywgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gb3B0aW9ucy5pdGVtczsKCiAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgJC5hbHBhY2EgPSB3aW5kb3cuQWxwYWNhID0gQWxwYWNhOwoKICAgIC8qKgogICAgICogalF1ZXJ5IGZyaWVuZGx5IG1ldGhvZCBmb3IgYmluZGluZyBhIGZpZWxkIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgICQuZm4uYWxwYWNhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CgogICAgICAgIC8vIGFwcGVuZCB0aGlzIGludG8gdGhlIGZyb250IG9mIGFyZ3MKICAgICAgICB2YXIgbmV3QXJncyA9IFtdLmNvbmNhdCh0aGlzLCBhcmdzKTsKCiAgICAgICAgLy8gaW52b2tlIEFscGFjYSBhZ2FpbnN0IGN1cnJlbnQgZWxlbWVudAogICAgICAgIHZhciByZXQgPSBBbHBhY2EuYXBwbHkodGhpcywgbmV3QXJncyk7CiAgICAgICAgaWYgKHR5cGVvZihyZXQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAvLyBhcyBwZXIgalF1ZXJ5J3MgcGF0dGVybiwgYXNzdW1lIHdlIGhhbmQgYmFjayAkZWwKICAgICAgICAgICAgcmV0ID0gJCh0aGlzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9OwoKICAgIC8qKgogICAgICogQGlnbm9yZQogICAgICogQHBhcmFtIG5vY2xvbmluZwogICAgICovCiAgICAkLmZuLm91dGVySFRNTCA9IGZ1bmN0aW9uKG5vY2xvbmluZykgewogICAgICAgIGlmIChub2Nsb25pbmcpIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMpLmh0bWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJCgiPGRpdj48L2Rpdj4iKS5hcHBlbmQodGhpcy5jbG9uZSgpKS5odG1sKCk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSB0bwogICAgICovCiAgICAkLmZuLnN3YXBXaXRoID0gZnVuY3Rpb24odG8pIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY29weV90byA9ICQodG8pLmNsb25lKCk7CiAgICAgICAgICAgIHZhciBjb3B5X2Zyb20gPSAkKHRoaXMpLmNsb25lKCk7CiAgICAgICAgICAgICQodG8pLnJlcGxhY2VXaXRoKGNvcHlfZnJvbSk7CiAgICAgICAgICAgICQodGhpcykucmVwbGFjZVdpdGgoY29weV90byk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgICQuZm4uYXR0clByb3AgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoJCh0aGlzKSwgbmFtZSwgdmFsdWUpOwogICAgfTsKCiAgICAvKioKICAgICAqIFdoZW4gZG9tIGVsZW1lbnRzIGFyZSByZW1vdmVkLCB3ZSBmaXJlIHRoZSBzcGVjaWFsICJkZXN0cm95ZWQiIGV2ZW50IHRvIGFsbG93IGZvciBsYXRlIGNsZWFudXAgb2YgYW55IEFscGFjYSBjb2RlCiAgICAgKiB0aGF0IG1pZ2h0IGJlIGluLW1lbW9yeSBhbmQgbGlua2VkIHRvIHRoZSBkb20gZWxlbWVudC4KICAgICAqCiAgICAgKiBAdHlwZSB7T2JqZWN0fQogICAgICovCiAgICAkLmV2ZW50LnNwZWNpYWwuZGVzdHJveWVkID0gewogICAgICAgIHJlbW92ZTogZnVuY3Rpb24obykgewogICAgICAgICAgICBpZiAoby5oYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBvLmhhbmRsZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgQWxwYWNhLnBhdGhQYXJ0cyA9IGZ1bmN0aW9uKHJlc291cmNlKQogICAgewogICAgICAgIGlmICh0eXBlb2YocmVzb3VyY2UpICE9PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgICB9CgogICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRvIG9iamVjdAogICAgICAgIHZhciByZXNvdXJjZVBhdGggPSByZXNvdXJjZTsKICAgICAgICB2YXIgcmVzb3VyY2VJZCA9IG51bGw7CiAgICAgICAgdmFyIGkgPSByZXNvdXJjZVBhdGguaW5kZXhPZigiIyIpOwogICAgICAgIGlmIChpID4gLTEpCiAgICAgICAgewogICAgICAgICAgICByZXNvdXJjZUlkID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZyhpICsgMSk7CiAgICAgICAgICAgIHJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgaSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQWxwYWNhLmVuZHNXaXRoKHJlc291cmNlUGF0aCwgIi8iKSkgewogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIHJlc291cmNlUGF0aC5sZW5ndGggLSAxKTsKICAgICAgICB9CgogICAgICAgIHZhciBwYXJ0cyA9IHt9OwogICAgICAgIHBhcnRzLnBhdGggPSByZXNvdXJjZVBhdGg7CgogICAgICAgIGlmIChyZXNvdXJjZUlkKQogICAgICAgIHsKICAgICAgICAgICAgcGFydHMuaWQgPSByZXNvdXJjZUlkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgZmllbGQgYnkgaXRzIHByb3BlcnR5IGlkLgogICAgICoKICAgICAqIEBwYXJhbSBjb250YWluZXJGaWVsZAogICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAqIEByZXR1cm5zIHtudWxsfQogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkID0gZnVuY3Rpb24oY29udGFpbmVyRmllbGQsIHByb3BlcnR5SWRPclJlZmVyZW5jZUlkKQogICAgewogICAgICAgIHZhciByZXNvbHZlZEZpZWxkID0gbnVsbDsKCiAgICAgICAgaWYgKHR5cGVvZihwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkgPT09ICJzdHJpbmciKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDAgJiYgcHJvcGVydHlJZC5sZW5ndGggPiAyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXRoIGJhc2VkIGxvb2t1cD8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMiIHx8IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkID09PSAiIy8iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaWQgbG9va3VwCgogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgdG9wIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgdG9wRmllbGQgPSBjb250YWluZXJGaWVsZDsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gcHJvcGVydHlJZE9yUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDEpOwoKICAgICAgICAgICAgICAgIHJlc29sdmVkRmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UodG9wRmllbGQsIHJlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBsb29rdXAKICAgICAgICAgICAgICAgIHJlc29sdmVkRmllbGQgPSBjb250YWluZXJGaWVsZC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNvbHZlZEZpZWxkOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgZmllbGQgYmFzZWQgb24gaXRzICJyZWZlcmVuY2UgaWQiIHJlbGF0aXZlIHRvIGEgdG9wIGxldmVsIGZpZWxkLiAgVGhpcyB3YWxrcyBkb3duIHRoZSBmaWVsZCB0cmVlIGFuZAogICAgICogbG9va3MgZm9yIG1hdGNoaW5nIHNjaGVtYS5pZCByZWZlcmVuY2VzIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGZpZWxkLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZAogICAgICogQHBhcmFtIHJlZmVyZW5jZUlkCiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlRmllbGRCeVJlZmVyZW5jZSA9IGZ1bmN0aW9uKGZpZWxkLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoZmllbGQuc2NoZW1hICYmIGZpZWxkLnNjaGVtYS5pZCA9PSByZWZlcmVuY2VJZCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmllbGQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UoY2hpbGQsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgZmlyc3QgYXJndW1lbnQgYXJlIGVxdWFsIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgogICAgICoKICAgICAqIEBwYXJhbSBmaXJzdCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcGFyYW0gc2Vjb25kIGVpdGhlciBhIHNjYWxhciB2YWx1ZSBvciBhIGNvbnRhaW5lciAob2JqZWN0IG9yIGFycmF5KSBvZiB2YWx1ZXMKICAgICAqIEByZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG1hdGNoIGlzIGZvdW5kCiAgICAgKi8KICAgIEFscGFjYS5hbnlFcXVhbGl0eSA9IGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpCiAgICB7CiAgICAgICAgLy8gY29weSB2YWx1ZXMgZnJvbSBmaXJzdCBpbnRvIGEgdmFsdWVzIGxvb2t1cCBtYXAKICAgICAgICB2YXIgdmFsdWVzID0ge307CiAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KGZpcnN0KSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlc1tmaXJzdFtrXV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlc1tmaXJzdF0gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlOwoKICAgICAgICAvLyBjaGVjayB2YWx1ZXMgZnJvbSBzZWNvbmQgYWdhaW5zdCB0aGUgbG9va3VwIG1hcAogICAgICAgIGlmICh0eXBlb2Yoc2Vjb25kKSA9PT0gIm9iamVjdCIgfHwgQWxwYWNhLmlzQXJyYXkoc2Vjb25kKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2Vjb25kKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHNlY29uZFtrXTsKCiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW3ZdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVzW3NlY29uZF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKCiAgICBBbHBhY2Euc2VyaWVzID0gQWxwYWNhLnNlcmlhbCA9IGZ1bmN0aW9uKGZ1bmNzLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBhc3luYy5zZXJpZXMoZnVuY3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EucGFyYWxsZWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMucGFyYWxsZWwoZnVuY3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EubmV4dFRpY2sgPSBmdW5jdGlvbihmKQogICAgewogICAgICAgIGFzeW5jLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ29tcGlsZXMgdGhlIHZhbGlkYXRpb24gY29udGV4dCBmb3IgdGhlIGNoYWluIG9mIGZpZWxkcyBmcm9tIHRoZSB0b3AtbW9zdCBkb3duIHRvIHRoZSBnaXZlbiBmaWVsZC4KICAgICAqIEVhY2ggdmFsaWRhdGlvbiBjb250ZXh0IGVudHJ5IGlzIGEgZmllbGQgaW4gdGhlIGNoYWluIHdoaWNoIGRlc2NyaWJlcyB0aGUgZm9sbG93aW5nOgogICAgICoKICAgICAqICAgIHsKICAgICAqICAgICAgICJmaWVsZCI6IHRoZSBmaWVsZCBpbnN0YW5jZSwKICAgICAqICAgICAgICJiZWZvcmUiOiB0aGUgYmVmb3JlIHZhbHVlIChib29sZWFuKQogICAgICogICAgICAgImFmdGVyIjogdGhlIGFmdGVyIHZhbHVlIChib29sZWFuKQogICAgICogICAgICAgInZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIHZhbGlkYXRlZCAoc3dpdGNoZXMgc3RhdGUgZnJvbSBpbnZhbGlkIHRvIHZhbGlkKQogICAgICogICAgICAgImludmFsaWRhdGVkIjogKG9wdGlvbmFsKSBpZiB0aGUgZmllbGQgaW52YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gdmFsaWQgdG8gaW52YWxpZCkKICAgICAqICAgIH0KICAgICAqCiAgICAgKiBUaGlzIGhhbmRzIGJhY2sgYW4gYXJyYXkgb2YgZW50cmllcyB3aXRoIHRoZSBjaGlsZCBmaWVsZCBmaXJzdCBhbmQgY29udGludWluZyB1cCB0aGUgcGFyZW50IGNoYWluLgogICAgICogVGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5IGlzIHRoZSB0b3AgbW9zdCBwYXJlbnQgZmllbGQuCiAgICAgKgogICAgICogVGhlIGNhbGxiYWNrIGlzIGZpcmVkIHdpdGggdGhlIGFzc2VtYmxlZCBjb250ZXh0LCBhbGxvd2luZyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gdG8gcnVuLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZAogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge0FycmF5fQogICAgICovCiAgICBBbHBhY2EuY29tcGlsZVZhbGlkYXRpb25Db250ZXh0ID0gZnVuY3Rpb24oZmllbGQsIGNhbGxiYWNrKQogICAgewogICAgICAgIC8vIHdhbGsgdXAgdGhlIHBhcmVudCB0cmVlIHVudGlsIHdlIGZpbmQgdGhlIHRvcC1tb3N0IGNvbnRyb2wKICAgICAgICAvLyB0aGlzIHNlcnZlcyBhcyBvdXIgc3RhcnRpbmcgcG9pbnQgZm9yIGRvd253YXJkIHZhbGlkYXRpb24KICAgICAgICB2YXIgY2hhaW4gPSBbXTsKICAgICAgICB2YXIgcGFyZW50ID0gZmllbGQ7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzVmFsaWRhdGlvblBhcnRpY2lwYW50KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2gocGFyZW50KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAocGFyZW50KTsKCiAgICAgICAgLy8gcmV2ZXJzZSBzbyB0b3AgbW9zdCBwYXJlbnQgaXMgZmlyc3QKICAgICAgICBjaGFpbi5yZXZlcnNlKCk7CgogICAgICAgIC8vIGNvbXBpbGF0aW9uIGNvbnRleHQKICAgICAgICB2YXIgY29udGV4dCA9IFtdOwoKICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdGhhdCBzZXRzIHZhbGlkYXRpb24gZm9yIGEgc2luZ2xlIGZpZWxkCiAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihjaGFpbiwgY29udGV4dCwgZG9uZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY2hhaW4gfHwgY2hhaW4ubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY3VycmVudCA9IGNoYWluWzBdOwoKICAgICAgICAgICAgdmFyIGVudHJ5ID0ge307CiAgICAgICAgICAgIGVudHJ5LmlkID0gY3VycmVudC5nZXRJZCgpOwogICAgICAgICAgICBlbnRyeS5maWVsZCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjdXJyZW50LnBhdGg7CgogICAgICAgICAgICAvLyBCRUZPUkUgZmllbGQgdmFsaWRhdGlvbiBzdGF0dXMKICAgICAgICAgICAgdmFyIGJlZm9yZVN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICBpZiAoY3VycmVudC5pc0NvbnRhaW5lcigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVudHJ5LmJlZm9yZSA9IGJlZm9yZVN0YXR1czsKCiAgICAgICAgICAgIHZhciBvdXJzZWx2ZXNIYW5kbGVyID0gZnVuY3Rpb24oY3VycmVudCwgZW50cnksIHdlRmluaXNoZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c2x5VmFsaWRhdGVkID0gY3VycmVudC5fcHJldmlvdXNseVZhbGlkYXRlZDsKCiAgICAgICAgICAgICAgICAvLyBub3cgcnVuIHRoZSB2YWxpZGF0aW9uIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICBjdXJyZW50LnZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgY3VzdG9tIHZhbGlkYXRpb24gKGlmIGV4aXN0cykgZm9yIGp1c3QgdGhpcyBvbmUgZmllbGQKICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoaXMganVzdCBmaXJlcyB0aGUgY2FsbGJhY2sKICAgICAgICAgICAgICAgIGN1cnJlbnQuX3ZhbGlkYXRlQ3VzdG9tVmFsaWRhdG9yKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBBRlRFUiBmaWVsZCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuYWZ0ZXIgPSBhZnRlclN0YXR1czsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBmaWVsZCdzIHZhbGlkYXRpb24gc3RhdHVzIGZsaXBwZWQsIGZpcmUgdHJpZ2dlcnMKICAgICAgICAgICAgICAgICAgICBlbnRyeS52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmICghYmVmb3JlU3RhdHVzICYmIGFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmVmb3JlU3RhdHVzICYmICFhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBmaWVsZHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiB2YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcHJldmlvdXNseVZhbGlkYXRlZCAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb250YWluZXIgPSBjdXJyZW50LmlzQ29udGFpbmVyKCk7CiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWQgPSBlbnRyeS5hZnRlcjsKCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKGVudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgd2VGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdGVwIGRvd24gaW50byBjaGFpbgogICAgICAgICAgICAvLyB3ZSBkbyBjaGlsZHJlbiBiZWZvcmUgb3Vyc2VsdmVzCiAgICAgICAgICAgIGlmIChjaGFpbi5sZW5ndGggPiAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjb3B5IGFycmF5CiAgICAgICAgICAgICAgICB2YXIgY2hpbGRDaGFpbiA9IGNoYWluLnNsaWNlKDApOwogICAgICAgICAgICAgICAgY2hpbGRDaGFpbi5zaGlmdCgpOwogICAgICAgICAgICAgICAgZihjaGlsZENoYWluLCBjb250ZXh0LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBvdXJzZWx2ZXNIYW5kbGVyKGN1cnJlbnQsIGVudHJ5LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvdXJzZWx2ZXNIYW5kbGVyKGN1cnJlbnQsIGVudHJ5LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZihjaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRleHQpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EudXBkYXRlVmFsaWRhdGlvblN0YXRlRm9yQ29udGV4dCA9IGZ1bmN0aW9uKHZpZXcsIGNvbnRleHQpCiAgICB7CiAgICAgICAgLy8gd2FsayB0aHJvdWdoIGVhY2ggYW5kIGZsaXAgYW55IERPTSBVSSBiYXNlZCBvbiBlbnRyeSBzdGF0ZQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dC5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbnRyeSA9IGNvbnRleHRbaV07CiAgICAgICAgICAgIHZhciBmaWVsZCA9IGVudHJ5LmZpZWxkOwoKICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIHZhbGlkYXRpb24gVUkgbWFya2VycwogICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkucmVtb3ZlQ2xhc3MoImFscGFjYS1pbnZhbGlkIGFscGFjYS1pbnZhbGlkLWhpZGRlbiBhbHBhY2EtdmFsaWQiKTsKICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJjbGVhclZhbGlkaXR5Iik7CgogICAgICAgICAgICAvLyB2YWxpZD8KICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC12YWxpZCIpOwogICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJ2YWxpZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbWFya3VwIGludmFsaWRhdGlvbiBzdGF0ZSBmb3IgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5maXJlQ2FsbGJhY2soImludmFsaWQiLCBoaWRkZW4pOwoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGRlbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLWludmFsaWQtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZmllbGQgaXMgaW52YWxpZCBhbmQgaXMgYWxzbyByZWFkLW9ubHksIHNvIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBpbmZvcm0gdGhlIGVuZC11c2VyCiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBVSSAoc2luY2UgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQpCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSwgd2UgbG9nIGEgbWVzc2FnZSB0byBkZWJ1ZyB0byBpbmZvcm0gdGhlIGRldmVsb3BlcgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJUaGUgZmllbGQgKGlkPSIgKyBmaWVsZC5nZXRJZCgpICsgIiwgdGl0bGU9IiArIGZpZWxkLmdldFRpdGxlKCkgKyAiLCBwYXRoPSIgKyBmaWVsZC5wYXRoICsgIikgaXMgaW52YWxpZCBhbmQgYWxzbyByZWFkLW9ubHkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVFJJR0dFUlMKICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJ2YWxpZGF0ZWQiKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnRyaWdnZXIoImludmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWxsb3cgZm9yIHRoZSBtZXNzYWdlIHRvIGNoYW5nZQogICAgICAgICAgICBpZiAoZmllbGQub3B0aW9ucy5zaG93TWVzc2FnZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaW5pdGlhbGl6aW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQub3B0aW9ucy5yZWFkb25seSB8fCBBbHBhY2Euc2hvd1JlYWRPbmx5SW52YWxpZFN0YXRlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBmaWVsZC52YWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLnZhbGlkYXRpb25bbWVzc2FnZUlkXVsic3RhdHVzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IG1lc3NhZ2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bIm1lc3NhZ2UiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kaXNwbGF5TWVzc2FnZShtZXNzYWdlcywgZmllbGQudmFsaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBvdmVyIHRoZSBmaWVsZCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiByZWN1cnNpdmVseS4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBmbgogICAgICovCiAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4gPSBmdW5jdGlvbihmaWVsZCwgZm4pCiAgICB7CiAgICAgICAgZm4oZmllbGQpOwoKICAgICAgICAvLyBpZiB0aGUgZmllbGQgaGFzIGNoaWxkcmVuLCBnbyBkZXB0aCBmaXJzdAogICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLmNoaWxkcmVuW2ldLCBmbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgc3RyaW5nIDxmaW5kPiB3aXRoIHRoZSByZXBsYWNlbWVudCB0ZXh0IDxyZXBsYWNlPi4KICAgICAqCiAgICAgKiBAcGFyYW0gdGV4dAogICAgICogQHBhcmFtIGZpbmQKICAgICAqIEBwYXJhbSByZXBsYWNlCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgQWxwYWNhLnJlcGxhY2VBbGwgPSBmdW5jdGlvbih0ZXh0LCBmaW5kLCByZXBsYWNlKQogICAgewogICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChmaW5kLCAnZycpLCByZXBsYWNlKTsKICAgIH07CgogICAgQWxwYWNhLmFzQXJyYXkgPSBmdW5jdGlvbih0aGluZykKICAgIHsKICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHRoaW5nKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwogICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGluZzsKICAgIH07CgoKCgoKCgoKCgoKCgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBBU1lOQwogICAgLy8KICAgIC8vIEhlcmUgd2UgcHJvdmlkZSBhIHJlZHVjZWQgdmVyc2lvbiBvZiB0aGUgd29uZGVyZnVsIGFzeW5jIGxpYnJhcnkuICBUaGlzIGlzIGVudGlyZWx5IGlubGluZSBhbmQKICAgIC8vIHdpbGwgaGF2ZSBubyBiZWFyaW5nIG9uIGFueSBleHRlcm5hbCBkZXBlbmRlbmNpZXMgb24gYXN5bmMuCiAgICAvLwogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nhb2xhbi9hc3luYwogICAgLy8gQ29weXJpZ2h0IChjKSAyMDEwIENhb2xhbiBNY01haG9uCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8qZ2xvYmFsIHNldEltbWVkaWF0ZTogZmFsc2UsIHNldFRpbWVvdXQ6IGZhbHNlLCBjb25zb2xlOiBmYWxzZSAqLwogICAgKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgdmFyIGFzeW5jID0ge307CgogICAgICAgIC8vIGdsb2JhbCBvbiB0aGUgc2VydmVyLCB3aW5kb3cgaW4gdGhlIGJyb3dzZXIKICAgICAgICB2YXIgcm9vdCwgcHJldmlvdXNfYXN5bmM7CgogICAgICAgIHJvb3QgPSB0aGlzOwogICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKICAgICAgICAgICAgcHJldmlvdXNfYXN5bmMgPSByb290LmFzeW5jOwogICAgICAgIH0KCiAgICAgICAgYXN5bmMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcm9vdC5hc3luYyA9IHByZXZpb3VzX2FzeW5jOwogICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gb25seV9vbmNlKGZuKSB7CiAgICAgICAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkLiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZuLmFwcGx5KHJvb3QsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLy8vIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsaXR5IGZ1bmN0aW9ucyAvLy8vCgogICAgICAgIHZhciBfZWFjaCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yKSB7CiAgICAgICAgICAgIGlmIChhcnIuZm9yRWFjaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5mb3JFYWNoKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2ldLCBpLCBhcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9tYXAgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLm1hcCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5tYXAoaXRlcmF0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvcih4LCBpLCBhKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICB9OwoKICAgICAgICB2YXIgX3JlZHVjZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtZW1vKSB7CiAgICAgICAgICAgIGlmIChhcnIucmVkdWNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLnJlZHVjZShpdGVyYXRvciwgbWVtbyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkgewogICAgICAgICAgICAgICAgbWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHgsIGksIGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG1lbW87CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9rZXlzID0gZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBrZXlzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBrZXlzOwogICAgICAgIH07CgogICAgICAgIC8vLy8gZXhwb3J0ZWQgYXN5bmMgbW9kdWxlIGZ1bmN0aW9ucyAvLy8vCgogICAgICAgIC8vLy8gbmV4dFRpY2sgaW1wbGVtZW50YXRpb24gd2l0aCBicm93c2VyLWNvbXBhdGlibGUgZmFsbGJhY2sgLy8vLwogICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIShwcm9jZXNzLm5leHRUaWNrKSkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhc3luYy5uZXh0VGljayA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZm4sIDApOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrOwogICAgICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGRpcmVjdCBhbGlhcyBmb3IgSUUxMCBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGZuKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYXN5bmMuZWFjaCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBvbmx5X29uY2UoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZvckVhY2ggPSBhc3luYy5lYWNoOwoKICAgICAgICBhc3luYy5lYWNoU2VyaWVzID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CiAgICAgICAgICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2NvbXBsZXRlZF0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoU2VyaWVzID0gYXN5bmMuZWFjaFNlcmllczsKCiAgICAgICAgYXN5bmMuZWFjaExpbWl0ID0gZnVuY3Rpb24gKGFyciwgbGltaXQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgZm4gPSBfZWFjaExpbWl0KGxpbWl0KTsKICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgW2FyciwgaXRlcmF0b3IsIGNhbGxiYWNrXSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoTGltaXQgPSBhc3luYy5lYWNoTGltaXQ7CgogICAgICAgIHZhciBfZWFjaExpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7CgogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ZWQgPSAwOwogICAgICAgICAgICAgICAgdmFyIHJ1bm5pbmcgPSAwOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbiByZXBsZW5pc2ggKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nIDwgbGltaXQgJiYgc3RhcnRlZCA8IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltzdGFydGVkIC0gMV0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsZW5pc2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIHZhciBkb1BhcmFsbGVsID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2FzeW5jLmVhY2hdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICB2YXIgZG9QYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24obGltaXQsIGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW19lYWNoTGltaXQobGltaXQpXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvU2VyaWVzID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2FzeW5jLmVhY2hTZXJpZXNdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIHZhciBfYXN5bmNNYXAgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKGVyciwgdikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbeC5pbmRleF0gPSB2OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5tYXAgPSBkb1BhcmFsbGVsKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwU2VyaWVzID0gZG9TZXJpZXMoX2FzeW5jTWFwKTsKICAgICAgICBhc3luYy5tYXBMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgcmV0dXJuIF9tYXBMaW1pdChsaW1pdCkoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwTGltaXQgPSBmdW5jdGlvbihsaW1pdCkgewogICAgICAgICAgICByZXR1cm4gZG9QYXJhbGxlbExpbWl0KGxpbWl0LCBfYXN5bmNNYXApOwogICAgICAgIH07CgogICAgICAgIC8vIHJlZHVjZSBvbmx5IGhhcyBhIHNlcmllcyB2ZXJzaW9uLCBhcyBkb2luZyByZWR1Y2UgaW4gcGFyYWxsZWwgd29uJ3QKICAgICAgICAvLyB3b3JrIGluIG1hbnkgc2l0dWF0aW9ucy4KICAgICAgICBhc3luYy5yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMuZWFjaFNlcmllcyhhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IobWVtbywgeCwgZnVuY3Rpb24gKGVyciwgdikgewogICAgICAgICAgICAgICAgICAgIG1lbW8gPSB2OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBtZW1vKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBpbmplY3QgYWxpYXMKICAgICAgICBhc3luYy5pbmplY3QgPSBhc3luYy5yZWR1Y2U7CiAgICAgICAgLy8gZm9sZGwgYWxpYXMKICAgICAgICBhc3luYy5mb2xkbCA9IGFzeW5jLnJlZHVjZTsKCiAgICAgICAgYXN5bmMucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJldmVyc2VkID0gX21hcChhcnIsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfSkucmV2ZXJzZSgpOwogICAgICAgICAgICBhc3luYy5yZWR1Y2UocmV2ZXJzZWQsIG1lbW8sIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICAvLyBmb2xkciBhbGlhcwogICAgICAgIGFzeW5jLmZvbGRyID0gYXN5bmMucmVkdWNlUmlnaHQ7CgogICAgICAgIHZhciBfZmlsdGVyID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZmlsdGVyID0gZG9QYXJhbGxlbChfZmlsdGVyKTsKICAgICAgICBhc3luYy5maWx0ZXJTZXJpZXMgPSBkb1NlcmllcyhfZmlsdGVyKTsKICAgICAgICAvLyBzZWxlY3QgYWxpYXMKICAgICAgICBhc3luYy5zZWxlY3QgPSBhc3luYy5maWx0ZXI7CiAgICAgICAgYXN5bmMuc2VsZWN0U2VyaWVzID0gYXN5bmMuZmlsdGVyU2VyaWVzOwoKICAgICAgICB2YXIgX3JlamVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICghdikgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CiAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5yZWplY3QgPSBkb1BhcmFsbGVsKF9yZWplY3QpOwogICAgICAgIGFzeW5jLnJlamVjdFNlcmllcyA9IGRvU2VyaWVzKF9yZWplY3QpOwoKICAgICAgICB2YXIgX2RldGVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHgpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZGV0ZWN0ID0gZG9QYXJhbGxlbChfZGV0ZWN0KTsKICAgICAgICBhc3luYy5kZXRlY3RTZXJpZXMgPSBkb1NlcmllcyhfZGV0ZWN0KTsKCiAgICAgICAgYXN5bmMuc29tZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8vIGFueSBhbGlhcwogICAgICAgIGFzeW5jLmFueSA9IGFzeW5jLnNvbWU7CgogICAgICAgIGFzeW5jLmV2ZXJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8vIGFsbCBhbGlhcwogICAgICAgIGFzeW5jLmFsbCA9IGFzeW5jLmV2ZXJ5OwoKICAgICAgICBhc3luYy5zb3J0QnkgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMubWFwKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAoZXJyLCBjcml0ZXJpYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHt2YWx1ZTogeCwgY3JpdGVyaWE6IGNyaXRlcmlhfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgX21hcChyZXN1bHRzLnNvcnQoZm4pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLmF1dG8gPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIHZhciBrZXlzID0gX2tleXModGFza3MpOwogICAgICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CgogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gW107CiAgICAgICAgICAgIHZhciBhZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoZm4pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHRhc2tDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF9lYWNoKGxpc3RlbmVycy5zbGljZSgwKSwgZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgYWRkTGlzdGVuZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKF9rZXlzKHJlc3VsdHMpLmxlbmd0aCA9PT0ga2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIF9lYWNoKGtleXMsIGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICB2YXIgdGFzayA9ICh0YXNrc1trXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSA/IFt0YXNrc1trXV06IHRhc2tzW2tdOwogICAgICAgICAgICAgICAgdmFyIHRhc2tDYWxsYmFjayA9IGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhZmVSZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKF9rZXlzKHJlc3VsdHMpLCBmdW5jdGlvbihya2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlUmVzdWx0c1tya2V5XSA9IHJlc3VsdHNbcmtleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBzYWZlUmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc2FmZVJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHN1YnNlcXVlbnQgZXJyb3JzIGhpdHRpbmcgY2FsbGJhY2sgbXVsdGlwbGUgdGltZXMKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUodGFza0NvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVzID0gdGFzay5zbGljZSgwLCBNYXRoLmFicyh0YXNrLmxlbmd0aCAtIDEpKSB8fCBbXTsKICAgICAgICAgICAgICAgIHZhciByZWFkeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZHVjZShyZXF1aXJlcywgZnVuY3Rpb24gKGEsIHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChhICYmIHJlc3VsdHMuaGFzT3duUHJvcGVydHkoeCkpOwogICAgICAgICAgICAgICAgICAgIH0sIHRydWUpICYmICFyZXN1bHRzLmhhc093blByb3BlcnR5KGspOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChyZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrW3Rhc2subGVuZ3RoIC0gMV0odGFza0NhbGxiYWNrLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy53YXRlcmZhbGwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICh0YXNrcy5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIHdhdGVyZmFsbCBtdXN0IGJlIGFuIGFycmF5IG9mIGZ1bmN0aW9ucycpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0YXNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3cmFwSXRlcmF0b3IgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh3cmFwSXRlcmF0b3IobmV4dCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHdyYXBJdGVyYXRvcihhc3luYy5pdGVyYXRvcih0YXNrcykpKCk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9wYXJhbGxlbCA9IGZ1bmN0aW9uKGVhY2hmbiwgdGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICh0YXNrcy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgIGVhY2hmbi5tYXAodGFza3MsIGZ1bmN0aW9uIChmbiwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgZXJyLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICAgIGVhY2hmbi5lYWNoKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5wYXJhbGxlbCA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBhc3luYy5tYXAsIGVhY2g6IGFzeW5jLmVhY2ggfSwgdGFza3MsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5wYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24odGFza3MsIGxpbWl0LCBjYWxsYmFjaykgewogICAgICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IF9tYXBMaW1pdChsaW1pdCksIGVhY2g6IF9lYWNoTGltaXQobGltaXQpIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuc2VyaWVzID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBhc3luYy5tYXBTZXJpZXModGFza3MsIGZ1bmN0aW9uIChmbiwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgZXJyLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoX2tleXModGFza3MpLCBmdW5jdGlvbiAoaywgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICB0YXNrc1trXShmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLml0ZXJhdG9yID0gZnVuY3Rpb24gKHRhc2tzKSB7CiAgICAgICAgICAgIHZhciBtYWtlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzW2luZGV4XS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4ubmV4dCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZuLm5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA8IHRhc2tzLmxlbmd0aCAtIDEpID8gbWFrZUNhbGxiYWNrKGluZGV4ICsgMSk6IG51bGw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gbWFrZUNhbGxiYWNrKDApOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLmFwcGx5ID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSgKICAgICAgICAgICAgICAgICAgICBudWxsLCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX2NvbmNhdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByID0gW107CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYikgewogICAgICAgICAgICAgICAgZm4oeCwgZnVuY3Rpb24gKGVyciwgeSkgewogICAgICAgICAgICAgICAgICAgIHIgPSByLmNvbmNhdCh5IHx8IFtdKTsKICAgICAgICAgICAgICAgICAgICBjYihlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuY29uY2F0ID0gZG9QYXJhbGxlbChfY29uY2F0KTsKICAgICAgICBhc3luYy5jb25jYXRTZXJpZXMgPSBkb1NlcmllcyhfY29uY2F0KTsKCiAgICAgICAgYXN5bmMud2hpbHN0ID0gZnVuY3Rpb24gKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBpZiAodGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMud2hpbHN0KHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5kb1doaWxzdCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgICAgIGFzeW5jLmRvV2hpbHN0KGl0ZXJhdG9yLCB0ZXN0LCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy51bnRpbCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKCF0ZXN0KCkpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy51bnRpbCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9VbnRpbCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1VudGlsKGl0ZXJhdG9yLCB0ZXN0LCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5xdWV1ZSA9IGZ1bmN0aW9uICh3b3JrZXIsIGNvbmN1cnJlbmN5KSB7CiAgICAgICAgICAgIGlmIChjb25jdXJyZW5jeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2luc2VydChxLCBkYXRhLCBwb3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpZihkYXRhLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEudGFza3MudW5zaGlmdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAocS5zYXR1cmF0ZWQgJiYgcS50YXNrcy5sZW5ndGggPT09IGNvbmN1cnJlbmN5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEuc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShxLnByb2Nlc3MpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB3b3JrZXJzID0gMDsKICAgICAgICAgICAgdmFyIHEgPSB7CiAgICAgICAgICAgICAgICB0YXNrczogW10sCiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeTogY29uY3VycmVuY3ksCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgX2luc2VydChxLCBkYXRhLCBmYWxzZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVuc2hpZnQ6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgdHJ1ZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2VycyA8IHEuY29uY3VycmVuY3kgJiYgcS50YXNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBxLnRhc2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmVtcHR5ICYmIHEudGFza3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VycyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5jYWxsYmFjay5hcHBseSh0YXNrLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEuZHJhaW4gJiYgcS50YXNrcy5sZW5ndGggKyB3b3JrZXJzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5kcmFpbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5wcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYiA9IG9ubHlfb25jZShuZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyKHRhc2suZGF0YSwgY2IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS50YXNrcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXJzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gcTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5jYXJnbyA9IGZ1bmN0aW9uICh3b3JrZXIsIHBheWxvYWQpIHsKICAgICAgICAgICAgdmFyIHdvcmtpbmcgICAgID0gZmFsc2UsCiAgICAgICAgICAgICAgICB0YXNrcyAgICAgICA9IFtdOwoKICAgICAgICAgICAgdmFyIGNhcmdvID0gewogICAgICAgICAgICAgICAgdGFza3M6IHRhc2tzLAogICAgICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCwKICAgICAgICAgICAgICAgIHNhdHVyYXRlZDogbnVsbCwKICAgICAgICAgICAgICAgIGVtcHR5OiBudWxsLAogICAgICAgICAgICAgICAgZHJhaW46IG51bGwsCiAgICAgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXJnby5zYXR1cmF0ZWQgJiYgdGFza3MubGVuZ3RoID09PSBwYXlsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5zYXR1cmF0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShjYXJnby5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5kcmFpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdHMgPSB0eXBlb2YgcGF5bG9hZCA9PT0gJ251bWJlcicgPwogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5zcGxpY2UoMCwgcGF5bG9hZCkgOgogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5zcGxpY2UoMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IF9tYXAodHMsIGZ1bmN0aW9uICh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGlmKGNhcmdvLmVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHdvcmtlcihkcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2godHMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2FsbGJhY2suYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JraW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gY2FyZ287CiAgICAgICAgfTsKCiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqLwogICAgICAgIHZhciBfY29uc29sZV9mbiA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc29sZVtuYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2goYXJncywgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW25hbWVdKHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi8KCiAgICAgICAgYXN5bmMubG9nID0gX2NvbnNvbGVfZm4oJ2xvZycpOwogICAgICAgIGFzeW5jLmRpciA9IF9jb25zb2xlX2ZuKCdkaXInKTsKICAgICAgICAvKmFzeW5jLmluZm8gPSBfY29uc29sZV9mbignaW5mbycpOwogICAgICAgICBhc3luYy53YXJuID0gX2NvbnNvbGVfZm4oJ3dhcm4nKTsKICAgICAgICAgYXN5bmMuZXJyb3IgPSBfY29uc29sZV9mbignZXJyb3InKTsqLwoKICAgICAgICBhc3luYy5tZW1vaXplID0gZnVuY3Rpb24gKGZuLCBoYXNoZXIpIHsKICAgICAgICAgICAgdmFyIG1lbW8gPSB7fTsKICAgICAgICAgICAgdmFyIHF1ZXVlcyA9IHt9OwogICAgICAgICAgICBoYXNoZXIgPSBoYXNoZXIgfHwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmdzLnBvcCgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IGhhc2hlci5hcHBseShudWxsLCBhcmdzKTsKICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gbWVtbykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIG1lbW9ba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgaW4gcXVldWVzKSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0ucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBxdWV1ZXNba2V5XSA9IFtjYWxsYmFja107CiAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncy5jb25jYXQoW2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb1trZXldID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcXVldWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH1dKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG1lbW9pemVkLm1lbW8gPSBtZW1vOwogICAgICAgICAgICBtZW1vaXplZC51bm1lbW9pemVkID0gZm47CiAgICAgICAgICAgIHJldHVybiBtZW1vaXplZDsKICAgICAgICB9OwoKICAgICAgICBhc3luYy51bm1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoZm4udW5tZW1vaXplZCB8fCBmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy50aW1lcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBjb3VudGVyID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhc3luYy5tYXAoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy50aW1lc1NlcmllcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBjb3VudGVyID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhc3luYy5tYXBTZXJpZXMoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5jb21wb3NlID0gZnVuY3Rpb24gKC8qIGZ1bmN0aW9ucy4uLiAqLykgewogICAgICAgICAgICB2YXIgZm5zID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIGFzeW5jLnJlZHVjZShmbnMsIGFyZ3MsIGZ1bmN0aW9uIChuZXdhcmdzLCBmbiwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgbmV3YXJncy5jb25jYXQoW2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoZXJyLCBuZXh0YXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1dKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoYXQsIFtlcnJdLmNvbmNhdChyZXN1bHRzKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9hcHBseUVhY2ggPSBmdW5jdGlvbiAoZWFjaGZuLCBmbnMgLyphcmdzLi4uKi8pIHsKICAgICAgICAgICAgdmFyIGdvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCBmdW5jdGlvbiAoZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MuY29uY2F0KFtjYl0pKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICAgICAgICAgICAgICByZXR1cm4gZ28uYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ287CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGFzeW5jLmFwcGx5RWFjaCA9IGRvUGFyYWxsZWwoX2FwcGx5RWFjaCk7CiAgICAgICAgYXN5bmMuYXBwbHlFYWNoU2VyaWVzID0gZG9TZXJpZXMoX2FwcGx5RWFjaCk7CgogICAgICAgIGFzeW5jLmZvcmV2ZXIgPSBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmbihuZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgfTsKCiAgICAgICAgLyoKICAgICAgICAvLyBBTUQgLyBSZXF1aXJlSlMKICAgICAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVmaW5lLmFtZCkgewogICAgICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhc3luYzsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIE5vZGUuanMKICAgICAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGFzeW5jOwogICAgICAgIH0KICAgICAgICAvLyBpbmNsdWRlZCBkaXJlY3RseSB2aWEgPHNjcmlwdD4gdGFnCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgcm9vdC5hc3luYyA9IGFzeW5jOwoKCgoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIEVRVUlWIEFORCBIT09aSVQKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8vIERldGVybWluZSB3aGF0IGlzIG8uCiAgICAgICAgZnVuY3Rpb24gaG9veml0KG8pIHsKICAgICAgICAgICAgaWYgKG8uY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChvLmNvbnN0cnVjdG9yID09PSBCb29sZWFuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChvLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpIHsKCiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5hbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInVuZGVmaW5lZCI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IHR5cGVvZiBudWxsID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgW10gPT09IG9iamVjdAogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IHR5cGVvZiBuZXcgRGF0ZSgpID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogLy4vIGluc3RhbmNlb2YgT2JqZWN0OwogICAgICAgICAgICAgICAgLy8gICAgICAgICAgIC8uLyBpbnN0YW5jZW9mIFJlZ0V4cDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHR5cGVvZiAvLi8gPT09ICJmdW5jdGlvbiI7IC8vID0+IGZhbHNlIGluIElFIGFuZCBPcGVyYSwKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBpbiBGRiBhbmQgU2FmYXJpCiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJlZ0V4cCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJyZWdleHAiOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbyA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENhbGwgdGhlIG8gcmVsYXRlZCBjYWxsYmFjayB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCiAgICAgICAgZnVuY3Rpb24gYmluZENhbGxiYWNrcyhvLCBjYWxsYmFja3MsIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIHByb3AgPSBob296aXQobyk7CiAgICAgICAgICAgIGlmIChwcm9wKSB7CiAgICAgICAgICAgICAgICBpZiAoaG9veml0KGNhbGxiYWNrc1twcm9wXSkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdLmFwcGx5KGNhbGxiYWNrcywgYXJncyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFja3NbcHJvcF07IC8vIG9yIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUZXN0IGZvciBlcXVhbGl0eSBhbnkgSmF2YVNjcmlwdCB0eXBlLgogICAgICAgIHZhciBlcXVpdiA9IHJvb3QuZXF1aXYgPSBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlubmVyRXF1aXY7IC8vIHRoZSByZWFsIGVxdWl2IGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBjYWxsZXJzID0gW107IC8vIHN0YWNrIHRvIGRlY2lkZSBiZXR3ZWVuIHNraXAvYWJvcnQgZnVuY3Rpb25zCgogICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIC8vIGZvciBzdHJpbmcsIGJvb2xlYW4sIG51bWJlciBhbmQgbnVsbAogICAgICAgICAgICAgICAgZnVuY3Rpb24gdXNlU3RyaWN0RXF1YWxpdHkoYiwgYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgYS5jb25zdHJ1Y3RvciB8fCBhIGluc3RhbmNlb2YgYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaCBzaG9ydCBhbm5vdGFpb24gVlMgJ25ldycgYW5ub3RhdGlvbiBvZiBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gdmFyIGkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIHZhciBqID0gbmV3IE51bWJlcigxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT0gYjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA9PT0gYjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RyaW5nIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iOiB1c2VTdHJpY3RFcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAibnVtYmVyIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bGwiOiB1c2VTdHJpY3RFcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkIjogdXNlU3RyaWN0RXF1YWxpdHksCgogICAgICAgICAgICAgICAgICAgICJuYW4iOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4oYik7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgImRhdGUiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9veml0KGIpID09PSAiZGF0ZSIgJiYgYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJyZWdleHAiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9veml0KGIpID09PSAicmVnZXhwIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zb3VyY2UgPT09IGIuc291cmNlICYmIC8vIHRoZSByZWdleCBpdHNlbGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJiAvLyBhbmQgaXRzIG1vZGlmZXJzIChnbWkpIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAvLyAtIHNraXAgd2hlbiB0aGUgcHJvcGVydHkgaXMgYSBtZXRob2Qgb2YgYW4gaW5zdGFuY2UgKE9PUCkKICAgICAgICAgICAgICAgICAgICAvLyAtIGFib3J0IG90aGVyd2lzZSwKICAgICAgICAgICAgICAgICAgICAvLyAgIGluaXRpYWwgPT09IHdvdWxkIGhhdmUgY2F0Y2ggaWRlbnRpY2FsIHJlZmVyZW5jZXMgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGVyID0gY2FsbGVyc1tjYWxsZXJzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGVyICE9PSBPYmplY3QgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjYWxsZXIgIT09ICJ1bmRlZmluZWQiOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJhcnJheSI6IGZ1bmN0aW9uIChiLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYiBjb3VsZCBiZSBhbiBvYmplY3QgbGl0ZXJhbCBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoaG9veml0KGIpID09PSAiYXJyYXkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBhLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiAhPT0gYi5sZW5ndGgpIHsgLy8gc2FmZSBhbmQgZmFzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggISBpbm5lckVxdWl2KGFbaV0sIGJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJvYmplY3QiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVxID0gdHJ1ZTsgLy8gdW5sZXNzIHdlIGNhbiBwcm9vdmUgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFQcm9wZXJ0aWVzID0gW10sIGJQcm9wZXJ0aWVzID0gW107IC8vIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIGNvbnN0cnVjdG9ycyBpcyBtb3JlIHN0cmljdCB0aGFuIHVzaW5nIGluc3RhbmNlb2YKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrIGNvbnN0cnVjdG9yIGJlZm9yZSB0cmF2ZXJzaW5nIHByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycy5wdXNoKGEuY29uc3RydWN0b3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGEpIHsgLy8gYmUgc3RyaWN0OiBkb24ndCBlbnN1cmVzIGhhc093blByb3BlcnR5IGFuZCBnbyBkZWVwCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBhJ3MgcHJvcGVydGllcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBpbm5lckVxdWl2KGFbaV0sIGJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycy5wb3AoKTsgLy8gdW5zdGFjaywgd2UgYXJlIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvcGVydGllcy5wdXNoKGkpOyAvLyBjb2xsZWN0IGIncyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZXMgaWRlbnRpY2FsIHByb3BlcnRpZXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXEgJiYgaW5uZXJFcXVpdihhUHJvcGVydGllcy5zb3J0KCksIGJQcm9wZXJ0aWVzLnNvcnQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwoKICAgICAgICAgICAgaW5uZXJFcXVpdiA9IGZ1bmN0aW9uICgpIHsgLy8gY2FuIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBlbmQgdHJhbnNpdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY2F0Y2ggdGhlIG1vc3QgeW91IGNhbgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsIHx8IHR5cGVvZiBhID09PSAidW5kZWZpbmVkIiB8fCB0eXBlb2YgYiA9PT0gInVuZGVmaW5lZCIgfHwgaG9veml0KGEpICE9PSBob296aXQoYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkb24ndCBsb3NlIHRpbWUgd2l0aCBlcnJvciBwcm9uZSBjYXNlcwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kQ2FsbGJhY2tzKGEsIGNhbGxiYWNrcywgW2IsIGFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gd2l0aCAoMS4ubikgYXJndW1lbnRzCiAgICAgICAgICAgICAgICB9KShhcmdzWzBdLCBhcmdzWzFdKSAmJiBhcmd1bWVudHMuY2FsbGVlLmFwcGx5KHRoaXMsIGFyZ3Muc3BsaWNlKDEsIGFyZ3MubGVuZ3RoIC0xKSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gaW5uZXJFcXVpdjsKCiAgICAgICAgfSgpOwoKICAgIH0oKSk7CgogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UUk9MX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udHJvbC1maWVsZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRhaW5lci1maWVsZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNID0gImFscGFjYS1tYXJrZXItY29udHJvbC1maWVsZC1pdGVtIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgPSAiZGF0YS1hbHBhY2EtY29udGFpbmVyLWZpZWxkLWl0ZW0ta2V5IjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWZvcm0taXRlbXMtZmllbGQiOwogICAgQWxwYWNhLkNMQVNTX0NPTlRBSU5FUiA9ICJhbHBhY2EtY29udGFpbmVyIjsKICAgIEFscGFjYS5DTEFTU19DT05UUk9MID0gImFscGFjYS1jb250cm9sIjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUID0gImFscGFjYS1tYXJrZXItaW5zZXJ0IjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZID0gImRhdGEtYWxwYWNhLW1hcmtlci1pbnNlcnQta2V5IjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLXRvb2xiYXIiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX1RPT0xCQVJfRklFTERfSUQgPSAiZGF0YS1hbHBhY2EtYXJyYXktZmllbGQtdG9vbGJhci1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSID0gImFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1hY3Rpb25iYXIiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgPSAiZGF0YS1hbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tcGFyZW50LWZpZWxkLWlkIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLWZpZWxkLWlkIjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQtaXRlbS1maWVsZCI7CgogICAgQWxwYWNhLm1ha2VDYWNoZUtleSA9IGZ1bmN0aW9uKHZpZXdJZCwgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkKQogICAgewogICAgICAgIHJldHVybiB2aWV3SWQgKyAiOiIgKyBzY29wZVR5cGUgKyAiOiIgKyBzY29wZUlkICsgIjoiICsgdGVtcGxhdGVJZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBjYWNoZSBrZXkgaW50byBpdHMgcGFydHMgLSB2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCBhbmQgdGVtcGxhdGVJZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAqIEByZXR1cm5zIHt7fX0KICAgICAqLwogICAgQWxwYWNhLnNwbGl0Q2FjaGVLZXkgPSBmdW5jdGlvbihjYWNoZUtleSkKICAgIHsKICAgICAgICB2YXIgcGFydHMgPSB7fTsKCiAgICAgICAgdmFyIHggPSBjYWNoZUtleS5pbmRleE9mKCI6Iik7CiAgICAgICAgdmFyIHkgPSBjYWNoZUtleS5sYXN0SW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy52aWV3SWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoMCwgeCk7CiAgICAgICAgcGFydHMudGVtcGxhdGVJZCA9IGNhY2hlS2V5LnN1YnN0cmluZyh5ICsgMSk7CgogICAgICAgIHZhciBzY29wZUlkZW50aWZpZXIgPSBjYWNoZUtleS5zdWJzdHJpbmcoeCArIDEsIHkpOwoKICAgICAgICB2YXIgeiA9IHNjb3BlSWRlbnRpZmllci5pbmRleE9mKCI6Iik7CgogICAgICAgIHBhcnRzLnNjb3BlVHlwZSA9IHNjb3BlSWRlbnRpZmllci5zdWJzdHJpbmcoMCwgeik7CiAgICAgICAgcGFydHMuc2NvcGVJZCA9IHNjb3BlSWRlbnRpZmllci5zdWJzdHJpbmcoeisxKTsKCiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgfTsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgZGF0YSBvYmplY3QgZm9yIGEgZ2l2ZW4gSlNPTiBzY2hlbWEuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtYQogICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAqLwogICAgQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlID0gZnVuY3Rpb24oc2NoZW1hKQogICAgewogICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICAvKioKICAgICAqIFN3YXBzIHR3byBkaXZzIHZpc3VhbGx5IGFuZCB0aGVuIGZpcmVzIGEgY2FsbGJhY2suCiAgICAgKgogICAgICogQHBhcmFtIHNvdXJjZQogICAgICogQHBhcmFtIHRhcmdldAogICAgICogQHBhcmFtIGR1cmF0aW9uCiAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAqLwogICAgQWxwYWNhLmFuaW1hdGVkU3dhcCA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihkdXJhdGlvbikgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkdXJhdGlvbjsKICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgfQoKICAgICAgICB2YXIgX2FuaW1hdGUgPSBmdW5jdGlvbihhLCBiLCBkdXJhdGlvbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZnJvbSA9ICQoYSksCiAgICAgICAgICAgICAgICBkZXN0ID0gJChiKSwKICAgICAgICAgICAgICAgIGZyb21fcG9zID0gZnJvbS5vZmZzZXQoKSwKICAgICAgICAgICAgICAgIGRlc3RfcG9zID0gZGVzdC5vZmZzZXQoKSwKICAgICAgICAgICAgICAgIGZyb21fY2xvbmUgPSBmcm9tLmNsb25lKCksCiAgICAgICAgICAgICAgICBkZXN0X2Nsb25lID0gZGVzdC5jbG9uZSgpLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfdmVydGljYWwgICA9IGRlc3RfcG9zLnRvcCArIGRlc3QuaGVpZ2h0KCkgLSBmcm9tX3Bvcy50b3AsCiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgICAgPSAwLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfaG9yaXpvbnRhbCA9IGRlc3RfcG9zLmxlZnQgKyBkZXN0LndpZHRoKCkgLSBmcm9tX3Bvcy5sZWZ0LAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgID0gMDsKCiAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMCk7CiAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmluc2VydEFmdGVyKGZyb20pLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBmcm9tLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBmcm9tLm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZnJvbV9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKICAgICAgICAgICAgZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgZGVzdF9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sIGR1cmF0aW9uICsgMSk7CiAgICAgICAgfTsKCiAgICAgICAgX2FuaW1hdGUoc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogQW5pbWF0ZXMgdGhlIG1vdmVtZW50IG9mIGEgZGl2IHZpc3VhbGx5IGFuZCB0aGVuIGZpcmVzIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZE1vdmUgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lID0gZGVzdC5jbG9uZSgpLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfdmVydGljYWwgICA9IGRlc3RfcG9zLnRvcCArIGRlc3QuaGVpZ2h0KCkgLSBmcm9tX3Bvcy50b3AsCiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgICAgPSAwLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfaG9yaXpvbnRhbCA9IGRlc3RfcG9zLmxlZnQgKyBkZXN0LndpZHRoKCkgLSBmcm9tX3Bvcy5sZWZ0LAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgID0gMDsKCiAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMCk7CiAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmluc2VydEFmdGVyKGZyb20pLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBmcm9tLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBmcm9tLm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZnJvbV9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKICAgICAgICAgICAgLy9kZXN0X2Nsb25lLmluc2VydEFmdGVyKGRlc3QpLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBkZXN0Lm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBkZXN0Lm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZGVzdF9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKCiAgICAgICAgICAgIGlmKGZyb21fcG9zLnRvcCAhPT0gZGVzdF9wb3MudG9wKSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBmcm9tLmhlaWdodCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGRlc3QuaGVpZ2h0KCk7CiAgICAgICAgICAgIGlmKGZyb21fcG9zLmxlZnQgIT09IGRlc3RfcG9zLmxlZnQpIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBmcm9tLndpZHRoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGRlc3Qud2lkdGgoKTsKCiAgICAgICAgICAgIGZyb21fY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICIrPSIgKyByb3V0ZV9mcm9tX3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICIrPSIgKyByb3V0ZV9mcm9tX2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZGVzdC5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgZGVzdF9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIi09IiArIHJvdXRlX2Rlc3RfdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIi09IiArIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZyb21fY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAvL2Rlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCgogICAgQWxwYWNhLmZpcmVSZWFkeSA9IGZ1bmN0aW9uKF9maWVsZCkKICAgIHsKICAgICAgICBpZiAoX2ZpZWxkLmNoaWxkcmVuICYmIF9maWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBnKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoX2ZpZWxkLmNoaWxkcmVuW2ddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgX2ZpZWxkLnRyaWdnZXIoInJlYWR5Iik7CiAgICB9OwoKICAgIEFscGFjYS5yZWFkQ29va2llID0gZnVuY3Rpb24obmFtZSkKICAgIHsKICAgICAgICBmdW5jdGlvbiBfcmVhZENvb2tpZShuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG5hbWVFUSA9IG5hbWUgKyAiPSI7CiAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IGNhW2ldOwogICAgICAgICAgICAgICAgd2hpbGUgKGMuY2hhckF0KDApPT0nICcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYyA9IGMuc3Vic3RyaW5nKDEsYy5sZW5ndGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YnN0cmluZyhuYW1lRVEubGVuZ3RoLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlID0gX3JlYWRDb29raWUobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwoKICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkgPSBmdW5jdGlvbihiYXNlT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlcykgewoKICAgICAgICBpZiAodHlwZW9mKGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSkgPT09ICJ1bmRlZmluZWQiIHx8IGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSA9IFtdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLnB1c2godmFsdWVzW2ldKTsKICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5pbkFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gKCQuaW5BcnJheSh2YWwsIGFycmF5KSA+IC0xKTsKICAgIH07CgogICAgQWxwYWNhLmluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwgdmFsKQogICAgewogICAgICAgIHJldHVybiAkLmluQXJyYXkodmFsLCBhcnJheSk7CiAgICB9OwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIE1vbWVudC5qcyBzdGF0aWMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EubW9tZW50ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5tb21lbnQpIHsKICAgICAgICAgICAgICAgIEFscGFjYS5fbW9tZW50ID0gd2luZG93Lm1vbWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFBbHBhY2EuX21vbWVudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBtb21lbnQuanMgbGlicmFyeSBoYXMgbm90IGJlZW4gaW5jbHVkZWQsIGNhbm5vdCBwcm9kdWNlIG1vbWVudCBvYmplY3QiKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBbHBhY2EuX21vbWVudC5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIENTUkYgU3VwcG9ydAogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5DU1JGX1RPS0VOID0gbnVsbDsKICAgIEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUyA9IFsiQ1NSRi1UT0tFTiIsICJYU1JGLVRPS0VOIl07CiAgICBBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRSA9ICJYLUNTUkYtVE9LRU4iOwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIFNUQVRJQyBERUZBVUxUUwogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8vIHVzZSB0aGlzIHRvIHNldCB0aGUgZGVmYXVsdCAic3RpY2t5IiB0b29sYmFyIGJlaGF2aW9yCiAgICAvLyBzZXQgdG8gdHJ1ZSB0byBoYXZlIHRvb2xiYXJzIGFsd2F5cyBzdGljayBvciB1bmRlZmluZWQgdG8gaGF2ZSB0aGVtIGFwcGVhciBvbiBob3ZlcgogICAgQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5ID0gdW5kZWZpbmVkOwoKICAgIC8vIHVzZSB0aGlzIHRvIGhhdmUgaW52YWxpZCBtZXNzYWdlcyBzaG93IHVwIGZvciByZWFkLW9ubHkgZmllbGRzCiAgICBBbHBhY2Euc2hvd1JlYWRPbmx5SW52YWxpZFN0YXRlID0gZmFsc2U7CgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIENBQ0hFIElNUExFTUVOVEFUSU9OUwogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5jYWNoZXMgPSB7fTsKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlID0gZnVuY3Rpb24oaWQsIGNhY2hlRm4pCiAgICB7CiAgICAgICAgQWxwYWNhLmNhY2hlc1tpZF0gPSBjYWNoZUZuOwogICAgfTsKICAgIEFscGFjYS5nZXRDYWNoZSA9IGZ1bmN0aW9uKGlkKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuY2FjaGVzW2lkXTsKICAgIH07CgoKfSkoalF1ZXJ5KTsKCi8qanNoaW50IC1XMDE0ICovIC8vIGJhZCBsaW5lIGJyZWFraW5nCi8qanNoaW50IC1XMDA0ICovIC8vIGR1cGxpY2F0ZSB2YXJpYWJsZXMKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EubGlzdGVuZXJJZCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgeCA9IDA7CgogICAgICAgIHJldHVybiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImxpc3RlbmVyLSIgKyAoeCsrKTsKICAgICAgICB9OwogICAgfSgpOwoKICAgIC8qKgogICAgICogU3Vic2NyaWJlcyBhIGZ1bmN0aW9uIGhhbmRsZXIgdG8gYW4gb2JzZXJ2YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrRnVuY3Rpb24gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS5zdWJzY3JpYmUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CgogICAgICAgIHZhciBzY29wZSA9IG51bGw7CiAgICAgICAgdmFyIGlkID0gbnVsbDsKICAgICAgICB2YXIgbGlzdGVuZXIgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lciA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lciA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIHN1YnNjcmliZSBpZDogIiArIGlkKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBmdW5jdGlvbiBpZGVudGlmaWVyCiAgICAgICAgdmFyIGxpc3RlbmVySWQgPSBsaXN0ZW5lci5fbGZpZDsKICAgICAgICBpZiAoIWxpc3RlbmVySWQpIHsKICAgICAgICAgICAgbGlzdGVuZXJJZCA9IEFscGFjYS5saXN0ZW5lcklkKCk7CiAgICAgICAgICAgIGxpc3RlbmVyLl9sZmlkID0gbGlzdGVuZXJJZDsKICAgICAgICB9CgogICAgICAgIC8vIHdyYXAgZnVuY3Rpb24gaW50byBhIGNsb3N1cmUKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKHRoYXQpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSh0aGlzKTsKICAgICAgICBmdW5jLl9sZmlkID0gbGlzdGVuZXIuX2xmaWQ7CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIC8vIHRlbGwgdGhlIG9ic2VydmFibGUgdG8gc3Vic2NyaWJlCiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUobGlzdGVuZXJJZCwgZnVuYyk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBVbnN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIGZyb20gYW4gb2JzZXJ2YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBsaXN0ZW5lciBlaXRoZXIgdGhlIGZ1bmN0aW9uIG9yIGxpc3RlbmVyIGlkCiAgICAgKiBAcmV0dXJuIGRlc2NyaXB0b3IKICAgICAqLwogICAgQWxwYWNhLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyT3JJZCA9IG51bGw7CgogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXJPcklkID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxpc3RlbmVySWQgPSBsaXN0ZW5lck9ySWQ7CiAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGxpc3RlbmVySWQpKQogICAgICAgIHsKICAgICAgICAgICAgbGlzdGVuZXJJZCA9IGxpc3RlbmVySWQuX2xmaWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIGlkKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHVuc3Vic2NyaWJlCiAgICAgICAgb2JzZXJ2YWJsZS51bnN1YnNjcmliZShsaXN0ZW5lcklkKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInNjb3BlIjogc2NvcGUsCiAgICAgICAgICAgICJpZCI6IGlkLAogICAgICAgICAgICAibGlzdGVuZXJJZCI6IGxpc3RlbmVySWQKICAgICAgICB9OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldHMgb3Igc2V0cyBhbiBvYnNlcnZhYmxlIGluIHRoZSBnaXZlbiBzY29wZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqLwogICAgQWxwYWNhLm9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlOwogICAgICAgIHZhciBpZDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7CiAgICB9OwoKICAgIEFscGFjYS5jbGVhck9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlOwogICAgICAgIHZhciBpZDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgb2JzZXJ2YWJsZS5jbGVhcigpOwogICAgfTsKCiAgICAvKioKICAgICAqIERlY2xhcmVzIGFuZCBnZXRzIGEgZGVwZW5kZW50IG9ic2VydmFibGUgaW4gYSBnaXZlbiBzY29wZQogICAgICoKICAgICAqIEBwYXJhbSBzY29wZQogICAgICogQHBhcmFtIGlkCiAgICAgKiBAcGFyYW0gZnVuYwogICAgICovCiAgICBBbHBhY2EuZGVwZW5kZW50T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGZ1bmMgPSBudWxsOwoKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBmdW5jID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBmdW5jID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EuZXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBKU09OLnN0cmluZ2lmeShhcmdzKSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKCiAgICAgICAgcmV0dXJuIG9ic2VydmFibGVzLmRlcGVuZGVudE9ic2VydmFibGUoaWQsIGZ1bmMpOwogICAgfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBDb2xsZWN0aW9uIG9mIG9ic2VydmFibGVzLgogICAgICovCiAgICBBbHBhY2EuT2JzZXJ2YWJsZXMgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKCiAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSB7fTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlOiBmdW5jdGlvbihpZCwgaW5pdGlhbFZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9ic2VydmFibGVzW2lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgQWxwYWNhLk9ic2VydmFibGUodGhpcy5zY29wZSwgaWQpOwoKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsVmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXQoaW5pdGlhbFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzW2lkXSA9IG9ic2VydmFibGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmQgYmFjayBmcm9tIG1hcAogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9ic2VydmFibGVzW2lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSB0aGlzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAgICAgICAgIC8vIHdyYXAgdGhlIG1vZGVsCiAgICAgICAgICAgICAgICB2YXIgbSA9IG5ldyBBbHBhY2EuT2JzZXJ2YWJsZXModGhpcy5zY29wZSk7CiAgICAgICAgICAgICAgICBtLm9ic2VydmFibGUgPSBmdW5jdGlvbih4LCB5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vUmF0Y2hldC5kZWJ1ZygiT2JzZXJ2YWJsZTogIiArIG9ic2VydmFibGUuaWQgKyAiIGRlcGVuZHMgb24gb2JzZXJ2YWJsZTogIiArIHgpOwogICAgICAgICAgICAgICAgICAgIHZhciBvID0gX3RoaXMub2JzZXJ2YWJsZSh4LCB5KTsKICAgICAgICAgICAgICAgICAgICBvLm1hcmtEZXBlbmRlbnRPblVzKG9ic2VydmFibGUpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB2YWx1ZSBmdW5jdGlvbiAod2hlcmUgInRoaXMiID0gdGhlIG1vZGVsKQogICAgICAgICAgICAgICAgdmFyIHZhbHVlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKG0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzW2lkXTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXM7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuT2JzZXJ2YWJsZSA9IEJhc2UuZXh0ZW5kKAogICAgewogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihzY29wZSwgaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gc2NvcGUgKyAiLSIgKyBpZDsKCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0ge307CgogICAgICAgICAgICAvLyBhcnJheSB0aGF0IGNvbnRhaW5zIG9ic2VydmFibGUgd2hvc2UgdmFsdWUgaXMgZGVwZW5kZW50IG9uIG91ciB2YWx1ZQogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXMgPSB7fTsKCgogICAgICAgICAgICAvLyBwcml2aWxlZ2VkIGZ1bmN0aW9ucwoKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLnN1YnNjcmliZXJzLCBmdW5jdGlvbihpZCwgaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoX3RoaXMudmFsdWUsIHByaW9yKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzID0gZnVuY3Rpb24ocHJpb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLmRlcGVuZGVudE9uVXMsIGZ1bmN0aW9uKGtleSwgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkRlcGVuZGVuY3lDaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYXNzdW1lIG51bGwgdmFsdWUgZnVuY3Rpb24KICAgICAgICAgICAgdGhpcy52YWx1ZUZ1bmN0aW9uID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZUZ1bmN0aW9uOiBmdW5jdGlvbih2YWx1ZUZ1bmN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52YWx1ZUZ1bmN0aW9uID0gdmFsdWVGdW5jdGlvbjsKICAgICAgICAgICAgdGhpcy5vbkRlcGVuZGVuY3lDaGFuZ2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIHdoaWNoIGFjdHMgYXMgYSBzdWJzY3JpYmVyLiAgV2hlbiB0aGlzIG9ic2VydmFibGUgdmFsdWUgY2hhbmdlcywKICAgICAgICAgKiB0aGUgaGFuZGxlciBtZXRob2QgaXMgcmFpc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGYKICAgICAgICAgKi8KICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKGlkLCBoYW5kbGVyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3Vic2NyaWJlZChpZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnNbaWRdID0gaGFuZGxlcjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN1YnNjcmliZXJzW2lkXTsKICAgICAgICB9LAoKICAgICAgICBpc1N1YnNjcmliZWQ6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLnN1YnNjcmliZXJzW2lkXSA/IHRydWU6IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBtYXJrRGVwZW5kZW50T25VczogZnVuY3Rpb24ob2JzZXJ2YWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW50T25Vc1tvYnNlcnZhYmxlLmlkXSA9IG9ic2VydmFibGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiBvbmUgb2Ygb3VyIGRlcGVuZGVudHMgaGFzIGNoYW5nZWQgaXRzIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW5jeUNoYW5nZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHByaW9yID0gdGhpcy5nZXQoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSB2YWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiwgZmlyZSBpdAogICAgICAgICAgICBpZiAodGhpcy52YWx1ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMudmFsdWVGdW5jdGlvbigpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkLCBub3RpZnkKICAgICAgICAgICAgICAgIGlmIChwcmlvciAhPSBjdXJyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGN1cnJlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0OiBmdW5jdGlvbihfZGVmYXVsdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2ID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgaWYgKCF2KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ID0gX2RlZmF1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgLy8gbm90aWZ5IGFsbCBkZXBlbmRlbnRzIChvYnNlcnZlcnMgdGhhdCBkZXBlbmQgb24gb3VyIHZhbHVlKQogICAgICAgICAgICB0aGlzLm5vdGlmeURlcGVuZGVudHMocHJpb3IpOwoKICAgICAgICAgICAgLy8gbm90aWZ5IGFsbCBzdWJzY3JpYmVycyBvZiB0aGUgdXBkYXRlZCB2YWx1ZQogICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKHByaW9yKTsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcyA9IHt9OwogICAgQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcCA9IHt9OwoKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQgPSBmdW5jdGlvbihzY29wZSkKICAgIHsKICAgICAgICBpZiAoIUFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHNjb3BlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXTsKICAgIH07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCkKewogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciByZWdpc3RyeSA9IHt9OwoKICAgICAgICByZXR1cm4gewoKICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGlkLCBlbmdpbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlZ2lzdHJ5W2lkXSA9IGVuZ2luZTsKCiAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmluZDogZnVuY3Rpb24oaWRPclR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeVtpZE9yVHlwZV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRPclR5cGVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc3BlY3QgYnkgdHlwZQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1cHBvcnRlZE1pbWV0eXBlcyA9IHJlZ2lzdHJ5W2lkXS5zdXBwb3J0ZWRNaW1ldHlwZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBwb3J0ZWRNaW1ldHlwZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZE9yVHlwZS50b0xvd2VyQ2FzZSgpID09PSBzdXBwb3J0ZWRNaW1ldHlwZXNbaV0udG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUgPSByZWdpc3RyeVtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGlkczogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaWRzID0gW107CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gcmVnaXN0cnkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goaWQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBpZHM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoKTsKCn0pKCk7CgooZnVuY3Rpb24oJCkKewogICAgQWxwYWNhLkFic3RyYWN0VGVtcGxhdGVFbmdpbmUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKCiAgICAgICAgICAgIHRoaXMuY2xlYW51cCA9IGZ1bmN0aW9uKGh0bWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChodG1sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGlmIHN0YXJ0cyB3aXRoIGEgc2NyaXB0IHRhZywgdGhlbiB3ZSBzdHJpcCB0aGF0IG91dAogICAgICAgICAgICAgICAgICAgIGlmICgkKGh0bWwpLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGh0bWwpWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJzY3JpcHQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChodG1sKS5odG1sKCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiB0ZW1wbGF0ZSAob3IgVVJJIG9yIGRvbSBzZWxlY3RvcikKICAgICAgICAgKgogICAgICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCBvbmNlIHRoZSBjb21waWxlIGNvbXBsZXRlcyBhbmQgaGFzIHNpZ25hdHVyZSBjYWxsYmFjayhlcnIpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgY29ubmVjdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBiZWluZyBjb21waWxlZCBjYW4gYmUKICAgICAgICAgICAgLy8gICBIVE1MCiAgICAgICAgICAgIC8vICAgVVJMIChodHRwLCAuLyBvciAvKQogICAgICAgICAgICAvLyAgIGRvbSBzZWxlY3RvciAoI2FiYywgLmNsYXNzbmFtZSkKICAgICAgICAgICAgLy8gICBkb20gZWxlbWVudAoKICAgICAgICAgICAgLy8gaGVyZSB3ZSB0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB2YWx1ZSBpdCBpcwogICAgICAgICAgICB2YXIgdHlwZSA9ICJodG1sIjsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh0ZW1wbGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsYyA9IHRlbXBsYXRlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKGxjKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInVyaSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZS5pbmRleE9mKCIjIikgPT09IDAgfHwgdGVtcGxhdGUuaW5kZXhPZigiLiIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIlsiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdG9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkb20gZWxlbWVudCwgd2UgZmxvdyB0aHJvdWdoCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG5vdyBleHRyYWN0IGh0bWwgYW5kIGNvbXBpbGUKICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzZWxlY3RvciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIHRlbXBsYXRlLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gInVyaSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlRXh0ZW5zaW9uID0gc2VsZi5maWxlRXh0ZW5zaW9uKCk7CgogICAgICAgICAgICAgICAgdmFyIHVybCA9IHRlbXBsYXRlOwogICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCIuIiArIGZpbGVFeHRlbnNpb24pID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHVybCArPSAiLiIgKyBmaWxlRXh0ZW5zaW9uOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIHRlbXBsYXRlIHVzaW5nIHRoZSBjb25uZWN0b3IKICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkVGVtcGxhdGUodXJsLCBmdW5jdGlvbihodG1sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgaHRtbAogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBzZWxmLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogdXJsLAogICAgICAgICAgICAgICAgICAgICJkYXRhVHlwZSI6ICJodG1sIiwKICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyI6IGZ1bmN0aW9uKGh0bWwsIGNvZGUsIHhocikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgaHRtbAogICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29tcGlsZShjYWNoZUtleSwgaHRtbCwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKHhociwgY29kZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogeGhyLnJlc3BvbnNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHIiOiB4aHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZSI6IGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJodG1sIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmIChodG1sIGluc3RhbmNlb2YgalF1ZXJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSAkKGh0bWwpLm91dGVySFRNTCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcigiVGVtcGxhdGUgZW5naW5lIGNhbm5vdCBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0eXBlOiAiICsgdHlwZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGZvciBudWxsIHRlbXBsYXRlcywgc2V0IHRvIGVtcHR5IHN0cmluZwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoaHRtbCkpIHsKICAgICAgICAgICAgICAgIGh0bWwgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJpbSB0aGUgaHRtbAogICAgICAgICAgICBodG1sID0gQWxwYWNhLnRyaW0oaHRtbCk7CgogICAgICAgICAgICBpZiAoaHRtbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIjxzY3JpcHQiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXMgc2NyaXB0IHRhZwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXBwbHkgc2NyaXB0IHRhZwogICAgICAgICAgICAgICAgaHRtbCA9ICI8c2NyaXB0IHR5cGU9JyIgKyB0aGlzLnN1cHBvcnRlZE1pbWV0eXBlcygpWzBdICsgIic+IiArIGh0bWwgKyAiPC9zY3JpcHQ+IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJDb21waWxpbmcgdGVtcGxhdGU6ICIgKyB0aGlzLmlkICsgIiwgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIsIHRlbXBsYXRlOiAiICsgaHRtbCk7CgogICAgICAgICAgICB0aGlzLmRvQ29tcGlsZShjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBleHRlbnNpb25fcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSBodG1sCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgZG9Db21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRXhlY3V0aW5nIHRlbXBsYXRlIGZvciBjYWNoZSBrZXk6ICIgKyBjYWNoZUtleSk7CgogICAgICAgICAgICB2YXIgaHRtbCA9IHRoaXMuZG9FeGVjdXRlKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjayk7CgogICAgICAgICAgICAvLyByZW1vdmVzIHdyYXBwaW5nIDxzY3JpcHQvPiB0YWcKICAgICAgICAgICAgaHRtbCA9IHRoaXMuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGUgYSB0ZW1wbGF0ZSBhbmQgaGFuZCBiYWNrIGEgdGV4dCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvRXhlY3V0ZTogZnVuY3Rpb24oY2FjaGVLZXksIG1vZGVsLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgZXhwZWN0ZWQgZmlsZSBleHRlbnNpb24gZm9yIHRlbXBsYXRlcyBsb2FkZWQgdmlhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kcyBiYWNrIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc2NyaXB0IHRhZyB0eXBlcyBmb3IgdGVtcGxhdGVzIGxvYWRlZCBmcm9tIHRoZSBET00uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhpc3RpbmcgdGVtcGxhdGUgaXMgYWxyZWFkeSBpbiBjYWNoZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqLwogICAgICAgIGlzQ2FjaGVkOiBmdW5jdGlvbihjYWNoZUtleSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBY3F1aXJlcyBhbiBhcnJheSBvZiBjYWNoZSBrZXlzIG1hdGNoaW5nIHRoZSB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXdJZAogICAgICAgICAqLwogICAgICAgIGZpbmRDYWNoZUtleXM6IGZ1bmN0aW9uKHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQsIEhhbmRsZWJhcnMsIEhhbmRsZWJhcnNQcmVjb21waWxlZCkKewogICAgLy8gcnVudGltZSBjYWNoZSBvZiBwcmVjb21waWxlZCB0ZW1wbGF0ZXMga2V5ZWQgYnkgY2FjaGVLZXkKICAgIHZhciBDT01QSUxFRF9URU1QTEFURVMgPSB7fTsKCiAgICB2YXIgaGVscGVycyA9IHt9OwogICAgaGVscGVyc1siY29tcGFyZSJdID0gZnVuY3Rpb24obHZhbHVlLCBydmFsdWUsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSGFuZGxlcmJhcnMgSGVscGVyICdjb21wYXJlJyBuZWVkcyAyIHBhcmFtZXRlcnMiKTsKICAgICAgICB9CgogICAgICAgIHZhciBvcGVyYXRvciA9IG9wdGlvbnMuaGFzaC5vcGVyYXRvciB8fCAiPT0iOwoKICAgICAgICB2YXIgb3BlcmF0b3JzID0gewogICAgICAgICAgICAnPT0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT0gcjsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICc9PT0nOiAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA9PT0gcjsgfSwKICAgICAgICAgICAgJyE9JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnIT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgIT09IHI7IH0sCiAgICAgICAgICAgICc8JzogICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA8IHI7IH0sCiAgICAgICAgICAgICc+JzogICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA+IHI7IH0sCiAgICAgICAgICAgICc8PSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA8PSByOyB9LAogICAgICAgICAgICAnPj0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPj0gcjsgfSwKICAgICAgICAgICAgJ3R5cGVvZic6ICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiB0eXBlb2YgbCA9PSByOyB9IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIH07CgogICAgICAgIGlmICghb3BlcmF0b3JzW29wZXJhdG9yXSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgZG9lc24ndCBrbm93IHRoZSBvcGVyYXRvciAiK29wZXJhdG9yKTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBvcGVyYXRvcnNbb3BlcmF0b3JdKGx2YWx1ZSxydmFsdWUpOwoKICAgICAgICBpZiggcmVzdWx0ICkgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpOwogICAgICAgIH0KICAgIH07CiAgICBoZWxwZXJzWyJpZm5vdCJdID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpOwogICAgICAgIH0KICAgIH07CiAgICBoZWxwZXJzWyJ0aW1lcyJdID0gZnVuY3Rpb24obiwgYmxvY2spIHsKICAgICAgICB2YXIgYWNjdW0gPSAnJzsKICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgYWNjdW0gKz0gYmxvY2suZm4oaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bTsKICAgIH07CiAgICBoZWxwZXJzWyJjb250cm9sIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJpdGVtIl0gPSBmdW5jdGlvbih0YWcsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0YWcpKQogICAgICAgIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHRhZzsKICAgICAgICAgICAgdGFnID0gImRpdiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIjwiICsgdGFnICsgIiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU0gKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0tFWSArICI9JyIgKyB0aGlzLm5hbWUgKyAiJz48LyIgKyB0YWcgKyAiPiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbUZpZWxkIl0gPSBmdW5jdGlvbih0YWcsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0YWcpKQogICAgICAgIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHRhZzsKICAgICAgICAgICAgdGFnID0gImRpdiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIjwiICsgdGFnICsgIiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQgKyAiJz48LyIgKyB0YWcgKyAiPiI7CiAgICB9OwogICAgaGVscGVyc1siZm9ybUl0ZW1zIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaW5zZXJ0Il0gPSBmdW5jdGlvbihrZXkpCiAgICB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19JTlNFUlQgKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0lOU0VSVF9LRVkgKyAiPSciICsga2V5ICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJzdHIiXSA9IGZ1bmN0aW9uKGRhdGEpCiAgICB7CiAgICAgICAgaWYgKGRhdGEgPT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmYWxzZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRhdGEgPT09IHRydWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gInRydWUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIwIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mKGRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAiICAiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSA9IGZ1bmN0aW9uKG9wdGlvbnMpCiAgICB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9UT09MQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHRoaXMuaWQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHZhciBodG1sID0gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyB0aGlzLm5hbWUgKyAiJyI7CiAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIiciOwogICAgICAgIGlmICh0aGlzLnBhcmVudEZpZWxkSWQpCiAgICAgICAgewogICAgICAgICAgICBodG1sICs9ICIgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX1BBUkVOVF9GSUVMRF9JRCArICI9JyIgKyB0aGlzLnBhcmVudEZpZWxkSWQgKyAiJyIKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAiPjwvZGl2PiI7CgogICAgICAgIHJldHVybiBodG1sOwogICAgfTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImFycmF5VG9vbGJhciIsIGhlbHBlcnNbImFycmF5VG9vbGJhciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImFycmF5QWN0aW9uYmFyIiwgaGVscGVyc1siYXJyYXlBY3Rpb25iYXIiXSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigic2V0SW5kZXgiLCBmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgdGhpcy5pbmRleCA9IE51bWJlcih2YWx1ZSk7CiAgICB9KTsKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJlYWNoUHJvcGVydHkiLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHJldCA9ICIiOwogICAgICAgIGZvcih2YXIgcHJvcCBpbiBjb250ZXh0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gcmV0ICsgb3B0aW9ucy5mbih7a2V5OnByb3AsdmFsdWU6Y29udGV4dFtwcm9wXX0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfSk7CgoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInVwbG9hZEVycm9yTWVzc2FnZSIsIGZ1bmN0aW9uKGVycm9yKSB7CgogICAgICAgIHZhciBtZXNzYWdlID0gZXJyb3I7CgogICAgICAgIGlmIChlcnJvciA9PT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBleGNlZWRzIHVwbG9hZF9tYXhfZmlsZXNpemUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gMikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBleGNlZWRzIE1BWF9GSUxFX1NJWkUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gMykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB3YXMgb25seSBwYXJ0aWFsbHkgdXBsb2FkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNCkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTm8gRmlsZSB3YXMgdXBsb2FkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTWlzc2luZyBhIHRlbXBvcmFyeSBmb2xkZXIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIHdyaXRlIGZpbGUgdG8gZGlzayI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSA3KQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxlIHVwbG9hZCBzdG9wcGVkIGJ5IGV4dGVuc2lvbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4RmlsZVNpemUiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxlIGlzIHRvbyBiaWciOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1pbkZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gc21hbGwiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gImFjY2VwdEZpbGVUeXBlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGV0eXBlIG5vdCBhbGxvd2VkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtYXhOdW1iZXJPZkZpbGVzIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTWF4IG51bWJlciBvZiBmaWxlcyBleGNlZWRlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAidXBsb2FkZWRCeXRlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIlVwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gImVtcHR5UmVzdWx0IikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRW1wdHkgZmlsZSB1cGxvYWQgcmVzdWx0IjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZGlzZ3Vpc2UiLCBmdW5jdGlvbih0ZXh0LCBjaGFyYWN0ZXIpIHsKCiAgICAgICAgdmFyIHJlcGxhY2VkID0gIiI7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlcGxhY2VkICs9IGNoYXJhY3RlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXBsYWNlZDsKCiAgICB9KTsKCgoKICAgIC8vSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaCIsIGhlbHBlcnNbImVhY2giXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb21wYXJlIiwgaGVscGVyc1siY29tcGFyZSJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRyb2wiLCBoZWxwZXJzWyJjb250cm9sIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29udGFpbmVyIiwgaGVscGVyc1siY29udGFpbmVyIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbSIsIGhlbHBlcnNbIml0ZW0iXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJpdGVtRmllbGQiLCBoZWxwZXJzWyJpdGVtRmllbGQiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJmb3JtSXRlbXMiLCBoZWxwZXJzWyJmb3JtSXRlbXMiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ0aW1lcyIsIGhlbHBlcnNbInRpbWVzIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigic3RyIiwgaGVscGVyc1sic3RyIl0pOwoKICAgIC8vIHdpdGgKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7CiAgICB9KTsKCiAgICAvLyBpZm5vdAogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaWZub3QiLCBoZWxwZXJzWyJpZm5vdCJdKTsKCiAgICB2YXIgcGFydGlhbHMgPSB7fTsKCiAgICBBbHBhY2EuSGFuZGxlYmFyc1RlbXBsYXRlRW5naW5lID0gQWxwYWNhLkFic3RyYWN0VGVtcGxhdGVFbmdpbmUuZXh0ZW5kKAogICAgewogICAgICAgIGZpbGVFeHRlbnNpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImh0bWwiOwogICAgICAgIH0sCgogICAgICAgIHN1cHBvcnRlZE1pbWV0eXBlczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdG1wbCIKICAgICAgICAgICAgXTsKICAgICAgICB9LAoKICAgICAgICBpbml0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhdXRvIGRpc2NvdmVyIGFueSBwcmVjb21waWxlZCB0ZW1wbGF0ZXMgYW5kIHN0b3JlIHRoZW0gYnkgY2FjaGUga2V5IGhlcmUKICAgICAgICAgICAgaWYgKEhhbmRsZWJhcnNQcmVjb21waWxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIEhhbmRsZWJhcnNQcmVjb21waWxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlcyA9IEhhbmRsZWJhcnNQcmVjb21waWxlZFt2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdmlld1RlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXdUZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGVtcGxhdGUpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlld0lkLCAidmlldyIsIHZpZXdJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVEX1RFTVBMQVRFU1tjYWNoZUtleV0gPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvblN0cmluZyA9IEhhbmRsZWJhcnMucHJlY29tcGlsZShodG1sKTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXZhbCgiKCIgKyBmdW5jdGlvblN0cmluZyArICIpIik7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZnVuY3Rpb24gLSBmbihtb2RlbCkKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh0ZW1wbGF0ZSk7CgogICAgICAgICAgICAgICAgLy8gQ0FDSEU6IHdyaXRlCiAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvRXhlY3V0ZTogZnVuY3Rpb24oY2FjaGVLZXksIG1vZGVsLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gQ0FDSEU6IHJlYWQKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRnVuY3Rpb24gPSBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldOwogICAgICAgICAgICBpZiAoIXRlbXBsYXRlRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sobmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBoYW5kbGViYXJzIGNhY2hlZCB0ZW1wbGF0ZSBmb3Iga2V5OiAiICsgY2FjaGVLZXkpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcmVuZGVyIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBodG1sID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGh0bWwgPSB0ZW1wbGF0ZUZ1bmN0aW9uKG1vZGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKENPTVBJTEVEX1RFTVBMQVRFU1tjYWNoZUtleV0gPyB0cnVlICA6IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2FjaGVLZXlzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBjYWNoZUtleSBpbiBDT01QSUxFRF9URU1QTEFURVMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZUtleS5pbmRleE9mKHZpZXdJZCArICI6IikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXlzLnB1c2goY2FjaGVLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY2FjaGVLZXlzOwogICAgICAgIH0KCiAgICB9KTsKCiAgICAvLyBhdXRvIHJlZ2lzdGVyCiAgICBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5yZWdpc3RlcigiaGFuZGxlYmFycyIsIG5ldyBBbHBhY2EuSGFuZGxlYmFyc1RlbXBsYXRlRW5naW5lKCJoYW5kbGViYXJzIikpOwoKfSkoalF1ZXJ5LCAoKHR5cGVvZihIYW5kbGViYXJzKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzIDogd2luZG93LkhhbmRsZWJhcnMpLCAoKHR5cGVvZihIYW5kbGViYXJzUHJlY29tcGlsZWQpICE9ICJ1bmRlZmluZWQiKSA/IEhhbmRsZWJhcnNQcmVjb21waWxlZCA6IHdpbmRvdy5IYW5kbGViYXJzUHJlY29tcGlsZWQpKTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Ob3JtYWxpemVkVmlldyA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3LnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogT25jZSBhbGwgb2YgdGhlIEFscGFjYSB2aWV3cyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmcmFtZXdvcmssIGVhY2ggaXMgbm9ybWFsaXplZCBzbyB0aGF0IHBhcmVudC1jaGFpbgogICAgICAgICAqIHJlZmVyZW5jZXMgYW5kIG92ZXJyaWRlcyBhcmUgbm9ybWFsaXplZCBpbnRvIGEgc2luZ2xlLCBmYXN0IGxvb2t1cCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIE5vcm1hbGl6ZWQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbih2aWV3SWQpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBOb3JtYWxpemF0aW9uIG9jY3VycyBvbmNlIHBlciB2aWV3IHVwb24gc3RhcnR1cCBvZiBBbHBhY2EuCiAgICAgICAgICovCiAgICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbih2aWV3cykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGxvYWQgdGhlIHZpZXcgb2JqZWN0CiAgICAgICAgICAgIHZhciB2aWV3T2JqZWN0ICA9IHZpZXdzW3RoaXMuaWRdOwogICAgICAgICAgICBpZiAoIXZpZXdPYmplY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSB2aWV3IG5vdCBmb3VuZDogIiArIHRoaXMuaWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb2xsZWN0IHRoZSBpbmhlcml0YW5jZSBjaGFpbgogICAgICAgICAgICB2YXIgY2hhaW4gPSBbXTsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB2aWV3T2JqZWN0OwogICAgICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICAgICAgY2hhaW4ucHVzaChjdXJyZW50KTsKCiAgICAgICAgICAgICAgICB2YXIgcGFyZW50SWQgPSBjdXJyZW50LnBhcmVudDsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSB2aWV3c1tjdXJyZW50LnBhcmVudF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJWaWV3IGNvbXBpbGF0aW9uIGZhaWxlZCAtIGNhbm5vdCBmaW5kIHBhcmVudCB2aWV3OiAiICsgcGFyZW50SWQgKyAiIGZvciB2aWV3OiAiICsgY3VycmVudC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcmV2ZXJzZSB0aGUgY2hhaW4KICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi5yZXZlcnNlKCk7CgogICAgICAgICAgICB2YXIgc2V0U2NhbGFyID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIHByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSAmJiAhQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkICsgIiBhbHJlYWR5IGhhcyB2YWx1ZTogIiArIGN1cnJlbnRWYWx1ZSArICIgYW5kIG92ZXJ3cml0aW5nIHRvOiAiICsgdmFsdWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eUlkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHNldEZ1bmN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIHByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSAmJiAhQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkICsgIiBhbHJlYWR5IGhhcyBmdW5jdGlvbiwgb3ZlcndyaXRpbmciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBtZXJnZU1hcCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwID0gc291cmNlW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZU1hcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwcm9wZXJ0eUlkXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eUlkXSA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0Mihzb3VyY2VNYXAsIHRhcmdldFtwcm9wZXJ0eUlkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQgYW5kIGFwcGx5CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gY2hhaW5baV07CgogICAgICAgICAgICAgICAgLy8gY29yZSBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInR5cGUiKTsgLy8gdmlldywgZWRpdCwgY3JlYXRlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInVpIik7IC8vIGJvb3RzdHJhcCwganF1ZXJ5dWksIGpxdWVyeW1vYmlsZSwgd2ViCgogICAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGUgdmlldyBpcyByZWFkb25seQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJkaXNwbGF5UmVhZG9ubHkiKTsKCiAgICAgICAgICAgICAgICAvLyBsb2NhbGUKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibG9jYWxlIik7CgogICAgICAgICAgICAgICAgLy8gZnVuY3Rpb25zCiAgICAgICAgICAgICAgICBzZXRGdW5jdGlvbih0aGlzLCBlbGVtZW50LCAicmVuZGVyIik7CiAgICAgICAgICAgICAgICBzZXRGdW5jdGlvbih0aGlzLCBlbGVtZW50LCAicG9zdFJlbmRlciIpOwoKICAgICAgICAgICAgICAgIC8vIHZpZXcgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAidGVtcGxhdGVzIik7CgogICAgICAgICAgICAgICAgLy8gZmllbGQgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAiZmllbGRzIik7CgogICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibGF5b3V0Iik7CgogICAgICAgICAgICAgICAgLy8gc3R5bGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAic3R5bGVzIik7CgogICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAiY2FsbGJhY2tzIik7CgogICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgIG1lcmdlTWFwKHRoaXMsIGVsZW1lbnQsICJtZXNzYWdlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWwKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiaG9yaXpvbnRhbCIpOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBzb21lIG9mIHRoZXNlPwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJsZWdlbmRTdHlsZSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0b29sYmFyU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiYnV0dG9uU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0aWNreSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJnbG9iYWxUZW1wbGF0ZSIpOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB3aXphcmQ/CiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAid2l6YXJkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVmlldyBjb21waWxhdGlvbiBjb21wbGV0ZSBmb3IgdmlldzogIiArIHRoaXMuaWQpOwogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpbmFsIHZpZXc6ICIpOwogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcywgbnVsbCwgIiAgICIpKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0pOwp9KShqUXVlcnkpOwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5SdW50aW1lVmlldyA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLlJ1bnRpbWVWaWV3LnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogUnVudGltZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpZXcgYXMgYXBwbGllZCB0byBhIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhY2Nlc3NvcnMgaW50byB0aGUgbmVzdGVkIGJlaGF2aW9ycyBvZiB2aWV3cyBhbmQgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgZmllbGQtbGV2ZWwgYXR0cmlidXRlcwogICAgICAgICAqIG9mIHRoZSBjdXJyZW50bHkgcmVuZGVyaW5nIGRvbSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDbGFzcyBmb3IgbWFuYWdpbmcgdmlldyBjb21wb25lbnRzIHN1Y2ggYXMgbGF5b3V0LCB0ZW1wbGF0ZSwgbWVzc2FnZSBldGMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGQgdGhlIGZpZWxkIGNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkLCBmaWVsZCkgewogICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CiAgICAgICAgICAgIHRoaXMuc2V0Vmlldyh2aWV3SWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZpZXcgdGhhdCB0aGlzIHJ1bnRpbWUgdmlldyBhZGFwdGVycyBzaG91bGQgY29uc3VsdCBkdXJpbmcgcmVuZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgc2V0VmlldzogZnVuY3Rpb24gKHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBmaWVsZCBjbGFzc2VzIGV2ZXIgcmVhbGx5IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseT8KICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBsZWZ0IGluIHRvIHN1cHBvcnQgQWxwYWNhIGRvY3MgZ2VuZXJhdGlvbiAobmVlZCB0byBjbGVhbiB0aGlzIHVwKXMKICAgICAgICAgICAgLy8gaWYgYSB2aWV3IGlzIG5vdCBzZXQgYXQgdGhpcyBwb2ludCBpdCBwcm9iYWJseSBtZWFucyB0aGV5IGluc3RhbnRpYXRlZCBhIGZpZWxkIGRpcmVjdGx5CiAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UsIHdlJ2xsIGp1c3QgcGljayB0aGUgZGVmYXVsdCB2aWV3CiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAgIndlYi1lZGl0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIG5vcm1hbGl6ZWQgdmlldwogICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBBbHBhY2EuZ2V0Tm9ybWFsaXplZFZpZXcodmlld0lkKTsKICAgICAgICAgICAgaWYgKCFub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgdGhlIGNhc2UKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUnVudGltZSB2aWV3IGZvciB2aWV3IGlkOiAiICsgdmlld0lkICsgIiBjb3VsZCBub3QgZmluZCBhIG5vcm1hbGl6ZWQgdmlldyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IGNvbXBpbGVkIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKHZhciBrIGluIG5vcm1hbGl6ZWRWaWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXcuaGFzT3duUHJvcGVydHkoaykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW2tdID0gbm9ybWFsaXplZFZpZXdba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVmlldyB3aXphcmQgc2V0dGluZ3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0V2l6YXJkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRWaWV3UGFyYW0oIndpemFyZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGdsb2JhbCBsYXlvdXQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fFN0cmluZ30gR2xvYmFsIGxheW91dCB0ZW1wbGF0ZSBzZXR0aW5nIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGdldEdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImdsb2JhbFRlbXBsYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBsYXlvdXQgdGVtcGxhdGUgYW5kIGJpbmRpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncyBzZXR0aW5nIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGdldExheW91dDogZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAidGVtcGxhdGVEZXNjcmlwdG9yIjogdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImxheW91dFRlbXBsYXRlIiwgc2VsZiksCiAgICAgICAgICAgICAgICAiYmluZGluZ3MiOiB0aGlzLmdldFZpZXdQYXJhbShbImxheW91dCIsImJpbmRpbmdzIl0sIHRydWUpCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgY29tcGlsZWQgdGVtcGxhdGUgaWQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZCAob3B0aW9uYWwpCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbih0ZW1wbGF0ZUlkLCBmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRoaXMsIHRlbXBsYXRlSWQsIGZpZWxkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBpZAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VJZCBNZXNzYWdlIGlkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBsb2NhbGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IE1lc3NhZ2UgbWFwcGVkIHRvIHRoZSBnaXZlbiBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRNZXNzYWdlIDogZnVuY3Rpb24gKG1lc3NhZ2VJZCwgbG9jYWxlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbWVzc2FnZUZvckxvY2FsZSA9IHRoaXMuZ2V0Vmlld1BhcmFtKFsibWVzc2FnZXMiLCBsb2NhbGUsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobWVzc2FnZUZvckxvY2FsZSkpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbWVzc2FnZUlkXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlRm9yTG9jYWxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB2aWV3IHBhcmFtZXRlciBiYXNlZCBvbiBjb25maWd1cmF0aW9uIElkIG9yIElkIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGNvbmZpZ0lkIENvbmZpZ3VyYXRpb24gaWQgb3IgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSBWaWV3IHBhcmFtZXRlciBtYXBwZWQgdG8gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBnZXRWaWV3UGFyYW06IGZ1bmN0aW9uIChjb25maWdJZCwgdG9wTGV2ZWxPbmx5KSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb29rIGZvciBleGFjdCBtYXRjaAogICAgICAgICAgICB2YXIgZmllbGRQYXRoID0gdGhpcy5maWVsZC5wYXRoOwogICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbZmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tmaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhcnJheSByZWxhdGVkIGZpZWxkIHBhdGggKHVzaW5nIFsqXSBzeW50YXgpICBpLmUuICAvYS9iWypdL2MvZFsqXS9lCiAgICAgICAgICAgIGlmIChmaWVsZFBhdGggJiYgZmllbGRQYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEgJiYgZmllbGRQYXRoLmluZGV4T2YoJ10nKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdGaWVsZFBhdGggPSBmaWVsZFBhdGgucmVwbGFjZSgvXFtcZCtcXS9nLCJbKl0iKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhcnJheSByZWxhdGVkIGZpZWxkIHBhdGggKHVzaW5nIHB1cmUgcGF0aCBzeW50YXgpICAgaS5lLiAvYS9iL2MvZC9lCiAgICAgICAgICAgIGlmIChmaWVsZFBhdGggJiYgZmllbGRQYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEgJiYgZmllbGRQYXRoLmluZGV4T2YoJ10nKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdGaWVsZFBhdGggPSBmaWVsZFBhdGgucmVwbGFjZSgvXFtcZCtcXS9nLCIiKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRvcExldmVsT25seSkgJiYgdG9wTGV2ZWxPbmx5ICYmIHRoaXMuZmllbGQucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLCBjb25maWdJZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBnZXR0aW5nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGNvbmZpZ1ZhbCBjb25maWd1cmF0aW9uIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWdJZCBjb25maWd1cmF0aW9uIGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gY29uZmlndXJhdGlvbiBtYXBwaW5nIHRvIHRoZSBnaXZlbiBpZAogICAgICAgICAqLwogICAgICAgIF9nZXRDb25maWdWYWwgOiBmdW5jdGlvbiAoY29uZmlnVmFsLCBjb25maWdJZCkgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZmlnSWQpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZ0lkLmxlbmd0aCAmJiAhQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnVmFsID0gY29uZmlnVmFsW2NvbmZpZ0lkW2ldXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICB9LAoKICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGZpZWxkLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyAmJiB0aGlzLmNhbGxiYWNrc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXS5jYWxsKGZpZWxkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5U3R5bGU6IGZ1bmN0aW9uKGlkLCBmaWVsZE9yRWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWwgPSBmaWVsZE9yRWw7CiAgICAgICAgICAgIGlmIChlbCAmJiBlbC5nZXRGaWVsZEVsKSB7CiAgICAgICAgICAgICAgICBlbCA9IGVsLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGVsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHlsZXMgJiYgdGhpcy5zdHlsZXNbaWRdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKHRoaXMuc3R5bGVzW2lkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTdHlsZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXNbaWRdID8gdGhpcy5zdHlsZXNbaWRdIDogIiI7CiAgICAgICAgfQoKCiAgICB9KTsKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZCA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBBYnN0cmFjdCBjbGFzcyB0aGF0IHNlcnZlZCBhcyBiYXNlIGZvciBhbGwgQWxwYWNhIGZpZWxkIGNsYXNzZXMgdGhhdCBwcm92aWRlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21FbCBUaGUgZG9tIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBmaWVsZCBpcyB1bHRpbWF0ZWx5IHJlbmRlcmluZy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmlld0lkIHZpZXcgaWQKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZG9tRWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlld0lkLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vIGRvbUVsCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICAvLyBjb25maWcKICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOwogICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBmaWVsZCByZW5kZXJpbmcgaXMgc2luZ2xlLWxldmVsIG9yIG5vdAogICAgICAgICAgICB0aGlzLnNpbmdsZUxldmVsUmVuZGVyaW5nID0gZmFsc2U7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gdGhpbmdzIHdlIGNhbiBkcmF3IG9mZiB0aGUgb3B0aW9ucwogICAgICAgICAgICB2YXIgbm9PcHRpb25zID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgIG5vT3B0aW9ucyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZDsKICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5vcHRpb25zLnR5cGU7CgogICAgICAgICAgICAvLyBzZXR1cCBkZWZhdWx0cwogICAgICAgICAgICBpZiAoIXRoaXMuaWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBub1NjaGVtYSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgbm9TY2hlbWEgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmxhYmVsICYmIHRoaXMuc2NoZW1hLnRpdGxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB0aGlzLnNjaGVtYS50aXRsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVyICYmIHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVyID0gdGhpcy5zY2hlbWEuZGVzY3JpcHRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0OiBvcHRpb25zLmhlbHBlciAtPiBjb252ZXJ0IHRvIG9wdGlvbnMuaGVscGVycwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5oZWxwZXJzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHRoaXMub3B0aW9ucy5oZWxwZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMucHVzaCh0aGlzLm9wdGlvbnMuaGVscGVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuaGVscGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcltpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsZWdhY3kgdmFsdWUKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuaGVscGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLnJlYWRvbmx5KSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEucmVhZG9ubHkpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVhZG9ubHkgPSB0aGlzLnNjaGVtYS5yZWFkb25seTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgZGF0YSBpcyBlbXB0eSwgdGhlbiB3ZSBjaGVjayB3aGV0aGVyIHdlIGNhbiBmYWxsIGJhY2sgdG8gYSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLmRhdGEpICYmICFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYVsiZGVmYXVsdCJdKSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5zY2hlbWFbImRlZmF1bHQiXTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd2luZ0RlZmF1bHREYXRhID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBwYXRoCiAgICAgICAgICAgIHRoaXMucGF0aCA9ICIvIjsKCiAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbiA9IHt9OwoKICAgICAgICAgICAgLy8gZXZlbnRzCiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9OwoKCgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIGluIGEgZGlzcGxheS1vbmx5IG1vZGUKICAgICAgICAgICAgdGhpcy5pc0Rpc3BsYXlPbmx5ID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmlldy50eXBlID09PSAidmlldyIgfHwgc2VsZi52aWV3LnR5cGUgPT0gImRpc3BsYXkiKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNjaGVtYSBpZCBjbGVhbnVwCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5pZCAmJiB0aGlzLnNjaGVtYS5pZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLmlkID0gdGhpcy5zY2hlbWEuaWQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYXMgdGhpcyBmaWVsZCBiZWVuIHByZXZpb3VzbHkgdmFsaWRhdGVkPwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gZmFsc2U7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvYnNlcnZhYmxlCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLnNldCh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmdldE9ic2VydmFibGVTY29wZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoIXRvcC5pc1RvcCgpKSB7CiAgICAgICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZVNjb3BlID0gdG9wLm9ic2VydmFibGVTY29wZTsKICAgICAgICAgICAgICAgIGlmICghb2JzZXJ2YWJsZVNjb3BlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGVTY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmVuc3VyZVByb3BlclR5cGUgPSBmdW5jdGlvbih2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgX2Vuc3VyZSA9IGZ1bmN0aW9uKHYsIHR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh2KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAibnVtYmVyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlRmxvYXQodik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImludGVnZXIiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gcGFyc2VJbnQodik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gIiIgfHwgdi50b0xvd2VyQ2FzZSgpID09PSAiZmFsc2UiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAiIiArIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gLTEgfHwgdiA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLml0ZW1zICYmIHNlbGYuc2NoZW1hLml0ZW1zLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gX2Vuc3VyZSh2YWxbaV0sIHNlbGYuc2NoZW1hLml0ZW1zLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh2YWwpIHx8IEFscGFjYS5pc051bWJlcih2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IF9lbnN1cmUodmFsLCBzZWxmLnNjaGVtYS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5vbkNvbnN0cnVjdCgpOwogICAgICAgIH0sCgogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBpc1RvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIGlkIG9mIHRoZSBvdXRlciBmaWVsZCB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEZvciBjb250cm9sIGZpZWxkcywgdGhpcyBpcyAiY29udHJvbCIuCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHRoaXMgaXMgImNvbnRhaW5lciIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGVtcGxhdGUgZGVzY3JpcHRvciBJRCB3YXMgbm90IHNwZWNpZmllZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdXAgZGVmYXVsdCByZW5kaXRpb24gdGVtcGxhdGUgZnJvbSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGluaXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLmdldFRlbXBsYXRlRGVzY3JpcHRvcklkKCksIHRoaXMpOwogICAgICAgICAgICB2YXIgZ2xvYmFsVGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldEdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcigpOwogICAgICAgICAgICB2YXIgbGF5b3V0ID0gdGhpcy52aWV3LmdldExheW91dCgpOwoKICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyB0aGUgZ2xvYmFsIG9yIGxheW91dCB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIHRvIHRoZSB0b3AtbW9zdCBmaWVsZAogICAgICAgICAgICB2YXIgdHJpcCA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcGxhdGVEZXNjcmlwdG9yKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXQgJiYgbGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihsYXlvdXQudGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICB0cmlwID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0cmlwICYmIHZpZXdUZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcGxhdGVEZXNjcmlwdG9yKHZpZXdUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlbnN1cmUgd2UgaGF2ZSBhIHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmdldFRlbXBsYXRlRGVzY3JpcHRvcigpOwogICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBmaWVsZCBpbnN0YW5jZSBpcyBjcmVhdGVkLiBJdCB3aWxsIGluaXRpYWxpemUKICAgICAgICAgKiB0aGUgZmllbGQgdG8gZ2V0IGl0IHJlYWR5IGZvciByZW5kaXRpb24uCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSBhIHRlbXBsYXRlIGRlc2NyaXB0b3IgcGlja2VkIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGVzY3JpcHRvcigpOwoKICAgICAgICAgICAgLy8gSlNPTiBTQ0hFTUEKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLnNjaGVtYS5yZXF1aXJlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnJlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZBTElEQVRJT04KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudmFsaWRhdGUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsaWRhdGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPUFRJT05TCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmRpc2FibGVkKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1FU1NBR0VTCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnNob3dNZXNzYWdlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXBGaWVsZDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGZuCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgb246IGZ1bmN0aW9uKG5hbWUsIGZuKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJBZGRpbmcgbGlzdGVuZXIgZm9yIGV2ZW50OiAiICsgbmFtZSk7CgogICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c1tuYW1lXSkgewogICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5wdXNoKGZuKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVW5yZWdpc3RlcnMgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqLwogICAgICAgIG9mZjogZnVuY3Rpb24obmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5sZW5ndGggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQgYW5kIHByb3BhZ2F0ZXMgdGhlIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGJlaGF2aW9yIGlzIHRvIHByb3BhZ2F0ZSB1cCB0byB0aGUgcGFyZW50IGNoYWluIChidWJibGUgdXApLgogICAgICAgICAqCiAgICAgICAgICogSWYgImRpcmVjdGlvbiIgaXMgc2V0IHRvICJkb3duIiBhbmQgdGhlIGZpZWxkIGlzIGEgY29udGFpbmVyLCB0aGVuIHRoZSBldmVudCBpcyBwcm9wYWdhdGVkIGRvd24KICAgICAgICAgKiB0byBjaGlsZHJlbiAodHJpY2tsZSBkb3duKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiYm90aCIsIHRoZW4gYm90aCB1cCBhbmQgZG93biBhcmUgdHJpZ2dlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKiBAcGFyYW0gZXZlbnQKICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIChvcHRpb25hbCkgc2VlIGFib3ZlCiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcldpdGhQcm9wYWdhdGlvbjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGRpcmVjdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YoZXZlbnQpID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gZXZlbnQ7CiAgICAgICAgICAgICAgICBldmVudCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAidXAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAidXAiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3ZSB0cmlnZ2VyIG91cnNlbHZlcyBmaXJzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwoKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgdHJpZ2dlciBwYXJlbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKHRoaXMucGFyZW50LCBuYW1lLCBldmVudCwgZGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICJkb3duIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZG8gYW55IGNoaWxkcmVuIGZpcnN0CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbChjaGlsZCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRvIG91cnNlbHZlcyBsYXN0CiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIuY2FsbCh0aGlzLCBuYW1lLCBldmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiYm90aCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCAiZG93biIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB0aGVuIGRvIG91cnNlbHZlcwogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwoKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgdHJpZ2dlciBwYXJlbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKHRoaXMucGFyZW50LCBuYW1lLCBldmVudCwgInVwIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbiBldmVudAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKiBAcGFyYW0gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIFJlbWFpbmRlciBvZiBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBldmVudCwgYXJnMSwgYXJnMiwgYXJnMykKICAgICAgICB7CiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgPT0gY29udHJvbAoKICAgICAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW25hbWVdOwogICAgICAgICAgICBpZiAoaGFuZGxlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihoYW5kbGVyKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRmlyaW5nIGV2ZW50OiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlRoZSBldmVudCBoYW5kbGVyIGNhdWdodCBhbiBleGNlcHRpb246ICIgKyBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIHRoZSBkYXRhIGludG8gdGhlIGZpZWxkLiAgQ2FsbGVkIGF0IHRoZSB2ZXJ5IGVuZCBvZiBjb25zdHJ1Y3Rpb24uCiAgICAgICAgICovCiAgICAgICAgYmluZERhdGE6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgbWV0aG9kIGludG8gdGhlIGZpZWxkLiAgSXQgaXMgY2FsbGVkIGJ5IEFscGFjYSBmb3IgZWFjaCBmaWVsZCBiZWluZyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIFJlbmRlcnMgdGhpcyBmaWVsZCBpbnRvIHRoZSBjb250YWluZXIgYW5kIGNyZWF0ZXMgYSBET00gZWxlbWVudCB3aGljaCBpcyBib3VuZCBpbnRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgVmlldyB0byBiZSB1c2VkIGZvciByZW5kZXJpbmcgZmllbGQgKG9wdGlvbmFsKS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBQb3N0LVJlbmRlciBjYWxsYmFjayAob3B0aW9uYWwpLgogICAgICAgICAqLwogICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmlldywgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodmlldyAmJiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpIHx8IEFscGFjYS5pc09iamVjdCh2aWV3KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlldy5zZXRWaWV3KHZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGNhbGxiYWNrKSAmJiBBbHBhY2EuaXNGdW5jdGlvbih2aWV3KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHZpZXc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxhc3QgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gcG9wdWxhdGUgdGhlIGxhYmVsIGZyb20gcHJvcGVydHlJZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhYmVsID09PSBudWxsICYmIHRoaXMucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5wcm9wZXJ0eUlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiBuYW1lIGZpZWxkCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5zZXR1cCgpOwoKICAgICAgICAgICAgdGhpcy5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB0aGUgcmVuZGVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJyZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY2FsY3VsYXRlTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm5hbWUgfHwgKHRoaXMubmFtZSAmJiB0aGlzLm5hbWVDYWxjdWxhdGVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGFzIHBhdGg/CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQubmFtZSAmJiB0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdGhpcy5wYXRoLnN1YnN0cmluZyh0aGlzLnBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgIT09IC0xICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudCA9IGxhc3RTZWdtZW50LnN1YnN0cmluZyhsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgKyAxLCBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5wYXJlbnQubmFtZSArICJfIiArIGxhc3RTZWdtZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbmFtZSBmcm9tIHRoZSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGF0aC5yZXBsYWNlKC9cLy9nLCIiKS5yZXBsYWNlKC9cWy9nLCJfIikucmVwbGFjZSgvXF0vZywiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgcHJvY2Vzc2luZyB0aGUgcmVuZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBQb3N0LXJlbmRlciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gYSBmb3JtCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZm9ybSAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmZvcm0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZm9ybS52aWV3VHlwZSA9IHRoaXMudmlldy50eXBlOwoKICAgICAgICAgICAgICAgIHZhciBmb3JtID0gc2VsZi5mb3JtOwogICAgICAgICAgICAgICAgaWYgKCFmb3JtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSBuZXcgQWxwYWNhLkZvcm0oc2VsZi5kb21FbCwgdGhpcy5vcHRpb25zLmZvcm0sIHNlbGYudmlldy5pZCwgc2VsZi5jb25uZWN0b3IsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JtLnJlbmRlcihmdW5jdGlvbihmb3JtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcm0gaXMgdGhlIGZvcm0gaW5zdGFuY2UgKG5vdCB0aGUganF1ZXJ5IGVsZW1lbnQpCgogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRmllbGRIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyIGl0CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzc1JlbmRlcih0ZW1wRmllbGRIb2xkZXIsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBmaWVsZCBiZWZvcmUgb3VyIGZvcm0gZmllbGRzIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZvcm1GaWVsZHNDb250YWluZXIuYmVmb3JlKHNlbGYuZmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmb3JtRmllbGRzQ29udGFpbmVyIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZvcm1GaWVsZHNDb250YWluZXIucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW5kIHRoZSB0b3AgZmllbGQgdG8gdGhlIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sID0gc2VsZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0gPSBmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWUgPSBzZWxmOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgYW55IHBvc3QtcmVuZGVyaW5nIGZhY2lsaXRpZXMgdG8ga2ljayBpbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRpYWxpemluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGZvciBmb3JtIHRvIGRvIHNvbWUgbGF0ZSB1cGRhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0uYWZ0ZXJJbml0aWFsaXplKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmllbGQgcmVtb3ZlcywgcmVtb3ZlIHRoZSBmb3JtIGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBBbHBhY2EuaXNGdW5jdGlvbihjYWxsYmFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1JlbmRlcihzZWxmLmRvbUVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkICJmaWVsZCIgZWxlbWVudCB0byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgICAgICAvLyQoc2VsZi5maWVsZCkuYXBwZW5kVG8oc2VsZi5kb21FbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCBpbml0aWFsaXppbmcKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBBbHBhY2EuaXNGdW5jdGlvbihjYWxsYmFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoZSBmaWVsZCBpbnRvIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgY2FsbGJhY2sgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIF9wcm9jZXNzUmVuZGVyOiBmdW5jdGlvbihwYXJlbnRFbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkIChvdXRlciBlbGVtZW50KQogICAgICAgICAgICBzZWxmLnJlbmRlckZpZWxkKHBhcmVudEVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImZpZWxkIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImZpZWxkIik7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyIGFueSBmaWVsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZEVsZW1lbnRzKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICByZW5kZXJGaWVsZERvbUVsZW1lbnQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgZmllbGQKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB0aGlzLm9wdGlvbnMsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICAgICAidmlldyI6IHRoaXMudmlldywKICAgICAgICAgICAgICAgICJwYXRoIjogdGhpcy5wYXRoLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgImZpZWxkIiBvdXRlciBlbGVtZW50LiAgVGhpcyBpcyB1c3VhbGx5IHRoZSBjb250cm9sIG9yIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwYXJlbnRFbAogICAgICAgICAqIEBwYXJhbSBvblN1Y2Nlc3MKICAgICAgICAgKi8KICAgICAgICByZW5kZXJGaWVsZDogZnVuY3Rpb24ocGFyZW50RWwsIG9uU3VjY2VzcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIHRoZSBkYXRhIHdlJ2xsIHJlbmRlcgogICAgICAgICAgICB2YXIgdGhlRGF0YSA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCBhbmQgdGhlRGF0YSBpcyBhbiBvYmplY3QsIGNvbnZlcnQgdG8gc3RyaW5nCiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YodGhlRGF0YSkgPT09ICJvYmplY3QiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGVEYXRhID0gSlNPTi5zdHJpbmdpZnkodGhlRGF0YSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZW5kZXJlZERvbUVsZW1lbnQgPSBzZWxmLnJlbmRlckZpZWxkRG9tRWxlbWVudCh0aGVEYXRhKTsKCiAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBiYWNrIG11bHRpcGxlIGVsZW1lbnRzLCB0cnkgdG8gcGljayBhdCB0aGUgZmlyc3QgRElWCiAgICAgICAgICAgIGlmICgkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNpbmdsZSA9IG51bGw7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQocmVuZGVyZWREb21FbGVtZW50KS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9ICQocmVuZGVyZWREb21FbGVtZW50KVtpXS5ub2RlTmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoImRpdiIgPT09IG5hbWUgfHwgInNwYW4iID09PSBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2luZ2xlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNpbmdsZSA9ICQoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxhc3QoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRG9tRWxlbWVudCA9IHNpbmdsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5maWVsZCA9IHJlbmRlcmVkRG9tRWxlbWVudDsKICAgICAgICAgICAgdGhpcy5maWVsZC5hcHBlbmRUbyhwYXJlbnRFbCk7CgogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGFueSBmaWVsZCBlbGVtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEZvciBjb250cm9scyBvciBjb250YWluZXJzLCB0aGlzIGhvb2sgaXMgdXNlZCB0byBpbmplY3QgYWRkaXRpb25hbCBkb20gZWxlbWVudHMgaW50byB0aGUgb3V0ZXIgZmllbGQKICAgICAgICAgKiBkb20gZWxlbWVudC4gIFNpbXBsZSBmaWVsZCB0eXBlcyBtYXkgY2hvb3NlIG5vdCB0byBpbXBsZW1lbnQgdGhpcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgdHlwaWNhbGx5IG9uY2UgcGVyIHJlbmRlci4gIElmIGEgRE9NIGVsZW1lbnQgaXMgbW92ZWQgd2l0aGluIGEgY29udGFpbmVyIGFuZCBpdCdzIGluZGV4aW5nCiAgICAgICAgICogY2hhbmdlcywgdGhpcyB3aWxsIGdldCBjYWxsZWQgYWdhaW5zdCB0byBlbnN1cmUgdGhhdCBET00gcHJvcGVydGllcyBhcmUga2VwdCBpbiBzeW5jLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIHBhdGgKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1wYXRoIiwgdGhpcy5nZXRQYXRoKCkpOwoKICAgICAgICAgICAgLy8gYWxsIGZpZWxkcyBnZXQgdGhlaXIgbmFtZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLW5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CgogICAgICAgICAgICAvLyBuYW1lIHNob3VsZCBub3QgYXBwZWFyIG9uIGZpZWxkCiAgICAgICAgICAgIHRoaXMuZmllbGQucmVtb3ZlQXR0cigibmFtZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBmaWVsZCByZW5kaXRpb24gaXMgY29tcGxldGUuIEl0IGlzIHNlcnZlZCBhcyBhIHdheSB0byBtYWtlIGZpbmFsCiAgICAgICAgICogbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9tIGVsZW1lbnRzIHRoYXQgd2VyZSBwcm9kdWNlZC4KICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZSAiYWxwYWNhLWZpZWxkIiBjbGFzcyB3aGljaCBtYXJrcyB0aGUgb3V0ZXIgZWxlbWVudAogICAgICAgICAgICB0aGlzLmZpZWxkLmFkZENsYXNzKCJhbHBhY2EtZmllbGQiKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IG1hcmtlZCBieSB0eXBlIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLSIgKyB0aGlzLmdldEZpZWxkVHlwZSgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IGZpZWxkIGlkIGRhdGEgYXR0cmlidXRlCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiLCB0aGlzLmdldElkKCkpOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVET01FbGVtZW50KCk7CgogICAgICAgICAgICAvLyB0cnkgdG8gYXZvaWQgYWRkaW5nIHVubmVjZXNzYXJ5IGluamVjdGlvbnMgZm9yIGRpc3BsYXkgdmlldy4KICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICE9PSAndmlldycpIHsKCiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZXF1aXJlZCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJyZXF1aXJlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1vcHRpb25hbCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogIm9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJvcHRpb25hbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBkb0Rpc2FibGVGaWVsZCA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYXJrICJkaXNhYmxlZCIgYXR0cmlidXRlIG9udG8gdW5kZXJseWluZyBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJ2lucHV0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdzZWxlY3QnLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpyYWRpbycsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnOmNoZWNrYm94Jywgc2VsZi5maWVsZCksIHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHJhZGlvIGJ1dHRvbnMgKHByZXZlbnQgY2xpY2tzKQogICAgICAgICAgICAgICAgICAgICQoIjpyYWRpbyIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCgiLnJhZGlvIGxhYmVsIiwgc2VsZi5maWVsZCkub2ZmKCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIChpbnB1dCBmaWVsZCkKICAgICAgICAgICAgICAgICAgICAkKCJpbnB1dCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgZGlzYWJsZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRpc2FibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcmVhZG9ubHkKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLXJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgICAgICQoJ2lucHV0JywgdGhpcy5maWVsZCkuYXR0cigncmVhZG9ubHknLCAncmVhZG9ubHknKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlYWRvbmx5IgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJyZWFkb25seSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1kaXNhYmxlZCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGRvRGlzYWJsZUZpZWxkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZGlzYWJsZWQiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYWxsb3cgc2luZ2xlIG9yIG11bHRpcGxlIGZpZWxkIGNsYXNzZXMgdG8gYmUgc3BlY2lmaWVkIHZpYSB0aGUgImZpZWxkQ2xhc3MiCiAgICAgICAgICAgICAgICAvLyBvciAiZmllbGRDbGFzc2VzIiBvcHRpb25zCiAgICAgICAgICAgICAgICB2YXIgYXBwbHlGaWVsZENsYXNzID0gZnVuY3Rpb24oZWwsIHRoaW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGluZykgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGluZy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRoaW5nW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5pbmRleE9mKCIsIikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRoaW5nLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0b2tlbnNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpbmcuaW5kZXhPZigiICIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXBwbHlGaWVsZENsYXNzKHRoaXMuZmllbGQsIHRoaXMub3B0aW9uc1siZmllbGRDbGFzcyJdKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3IgY3VzdG9tIHN0eWxlcyBwcm92aWRlZCBieSBjdXN0b20gdmlldwogICAgICAgICAgICAgICAgdmFyIGN1c3RvbVN0eWxlcyA9IHRoaXMudmlldy5nZXRTdHlsZXMoKTsKICAgICAgICAgICAgICAgIGlmIChjdXN0b21TdHlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgc3R5bGVDbGFzcyBpbiBjdXN0b21TdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHN0eWxlQ2xhc3MsIHRoaXMuZG9tRWwpLmNzcyhjdXN0b21TdHlsZXNbc3R5bGVDbGFzc10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgLy8gYWZ0ZXIgcmVuZGVyCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGUiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGUiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBiaW5kIGRhdGEgaWYgd2UncmUgaW4gImVkaXQiIG1vZGUKICAgICAgICAgICAgICAgIC8vIHR5cGljYWxseSwgd2UgZG9uJ3QgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJjcmVhdGUiIG9yIGFueSBvdGhlciBtb2RlCiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgJiYgdGhpcy52aWV3LnR5cGUgPT09ICdlZGl0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvbnRyb2wgaXMgc2hvd2luZyBkZWZhdWx0IGRhdGEsIHRoZW4gd2UgcmVuZGVyIHRoZSBjb250cm9sIGFueXdheQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZERhdGEoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGxvZ2dpbmcgdG8gYmUgdXNlZnVsCiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgPT09ICJjcmVhdGUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiU2tpcHBpbmcgZGF0YSBiaW5kaW5nIGZvciBmaWVsZDogIiArIHRoaXMuaWQgKyAiIHNpbmNlIHZpZXcgbW9kZSBpcyAnY3JlYXRlJyIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZG9tLWxldmVsIGV2ZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGRlbgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkZWZhdWx0SGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSAodGhpcy52aWV3LnR5cGUgPT09ICdjcmVhdGUnKSAmJiAhdGhpcy5yZWZyZXNoZWQ7CiAgICAgICAgICAgIHRoaXMuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLm9wdGlvbnMuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpID8gZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yIDogdGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yOwoKICAgICAgICAgICAgLy8gZm9yIGNyZWF0ZSB2aWV3LCBoaWRlIGFsbCByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXcuZGlzcGxheVJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtcmVhZG9ubHkiKS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHBvc3QgcmVuZGVyCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zdFJlbmRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc3RSZW5kZXIuY2FsbCh0aGlzLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWRyYXdzIHRoZSBmaWVsZCB1c2luZyB0aGUgY3VycmVudGx5IGJvdW5kIERPTSBlbGVtZW50IGFuZCB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGRhdGEKICAgICAgICAgICAgdmFyIF9kYXRhID0gc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhpcyBzdHVmZgogICAgICAgICAgICB2YXIgb2xkRG9tRWwgPSBzZWxmLmRvbUVsOwogICAgICAgICAgICB2YXIgb2xkRmllbGQgPSBzZWxmLmZpZWxkOwogICAgICAgICAgICAvL3ZhciBvbGRDb250cm9sID0gc2VsZi5jb250cm9sOwogICAgICAgICAgICAvL3ZhciBvbGRDb250YWluZXIgPSBzZWxmLmNvbnRhaW5lcjsKICAgICAgICAgICAgLy92YXIgb2xkRm9ybSA9IHNlbGYuZm9ybTsKCiAgICAgICAgICAgIC8vIGluc2VydCBtYXJrZXIgZWxlbWVudCBiZWZvcmUgY3VycmVudCBmaWVsZCB0byBtYXJrIHdoZXJlIHdlJ2xsIHJlbmRlcgogICAgICAgICAgICB2YXIgbWFya2VyRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAkKG9sZEZpZWxkKS5iZWZvcmUobWFya2VyRWwpOwoKICAgICAgICAgICAgLy8gdGVtcCBkb21FbAogICAgICAgICAgICBzZWxmLmRvbUVsID0gJCgiPGRpdiBzdHlsZT0nZGlzcGxheTogbm9uZSc+PC9kaXY+Iik7CiAgICAgICAgICAgIC8vIGNsZWFyIHRoaXMgc3R1ZmYgb3V0CiAgICAgICAgICAgIHNlbGYuZmllbGQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udHJvbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuZm9ybSA9IHVuZGVmaW5lZDsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgYWxsIGJ1dHRvbnMgb24gb3VyIGN1cnJlbnQgZmllbGQKICAgICAgICAgICAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIHJlcGVhdGVkIGNsaWNrcyBjb3VsZCBjYXVzZSB0cm91YmxlIHdoaWxlIHRoZSBmaWVsZCBpcyBpbiBzb21lIGhhbGYtc3RhdGUKICAgICAgICAgICAgLy8gZHVyaW5nIHJlZnJlc2gKICAgICAgICAgICAgJChvbGRGaWVsZCkuZmluZCgiYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKCiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vIHJlLXNldHVwIHRoZSBmaWVsZAogICAgICAgICAgICBzZWxmLnNldHVwKCk7CgogICAgICAgICAgICBzZWxmLnNldHVwRmllbGQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWhlYWQgb2YgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkuYmVmb3JlKHNlbGYuZmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgZG9tRWwKICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbUVsID0gb2xkRG9tRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgY2xhc3NlcyBmcm9tIG9sZEZpZWxkIG9udG8gZmllbGQKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkQ2xhc3NlcyA9ICQob2xkRmllbGQpLmF0dHIoImNsYXNzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENsYXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9sZENsYXNzZXMuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgIXYuaW5kZXhPZigiYWxwYWNhLSIpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcyh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBvbGQgZmllbGQKICAgICAgICAgICAgICAgICAgICAkKG9sZEZpZWxkKS5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAkKG1hcmtlckVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGF0IHdlJ3JlIHJlZnJlc2hlZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhcHBhcmVudGx5IG5lZWRlZCBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihfZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdChfZGF0YSkgfHwgQWxwYWNhLmlzQXJyYXkoX2RhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKF9kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZmlyZSB0aGUgInJlYWR5IiBldmVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoc2VsZik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndhcmRzLi4uCgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyBjbGVhbiB1cCBvbGQgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyaWdnZXIgdGhlIGJvdW5kICJkZXN0cm95ZWQiIGV2ZW50IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIG9sZCBkb20gZWwuCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhc29uIGlzIHRoYXQgd2UgaGF2ZSBvbGRGb3JtIC0+IEZpZWxkICh3aXRoIG9sZERvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZvcm0gLT4gRmllbGQgKHdpdGggZG9tRWwpCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmluZyB1cCAib2xkRG9tRWwiIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJvbGRGb3JtIiB0byBjbGVhbnVwCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY2F1c2VzICJGaWVsZCIgdG8gY2xlYW51cCB3aGljaCBjYXVzZXMgImRvbUVsIiB0byBjbGVhbiB1cCAoYW5kIGFsc28gImZvcm0iKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBqdXN0IHdhbnQgdG8gcmVtb3ZlIHRoZSBkb20gZWxlbWVudHMgZm9yICJvbGREb21FbCIgYW5kICJvbGRGb3JtIiB3aXRob3V0IHRyaWdnZXJpbmcKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lhbCBkZXN0cm95ZXIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcnMgdGhhdCB3ZSBjYW4gZG8gdGhpcyB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50Li4uPwogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkucmVtb3ZlKHVuZGVmaW5lZCwgewogICAgICAgICAgICAgICAgICAgICAgICAibm9kZXN0cm95IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbGllcyBhIHZpZXcgc3R5bGUgdG8gYSBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAgICAgKi8KICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmFwcGx5U3R5bGUoaWQsIHRhcmdldCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgYSB2aWV3IGNhbGxiYWNrIGZvciB0aGUgY3VycmVudCBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSBhcmcxCiAgICAgICAgICogQHBhcmFtIGFyZzIKICAgICAgICAgKiBAcGFyYW0gYXJnMwogICAgICAgICAqIEBwYXJhbSBhcmc0CiAgICAgICAgICogQHBhcmFtIGFyZzUKICAgICAgICAgKi8KICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGlkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmZpcmVDYWxsYmFjayh0aGlzLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBvdXRlciAiZmllbGQiIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRyb2wgZmllbGQgb3IgYSBjb250YWluZXIgZmllbGQsIHRoaXMgRE9NIGVsZW1lbnQgd2lsbCB3cmFwIHRoZSBpbm5lciAiY29udHJvbCIKICAgICAgICAgKiBhbmQgImNvbnRhaW5lciIgZWxlbWVudHMgcmVzcGVjdGl2ZWx5LiAgSW4gc29tZSBjYXNlcywgdGhlIHdyYXBwaW5nIG1pZ2h0IG5vdCBleGlzdCBpbiB3aGljaCBjYXNlIHRoaXMKICAgICAgICAgKiBmaWVsZCBtYXkgYmUgdGhlICJjb250cm9sIiBvciAiY29udGFpbmVyIiBmaWVsZCBpdHNlbGYuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVuZGVyZWQgRE9NIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRFbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIEZpZWxkIGlkLgogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGlzIGZpZWxkJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgcGFyZW50LgogICAgICAgICAqLwogICAgICAgIGdldFBhcmVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50IGluIHRoZSBncmFwaCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0aCB0byB0aGlzIGVsZW1lbnQKICAgICAgICAgKi8KICAgICAgICBnZXRQYXRoOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50IGF0IHRoZSBjdXJyZW50IGxldmVsIG9mIEpTT04gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldE5hbWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoaXMgZmllbGQgaXMgdG9wIGxldmVsLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBmaWVsZCBpcyB0aGUgdG9wIGxldmVsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVG9wTGV2ZWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzRW1wdHkodGhpcy5wYXJlbnQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdhbGtzIHVwIHRoZSBwYXJlbnQgY2hhaW4gYW5kIHJldHVybnMgdGhlIHRvcCBtb3N0IGNvbnRyb2wuICBJZiBubyBwYXJlbnRzLCB0aGVuIGN1cnJlbnQgY29udHJvbCBpcyB0b3AgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtDb250cm9sfSB0b3AgbW9zdCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgdG9wOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9wID0gdGhpczsKCiAgICAgICAgICAgIHdoaWxlICh0b3AucGFyZW50KSB7CiAgICAgICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdG9wOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIHZhbCA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0LgogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgLSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXkgbW9kZSBhbmQgbm90IGZpcnN0IHJlbmRlciwgdGhlbiBkbyBhIHJlZnJlc2ggaGVyZQogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgIXRoaXMuaW5pdGlhbGl6aW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50b3AgJiYgdGhpcy50b3AoKSAmJiB0aGlzLnRvcCgpLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSByZW5kZXJpbmcgdW5kZXIgYSB0b3AgbW9zdCBjb250cm9sIHRoYXQgaXNuJ3QgZmluaXNoZWQgaW5pdGlhbGl6aW5nLCB0aGVuIGRvbid0IHJlZnJlc2gKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB2YWx1ZSB0byBkZWZhdWx0LgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGZpZWxkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGZpZWxkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIHNldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yKSB7CiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVEZXNjcmlwdG9yID0gdGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZhbGlkYXRpb24gc3RhdGUgbWVzc2FnZXMgdG8gc2hvdyBmb3IgYSBnaXZlbiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBtZXNzYWdlcyBlaXRoZXIgYSBtZXNzYWdlIG9iamVjdCB7aWQsIG1lc3NhZ2V9IG9yIGFuIGFycmF5IG9mIG1lc3NhZ2Ugb2JqZWN0cwogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYmVmb3JlU3RhdHVzIFByZXZpb3VzIHZhbGlkYXRpb24gc3RhdHVzLgogICAgICAgICAqLwogICAgICAgIGRpc3BsYXlNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlcywgYmVmb3JlU3RhdHVzKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiBvYmplY3QsIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gW21lc3NhZ2VzXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgc3RyaW5nLCBjb252ZXJ0CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNTdHJpbmcobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFt7CiAgICAgICAgICAgICAgICAgICAgImlkIjogImN1c3RvbSIsCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlcwogICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgYWxwYWNhIG1lc3NhZ2VzIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLmNoaWxkcmVuKCIuYWxwYWNhLW1lc3NhZ2UiKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIG1heE1lc3NhZ2UKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcyAmJiBBbHBhY2EuaXNOdW1iZXIodGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKSAmJiB0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc2xpY2UoMCx0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlbW92ZU1lc3NhZ2VzIgogICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVtb3ZlTWVzc2FnZXMiKTsKCiAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIGFuZCBnZW5lcmF0ZSBpdAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgbWVzc2FnZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKG1lc3NhZ2VzLCBmdW5jdGlvbihpbmRleCwgbWVzc2FnZU9iamVjdCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG1lc3NhZ2UgdG8gdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJtZXNzYWdlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZUVsZW1lbnQgPSBBbHBhY2EudG1wbChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlT2JqZWN0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYWRkQ2xhc3MoImFscGFjYS1tZXNzYWdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZS1oaWRkZW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5hcHBlbmQobWVzc2FnZUVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJhZGRNZXNzYWdlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhZGRNZXNzYWdlIiwgaW5kZXgsIG1lc3NhZ2VPYmplY3QuaWQsIG1lc3NhZ2VPYmplY3QubWVzc2FnZSwgaGlkZGVuKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2VzIHRoZSB2YWxpZGF0aW9uIGZvciBhIGZpZWxkIHRvIGJlIHJlZnJlc2hlZCBvciByZWRyYXduIHRvIHRoZSBzY3JlZW4uCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0b2xkIHRvIGNoZWNrIGNoaWxkcmVuLCB0aGVuIGFsbCBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyIGZpZWxkIHdpbGwgYmUgcmVmcmVzaGVkIGFzIHdlbGwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZhbGlkYXRlQ2hpbGRyZW4gd2hldGhlciB0byByZWZyZXNoIHZhbGlkYXRpb24gZm9yIGNoaWxkcmVuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hlbiB2YWxpZGF0aW9uIGNvbXBsZXRlcwogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4sIGNiKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkNhbGwgcmVmcmVzaFZhbGlkYXRpb25TdGF0ZTogIiArIHRoaXMucGF0aCk7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBydW4gdmFsaWRhdGlvbiBjb250ZXh0IGNvbXBpbGF0aW9uIGZvciBvdXJzZWx2ZXMgYW5kIG9wdGlvbmFsbHkgYW55IGNoaWxkcmVuCiAgICAgICAgICAgIHZhciBjb250ZXh0cyA9IFtdOwogICAgICAgICAgICB2YXIgZnVuY3Rpb25zID0gW107CgogICAgICAgICAgICAvLyBjb25zdHJ1Y3RzIGFuIGFzeW5jIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZmllbGQKICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQnVpbGRlciA9IGZ1bmN0aW9uKGZpZWxkLCBjb250ZXh0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbiB0aGUgbmV4dCB0aWNrCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY29tcGlsZVZhbGlkYXRpb25Db250ZXh0KGZpZWxkLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcCB1cCBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gaW50byBhc3luYyBjYWxsYmFjayBtZXRob2RzCiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUNoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkZXB0aCBmaXJzdCBjcmF3bCBhY3Jvc3MgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICB2YXIgY3Jhd2wgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzVmFsaWRhdGlvblBhcnRpY2lwYW50KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaGFzIGNoaWxkcmVuLCBnbyBkZXB0aCBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bChmaWVsZC5jaGlsZHJlbltpXSwgY29udGV4dHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIoZmllbGQsIGNvbnRleHRzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNyYXdsKHRoaXMsIGNvbnRleHRzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIG91cnNlbHZlcyBpbiBsYXN0CiAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uQnVpbGRlcih0aGlzLCBjb250ZXh0cykpOwoKICAgICAgICAgICAgLy8gbm93IHJ1biBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiBwYXJhbGxlbAogICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwoZnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBjb250ZXh0cyBub3cgY29udGFpbnMgYWxsIG9mIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMKCiAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgY29udGV4dHMgaW50byBhIHNpbmdsZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICAgIHZhciBtZXJnZWRNYXAgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY29udGV4dHNbaV07CgogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGNvbnRleHQgaXMgYWxyZWFkeSBpbiBvcmRlciBbY2hpbGQsIHBhcmVudCwgLi4uXQoKICAgICAgICAgICAgICAgICAgICB2YXIgbUluZGV4ID0gbWVyZ2VkQ29udGV4dC5sZW5ndGg7CgogICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgZm9yd2FyZAogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udGV4dC5sZW5ndGg7IGorKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IGNvbnRleHRbal07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRNYXBbZW50cnkuaWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFkZCB0byBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbnRyeSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaWQgPSBlbnRyeS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnBhdGggPSBlbnRyeS5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuZG9tRWwgPSBlbnRyeS5kb21FbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmZpZWxkID0gZW50cnkuZmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS52YWxpZGF0ZWQgPSBlbnRyeS52YWxpZGF0ZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5pbnZhbGlkYXRlZCA9IGVudHJ5LmludmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWQgPSBlbnRyeS52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZENvbnRleHQuc3BsaWNlKG1JbmRleCwgMCwgbmV3RW50cnkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgaW4gbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRNYXBbbmV3RW50cnkuaWRdID0gbmV3RW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkudmFsaWRhdGVkICYmICFleGlzdGluZy5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWQgPSBlbnRyeS52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbm93IHJldmVyc2UgaXQgc28gdGhhdCBjb250ZXh0IGlzIG5vcm1hbGl6ZWQgd2l0aCBjaGlsZCBmaWVsZHMgZmlyc3QKICAgICAgICAgICAgICAgIG1lcmdlZENvbnRleHQucmV2ZXJzZSgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQoc2VsZi52aWV3LCBtZXJnZWRDb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoY2IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmlldyBhbmQgbG9jYWxlIGZyaWVuZGx5IHJldHJpZXZhbCBvZiBtZXNzYWdlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBrZXkKICAgICAgICAgKi8KICAgICAgICBnZXRNZXNzYWdlOiBmdW5jdGlvbihrZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldE1lc3NhZ2Uoa2V5LCB0aGlzLnZpZXcubG9jYWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgdGhpcyBmaWVsZCBhbmQgcmV0dXJucyB3aGV0aGVyIGl0IGlzIGluIGEgdmFsaWQgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gW0Jvb2xlYW5dIHZhbGlkYXRlQ2hpbGRyZW4gd2hldGhlciB0byBjaGlsZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsaWRhdGVDaGlsZHJlbikKICAgICAgICB7CiAgICAgICAgICAgIC8vIHNraXAgb3V0IGlmIHdlIGhhdmVuJ3QgeWV0IGJvdW5kIGFueSBkYXRhIGludG8gdGhpcyBjb250cm9sCiAgICAgICAgICAgIC8vIHRoZSBjb250cm9sIGNhbiBzdGlsbCBiZSBjb25zaWRlcmVkIHRvIGJlIGluaXRpYWxpemluZwogICAgICAgICAgICB2YXIgc3RhdHVzID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcgJiYgdGhpcy5vcHRpb25zLnZhbGlkYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWxpZGF0ZUNoaWxkcmVuLCB0aGVuIHdhbGsgcmVjdXJzaXZlbHkgZG93biBpbnRvIGNoaWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB2YWxpZGF0ZUNoaWxkcmVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC52YWxpZGF0ZSh2YWxpZGF0ZUNoaWxkcmVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBldmFsdWF0ZSBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuaGFuZGxlVmFsaWRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBzb21lIGRlYnVnZ2luZwogICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMgJiYgQWxwYWNhLmxvZ0xldmVsID09IEFscGFjYS5ERUJVRykgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gdGhpcy52YWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25bbWVzc2FnZUlkXVsic3RhdHVzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2godGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bIm1lc3NhZ2UiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVmFsaWRhdGlvbiBmYWlsdXJlIGZvciBmaWVsZCAoaWQ9IiArIHRoaXMuZ2V0SWQoKSArICIsIHBhdGg9IiArIHRoaXMucGF0aCArICIpLCBtZXNzYWdlczogIiArIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzbHlWYWxpZGF0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyB2YWxpZGF0aW9uLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVPcHRpb25hbCgpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RPcHRpb25hbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgibm90T3B0aW9uYWwiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGlzYWxsb3coKTsKICAgICAgICAgICAgdmFsSW5mb1siZGlzYWxsb3dWYWx1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgiZGlzYWxsb3dWYWx1ZSIpLCBbdGhpcy5zY2hlbWFbImRpc2FsbG93Il0uam9pbignLCAnKV0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIHZhbEluZm9bIm5vdE9wdGlvbmFsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHVzaW5nIHVzZXIgcHJvdmlkZWQgdmFsaWRhdG9yLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbGlkYXRvciAmJiBBbHBhY2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmFsaWRhdG9yKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRvci5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbEluZm8pIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHN0b3JlIGluICJjdXN0b20iCiAgICAgICAgICAgICAgICAgICAgX3RoaXMudmFsaWRhdGlvblsiY3VzdG9tIl0gPSB2YWxJbmZvOwoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgcmVxdWlyZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gRmFsc2UgaWYgdGhpcyBmaWVsZCB2YWx1ZSBpcyBlbXB0eSBidXQgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU9wdGlvbmFsOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSAmJiB0aGlzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzICYmIEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMud2hpdGVzcGFjZSwgdGhpcy5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpZWxkIHZhbHVlIGlzIGFsbG93ZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZpZWxkIHZhbHVlIGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEaXNhbGxvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5zY2hlbWEuZGlzYWxsb3cpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGRpc2FsbG93ID0gdGhpcy5zY2hlbWEuZGlzYWxsb3c7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoZGlzYWxsb3cpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQWxsb3dlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRpc2FsbG93LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChBbHBhY2EuaXNPYmplY3QodmFsKSB8fCAoQWxwYWNhLmlzQXJyYXkodmFsKSkgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQWxwYWNhLnBhcnNlSlNPTih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FsbG93ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0FsbG93ZWQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyhkaXNhbGxvdykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ID0gQWxwYWNhLnBhcnNlSlNPTihkaXNhbGxvdyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmNvbXBhcmVPYmplY3QodmFsLCBkaXNhbGxvdyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFueSBldmVudCBoYW5kbGVycyB0aGF0IGxpc3RlbnMgdG8gdGhlIHVwZGF0ZSBldmVudCBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQEVYVEVOU0lPTl9QT0lOVAogICAgICAgICAqCiAgICAgICAgICogRGlzYWJsZXMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkCiAgICAgICAgICovCiAgICAgICAgaXNEaXNhYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBlbmFibGVkCiAgICAgICAgICovCiAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZCgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBjb250cm9sIGZvY3VzZWQgdXBvbi4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCgogICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2VzIGFueSBldmVudCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGlzIGZpZWxkIGZyb20gdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIHJlbW92ZSBvYnNlcnZhYmxlCiAgICAgICAgICAgIEFscGFjYS5vYnNlcnZhYmxlKHRoaXMucGF0aCkuY2xlYXIoKTsKCiAgICAgICAgICAgIC8vIGNsZWFuIHVwIEFscGFjYS5maWVsZEluc3RhbmNlcyBzdGF0aWMgcmVmZXJlbmNlICh1c2VkIGZvciBjb252ZW5pZW5jZSBhY2Nlc3MgdG8gcHJldmlvdXMgcmVuZGVyZWQgZmllbGRzKQogICAgICAgICAgICBpZiAoQWxwYWNhICYmIEFscGFjYS5maWVsZEluc3RhbmNlcykgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5maWVsZEluc3RhbmNlc1t0aGlzLmdldElkKCldKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEFscGFjYS5maWVsZEluc3RhbmNlc1t0aGlzLmdldElkKCldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBET00KICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTaG93cyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgc2hvdzogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaGlkZGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaGlkZGVuIG9wdGlvbiBpcyBvbiwgd2UncmUgYWx3YXlzIGhpZGRlbgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgZmllbGQKICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuY3NzKHsKICAgICAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICIiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLm9uU2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAic2hvdyIKICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKCJzaG93Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvblNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhpZGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBoaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMub25IaWRlKCk7CgogICAgICAgICAgICAvLyBDQUxMQkFDSzogImhpZGUiCiAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKCJoaWRlIik7CiAgICAgICAgfSwKCiAgICAgICAgb25IaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBpc1ZhbGlkYXRpb25QYXJ0aWNpcGFudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTaG93bigpOwogICAgICAgIH0sCgogICAgICAgIGlzU2hvd246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Zpc2libGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTsKICAgICAgICB9LAoKICAgICAgICBpc0hpZGRlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoIm5vbmUiID09PSAkKHRoaXMuZmllbGQpLmNzcygiZGlzcGxheSIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmludHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHByaW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5wcmludEFyZWEoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBmaWVsZCBpcyBiZWluZyByZXZlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIHNob3duLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW50UmV2ZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgY29uY2VhbGVkIGFzIHRoZSByZXN1bHQgb2YgYSBkZXBlbmRlbmN5IG9yIGNvbmRpdGlvbmFsIGNhbGN1bGF0aW9uCiAgICAgICAgICogdGhhdCBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW50Q29uY2VhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVsb2FkcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuY2FsbGJhY2spKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMsIHRoaXMucmVuZGVyZWRDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcih0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmaWVsZCBhbmQgcmVzZXRzIHRoZSBmaWVsZCB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoaXMgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKGNoZWNrQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICBpZiAoY2hlY2tDaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5pc1ZhbGlkKGNoZWNrQ2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkLmlzRW1wdHlPYmplY3QodGhpcy52YWxpZGF0aW9uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YWxpZGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25ba2V5XS5zdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgZXZlbnQgaGFuZGxpbmcuCiAgICAgICAgICovCiAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU92ZXIuY2FsbChfdGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlcigibW91c2VvdmVyIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm1vdXNlb3V0KGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk1vdXNlT3V0LmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3V0IiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCAtIHNwZWNpZnkgZXZlbnRzIHZpYSBvcHRpb25zLm9uRmllbGQ8RmllbGROYW1lPiA9IGZuCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5vcHRpb25zLCBmdW5jdGlvbihrZXksIGZ1bmMpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5zdGFydHNXaXRoKGtleSwnb25GaWVsZCcpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0ga2V5LnN1YnN0cmluZyg3KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWVsZC5vbihldmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmdXR1cmUgc3VwcG9ydCAtIHNwZWNpZnkgZXZlbnRzIHZpYSBvcHRpb25zLmV2ZW50cy48ZXZlbnROYW1lPiA9IGZuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5ldmVudHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsIGZ1bmN0aW9uKGV2ZW50LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PT0gInJlbmRlciIgfHwgZXZlbnQgPT09ICJyZWFkeSIgfHwgZXZlbnQgPT09ICJibHVyIiB8fCBldmVudCA9PT0gImZvY3VzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbihldmVudCwgZnVuY3Rpb24oZSwgYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmNhbGwoX3RoaXMsIGUsIGEsIGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWVsZC5vbihldmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmNhbGwoX3RoaXMsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBmaWVsZCByZWNlaXZlcyBmb2N1cy4KICAgICAgICAgKgogICAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZSBlbnRpcmUgZmllbGQgdG8gaGlnaGxpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgZG9tIGV2ZW50CiAgICAgICAgICovCiAgICAgICAgb25Gb2N1czogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZW1wdHkiKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgbG9zZXMgZm9jdXMgKGJsdXJzKS4KICAgICAgICAgKgogICAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZSBlbnRpcmUgZmllbGQgdG8gdW4taGlnaGxpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgZG9tIGV2ZW50CiAgICAgICAgICovCiAgICAgICAgb25CbHVyOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgd2FzRm9jdXNlZCA9ICQodGhpcy5maWVsZCkuaGFzQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBVSSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgIGlmICh3YXNGb2N1c2VkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRibHVyIgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnRyaWdnZXIoImZpZWxkYmx1ciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBmaWVsZCdzIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVwZGF0ZSB0aGUgY29udHJvbCdzIHZhbHVlIGFuZCBub3RpZnkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZSBFdmVudC4KICAgICAgICAgKi8KICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGludG8gZGF0YSBlbGVtZW50CiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiZWFjayBmb3Igd2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciBhIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUKICAgICAgICAgKi8KICAgICAgICBvbk1vdXNlT3ZlcjogZnVuY3Rpb24oZSkgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgbW91c2UgbW92ZXMgb3V0IG9mIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU91dDogZnVuY3Rpb24oZSkgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBhIGZpZWxkIGNvbnRyb2wgYnkgaXRzIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBGaWVsZCBjb250cm9sIHBhdGguCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgY29udHJvbCBtYXBwZWQgdG8gdGhlIHBhdGguCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbEJ5UGF0aDogZnVuY3Rpb24ocGF0aCkgewoKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7CgogICAgICAgICAgICBpZiAocGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3RyaXAgb2ZmIHRoZSBsZWFkaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZigiLyIpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgIi8iIGlmIGl0IGlzIHRoZXJlCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmVuZHNXaXRoKHBhdGgsICIvIikpIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHBhdGhBcnJheSA9IHBhdGguc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXRoRWxlbWVudCA9IHBhdGhBcnJheVtpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIF9uYW1lID0gcGF0aEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9pbmRleCA9IC0xOwoKICAgICAgICAgICAgICAgICAgICB2YXIgejEgPSBwYXRoRWxlbWVudC5pbmRleE9mKCJbIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHoxID49IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgejIgPSBwYXRoRWxlbWVudC5pbmRleE9mKCJdIiwgejEgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHoyID49IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbmRleCA9IHBhcnNlSW50KHBhdGhFbGVtZW50LnN1YnN0cmluZyh6MSArIDEsIHoyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IHBhdGhFbGVtZW50LnN1YnN0cmluZygwLCB6MSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkW19uYW1lXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5kZXggPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRyZW5bX2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBBbHBhY2EgY29udHJvbHMgYnkgdGhlaXIgQWxwYWNhIGZpZWxkIHR5cGUgKGkuZS4gInRleHQiLCAiY2hlY2tib3giLCAiY2tlZGl0b3IiKQogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWVsZFR5cGUKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbHNCeUZpZWxkVHlwZTogZnVuY3Rpb24oZmllbGRUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChmaWVsZFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24ocGFyZW50LCBmaWVsZFR5cGUsIGFycmF5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbltpXS5nZXRGaWVsZFR5cGUoKSA9PT0gZmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhcmVudC5jaGlsZHJlbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZihwYXJlbnQuY2hpbGRyZW5baV0sIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYodGhpcywgZmllbGRUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIHNjaGVtYSB0eXBlIChpLmUuICJzdHJpbmciLCAibnVtYmVyIikuCiAgICAgICAgICogVGhpcyBkb2VzIGEgZGVlcCB0cmF2ZXJzYWwgYWNyb3NzIHRoZSBncmFwaCBvZiBBbHBhY2EgZmllbGQgaW5zdGFuY2VzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHNjaGVtYVR5cGUKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbHNCeVNjaGVtYVR5cGU6IGZ1bmN0aW9uKHNjaGVtYVR5cGUpIHsKCiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwoKICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24ocGFyZW50LCBzY2hlbWFUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0VHlwZSgpID09PSBzY2hlbWFUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhcmVudC5jaGlsZHJlbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZihwYXJlbnQuY2hpbGRyZW5baV0sIHNjaGVtYVR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIHNjaGVtYVR5cGUsIGFycmF5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIH0sCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIE9CU0VSVkFCTEVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc3Vic2NyaWJlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS51bnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5vYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGNsZWFyT2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCgogICAgICAgIC8vIFV0aWxpdHkgRnVuY3Rpb25zIGZvciBGb3JtIEJ1aWxkZXIKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBzY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gU2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmVxdWlyZWQKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGNvbnRyb2wgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB0eXBlIG9mIHRoZSBiYXNlIGNsYXNzIChvciBudWxsIGlmIG5vbmUpCiAgICAgICAgICovCiAgICAgICAgZ2V0QmFzZUZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VGaWVsZFR5cGUgPSBudWxsOwoKICAgICAgICAgICAgdmFyIHggPSB0aGlzLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgaWYgKHggJiYgeC5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJhc2VGaWVsZFR5cGUgPSB4LmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZUZpZWxkVHlwZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIG9mIG90aGVyIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0IGlzIGEgY29udGFpbmVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IGZpZWxkIGlzIHJlcXVpcmVkLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWVsZCBjYW4gYmUgc3BlY2lmaWVkIGFzIHJlcXVpcmVkIGJ5IGVpdGhlciBzcGVjaWZ5aW5nIHJlcXVpcmVkOiB0cnVlIG9uIHRoZSBzY2hlbWEgZm9yIGEgZmllbGQgb3IgYnkKICAgICAgICAgKiBzcGVjaWZ5aW5nIGEgcmVxdWlyZWQgYXJyYXkgb24gdGhlIHBhcmVudCBvYmplY3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgZmllbGQgKGFzIHBlciBqc29uIHNjaGVtYSB2IDA0KS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufQogICAgICAgICAqLwogICAgICAgIGlzUmVxdWlyZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGFzc3VtZSBub3QgcmVxdWlyZWQKICAgICAgICAgICAgdmFyIHJlcXVpcmVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hLnJlcXVpcmVkKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRoaXMuc2NoZW1hLnJlcXVpcmVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBqc29uLXNjaGVtYSBkcmFmdCAwNAogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuc2NoZW1hLnJlcXVpcmVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpcy5wYXJlbnQuc2NoZW1hLnJlcXVpcmVkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVxdWlyZWRBcnJheSA9IHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRBcnJheSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXlbaV0gPT09IHRoaXMucHJvcGVydHlJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB0aXRsZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHRpdGxlLgogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIGRlc2NyaXB0aW9uLgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBKU09OIHNjaGVtYSBvZiB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBKU09OIHNjaGVtYSBvZiB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mU2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIGlzIHJlYWQtb25seS4gIEEgcmVhZC1vbmx5IGZpZWxkIGNhbm5vdCBoYXZlIGl0J3MgdmFsdWUgY2hhbmdlZC4gIFJlYWQtb25seSBmaWVsZHMgcmVuZGVyIGluIGEgZ3JheWVkLW91dCBvciBkaXNhYmxlZCBjb250cm9sLiAgSWYgdGhlIGZpZWxkIGlzIHJlbmRlcmVkIHVzaW5nIGEgdmlldyB3aXRoIHRoZSA8Y29kZT5kaXNwbGF5UmVhZG9ubHk8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gZmFsc2UsIHRoZSByZWFkLW9ubHkgZmllbGQgd2lsbCBub3QgYXBwZWFyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQncyB2YWx1ZSBpcyByZXF1aXJlZC4gIElmIHNldCB0byB0cnVlLCB0aGUgZmllbGQgbXVzdCB0YWtlIG9uIGEgdmFsaWQgdmFsdWUgYW5kIGNhbm5ub3QgYmUgbGVmdCBlbXB0eSBvciB1bmFzc2lnbmVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlZmF1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgYXNzaWduZWQgZm9yIHRoaXMgcHJvcGVydHkuICBJZiB0aGUgZGF0YSBmb3IgdGhlIGZpZWxkIGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZCwgdGhpcyBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcGx1Z2dlZCBpbiBmb3IgeW91LiAgU3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgd2hlbiB5b3Ugd2FudCB0byBwcmUtcG9wdWxhdGUgdGhlIGZpZWxkJ3MgdmFsdWUgYWhlYWQgb2YgdGltZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0YSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgZm9ybWF0IG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3ciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvd2VkIFZhbHVlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGRpc2FsbG93ZWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVwZW5kZW5jaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgcHJvcGVydHkgZGVwZW5kZW5jaWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VHlwZSAmJiAhQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRUeXBlKCkpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFPZlNjaGVtYS5wcm9wZXJ0aWVzLnR5cGVbJ2RlZmF1bHQnXSA9IHRoaXMuZ2V0VHlwZSgpOwogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydlbnVtJ10gPSBbdGhpcy5nZXRUeXBlKCldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzY2hlbWFPZlNjaGVtYTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFscGFjYSBvcHRpb25zIGZvciB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2hvcnQgZGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRldGFpbGVkIGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgd2lsbCBiZSByZWFkIG9ubHkgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIlRoaXMgZmllbGQgaXMgcmVhZC1vbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBzZXQgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRlZmF1bHQgdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0YXJlYSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRhdGEgdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijoga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkRpc2FsbG93ZWQgdmFsdWVzIGZvciB0aGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbUxhYmVsIjoiVmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgRGVwZW5kZW5jaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSI6MywKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbiAoZmllbGQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQgJiYgZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wYXJlbnQuY2hpbGRyZW5CeVByb3BlcnR5SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50LnByb3BlcnR5SWQpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbnMgZm9yICIgKyB0aGlzLmdldFRpdGxlKCksCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB0aGlzLmdldERlc2NyaXB0aW9uKCkgKyAiIChPcHRpb25zKSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm0iOnt9LAogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIElkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVuaXF1ZSBmaWVsZCBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB0eXBlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5nZXRGaWVsZFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dNZXNzYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNob3cgTWVzc2FnZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGlzcGxheSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWJsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSBkaXNhYmxlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZWFkb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB3aWxsIGJlIHJlYWRvbmx5IGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSBoaWRkZW4gaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgbGFiZWwuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhlbHBlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBoZWxwIG1lc3NhZ2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIGZpZWxkIGhlbHAgbWVzc2FnZXMuICBFYWNoIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgb24gaXQncyBvd24gbGluZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZpZWxkQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDU1MgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIG9uZSBvciBtb3JlIENTUyBjbGFzc2VzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGRvbSBlbGVtZW50IGZvciB0aGlzIGZpZWxkIG9uY2UgaXQgaXMgcmVuZGVyZWQuICBTdXBwb3J0cyBhIHNpbmdsZSB2YWx1ZSwgY29tbWEtZGVsaW1pdGVkIHZhbHVlcywgc3BhY2UtZGVsaW1pdGVkIHZhbHVlcyBvciB2YWx1ZXMgcGFzc2VkIGluIGFzIGFuIGFycmF5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlSW5pdFZhbGlkYXRpb25FcnJvciIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIEluaXRpYWwgVmFsaWRhdGlvbiBFcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iIDogIkhpZGUgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9jdXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb2N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgaW5pdGlhbCBmb2N1cyBmb3IgdGhlIGZvcm0gd2lsbCBiZSBzZXQgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgKHVzdWFsbHkgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBmb3JtKS4gIElmIGEgZmllbGQgbmFtZSBvciBwYXRoIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBzcGVjaWZpZWQgY2hpbGQgZmllbGQgd2lsbCByZWNlaXZlIGZvY3VzLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBzZXQgZm9jdXMgdG8gJ25hbWUnIChzZWxlY3RpbmcgdGhlICduYW1lJyBmaWVsZCkgb3IgeW91IG1pZ2h0IHNldCBpdCB0byAnY2xpZW50L25hbWUnIHdoaWNoIHBpY2tzIHRoZSAnbmFtZScgZmllbGQgb24gdGhlICdjbGllbnQnIG9iamVjdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWUgTGFiZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIHN0cmluZyBsYWJlbHMgZm9yIGl0ZW1zIGluIHRoZSBlbnVtIGFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk92ZXJyaWRlIG9mIHRoZSB2aWV3IGZvciB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3IgdGhpcyBmaWVsZCB0byBiZSByZW5kZXJlZCB3aXRoIGEgZGlmZmVyZW50IHZpZXcgKHN1Y2ggYXMgJ2Rpc3BsYXknIG9yICdjcmVhdGUnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewoKICAgICAgICAgICAgICAgIHNjaGVtYU9mT3B0aW9ucy5wcm9wZXJ0aWVzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIGZvciByZW5kZXJpbmcgdGhlIEZPUk0gdGFnLiIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybSBBdHRyaWJ1dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIklkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVuaXF1ZSBmb3JtIGlkLiBBdXRvLWdlbmVyYXRlZCBpZiBub3QgcHJvdmlkZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gZW5kcG9pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZvcm0gc3VibWlzc2lvbiBtZXRob2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwb3N0IiwiZ2V0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydWJ5cmFpbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSdWJ5IE9uIFJhaWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJ1Ynkgb24gUmFpbHMgTmFtZSBTdGFuZGFyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJ0cnVlIiwgImZhbHNlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb2N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb2N1cyBTZXR0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImJ1dHRvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybSBCdXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb25maWd1cmF0aW9uIGZvciBmb3JtLWJvdW5kIGJ1dHRvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWJtaXQgQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlc2V0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb2dnbGUgU3VibWl0IFZhbGlkIFN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUb2dnbGUgdGhlIHZhbGlkaXR5IHN0YXRlIG9mIHRoZSBTdWJtaXQgYnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZPcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgQWxwYWNhIG9wdGlvbnMgZm9yIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnNGb3JPcHRpb25zID0gewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsaWRhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkVuZm9yY2UgdmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dNZXNzYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiJTaG93IHZhbGlkYXRpb24gbWVzc2FnZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiJEaXNhYmxlIHRoaXMgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGlzIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGVscGVycyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0YXJlYSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZpZWxkQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkF1dG8tZm9jdXMgZmlyc3QgY2hpbGQgZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3BMZXZlbCgpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zRm9yT3B0aW9ucy5maWVsZHMuZm9ybSA9IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRob2QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvcHRpb25zRm9yT3B0aW9uczsKICAgICAgICB9CiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gUmVnaXN0ZXJzIGFkZGl0aW9uYWwgbWVzc2FnZXMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gYXJlIGRpc2FsbG93ZWQgdmFsdWVzLiIsCiAgICAgICAgIm5vdE9wdGlvbmFsIjogIlRoaXMgZmllbGQgaXMgbm90IG9wdGlvbmFsLiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250cm9sRmllbGQgPSBBbHBhY2EuRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udHJvbEZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHNpZ25hbCB0aGF0IHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25Db25zdHJ1Y3Q6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB0aGlzLmlzQ29udHJvbEZpZWxkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyBoZWxwZXIgbWV0aG9kIGZvciBnZXR0aW5nIHZhbCgpIGZyb20gdGhlIGNvbnRyb2wKICAgICAgICAgICAgICAgIC8vIGhhbmRsZXMgY29udmVyc2lvbiB0byB0aGUgY29ycmVjdCBzY2FsYXIgdHlwZQogICAgICAgICAgICAgICAgdGhpcy5fZ2V0Q29udHJvbFZhbCA9IGZ1bmN0aW9uKGVuc3VyZVByb3BlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICQodGhpcy5jb250cm9sKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVQcm9wZXJUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfdGhpcy5lbnN1cmVQcm9wZXJUeXBlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xUZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250cm9sVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2xUZW1wbGF0ZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250cm9sOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGNvbnRyb2xUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgICAgIC8vIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVuZGVyQnV0dG9ucyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udmFsdWUgPSB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnN0eWxlcyA9IHRoaXMudmlldy5zdHlsZXMuYnV0dG9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZ2V0Q29udHJvbEVsOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICByZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICAgICAgdmFyIGZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udHJvbC0iICsgYi5nZXRGaWVsZFR5cGUoKSwgc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHlwZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uU2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewoKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGlzQXV0b0ZvY3VzYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRyb2wiIHRlbXBsYXRlIGFzIHRoZSBwcmltYXJ5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRyb2wiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFkZCBhICJjb250cm9sIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJGaWVsZEVsZW1lbnRzOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIG91ciBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sID0gJCh0aGlzLmZpZWxkKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVtb3ZlQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UUk9MX0ZJRUxEKTsKCiAgICAgICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgICAgIHNlbGYucHJlcGFyZUNvbnRyb2xNb2RlbChmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oY29udHJvbEZpZWxkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wucmVwbGFjZVdpdGgoY29udHJvbEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSBjb250cm9sRmllbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVFJPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250cm9sIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImNvbnRyb2wiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyUmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUHJlcGFyZXMgdGhlIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24obW9kZWwpCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IHt9OwogICAgICAgICAgICAgICAgbW9kZWwuaWQgPSB0aGlzLmdldElkKCk7CiAgICAgICAgICAgICAgICBtb2RlbC5uYW1lID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnNjaGVtYSA9IHRoaXMuc2NoZW1hOwogICAgICAgICAgICAgICAgbW9kZWwuZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgICAgICAgICAgIG1vZGVsLnJlcXVpcmVkID0gdGhpcy5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICBtb2RlbC52aWV3ID0gdGhpcy52aWV3OwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYmVmb3JlUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgcmVuZGVyZWQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZihzZWxmLmRhdGEpID09ICJ1bmRlZmluZWQiKSB8fCBzZWxmLmRhdGEgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBoYW5kbGUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdFVwZGF0ZU9ic2VydmFibGVGaXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtY29udHJvbC1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJidXR0b24tcHVzaGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBjbGljayBoYW5kbGVyPwogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEta2V5Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25Db25maWcgPSBzZWxmLm9wdGlvbnMuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oY29udHJvbCwgaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKGNvbnRyb2wsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFJlbmRlcnMgdGhlIGNvbnRyb2wgaW50byB0aGUgZmllbGQgY29udGFpbmVyLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNvbnRyb2wgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRyb2xEZXNjcmlwdG9yLCBtb2RlbCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soY29udHJvbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZSB0byB0aGUgbGFiZWwKICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRGl2ID0gJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCIpOwogICAgICAgICAgICAgICAgIHZhciBsYWJlbERpdiA9ICQoJy5hbHBhY2EtY29udHJvbGZpZWxkLWxhYmVsJywgdGhpcy5vdXRlckVsKTsKICAgICAgICAgICAgICAgICBpZiAobGFiZWxEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9IGxhYmVsRGl2OwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgdmFyIGhlbHBlckRpdiA9ICQoJy5hbHBhY2EtY29udHJvbGZpZWxkLWhlbHBlcicsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGhlbHBlckRpdi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICB0aGlzLmhlbHBlckRpdiA9IGhlbHBlckRpdjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSAibmFtZSIgcHJvcGVydHkgb24gdGhlIGNvbnRyb2wgaXMga2VwdCBpbiBzeW5jLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG5hbWUgZmllbGQKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5hdHRyKCJuYW1lIiwgdGhpcy5nZXROYW1lKCkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldERlZmF1bHQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldERlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGRlZmF1bHREYXRhID0gQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbJ2RlZmF1bHQnXSkgPyAiIiA6IHRoaXMuc2NoZW1hWydkZWZhdWx0J107CiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKGRlZmF1bHREYXRhKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5nZXRDb250cm9sVmFsdWUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGNvcnJlY3Rpb24gZm9yIHR5cGUKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lbnN1cmVQcm9wZXJUeXBlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIHZhbHVlLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBWYWxpZGF0ZSBhZ2FpbnN0IGVudW0gcHJvcGVydHkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBlbGVtZW50IHZhbHVlIGlzIHBhcnQgb2YgdGhlIGVudW0gbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0RW51bSgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCgpICYmIEFscGFjYS5pc1ZhbEVtcHR5KHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5nZXRFbnVtKCksIHZhbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRW51bSgpOwoKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdmFsdWVzIHByZXNlbnRlZCB0byB0aGUgdXNlciBpbiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZS4gSWYgdGhlcmUgYXJlIG9wdGlvbkxhYmVscywgdXNlIHRoZW0gaW4KICAgICAgICAgICAgICAgIC8vIHByZWZlcmVuY2UgdG8gdGhlIHJhdyBlbnVtIHZhbHVlcy4KICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVmFsdWVzID0gdGhpcy5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAvLyB1c2Ugb3B0aW9uIGxhYmVscyBpZiB0aG9zZSBhcmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTGFiZWxzID0gdGhpcy5nZXRPcHRpb25MYWJlbHMoKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMgJiYgb3B0aW9uTGFiZWxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVmFsdWVzID0gb3B0aW9uTGFiZWxzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRWYWx1ZU9mRW51bSJdID0gewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWRWYWx1ZU9mRW51bSIpLCBbbWVzc2FnZVZhbHVlcy5qb2luKCcsICcpLCB0aGlzLmdldFZhbHVlKCldKSwKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bImludmFsaWRWYWx1ZU9mRW51bSJdWyJzdGF0dXMiXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpbml0RXZlbnRzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW5pdENvbnRyb2xFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gdGhpcy5jb250cm9sOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2xpY2siLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgY29udHJvbCBsZXZlbCBoYW5kbGVycyBmb3IgdGhpbmdzIHRoYXQgaGFwcGVuIHRvIGlucHV0IGVsZW1lbnQKICAgICAgICAgICAgICAgIGNvbnRyb2wuY2hhbmdlKGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIHRvIHJ1biBBRlRFUiBjb250cm9sIGNsaWNrIGhhbmRsZXJzCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmZvY3VzKGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXNGb2N1c2VkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wuYmx1cihmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzQmx1cnJlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uQmx1ci5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXlwcmVzcyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5UHJlc3MuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXl1cChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYub25LZXlEb3duLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgcHJlc3MgZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciByZWZyZXNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gZWRpdCBtb2RlCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgJiYgc2VsZi52aWV3LnR5cGUgPT09ICdlZGl0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgY3VycmVudGx5IGludmFsaWQsIHRoZW4gd2UgcHJvdmlkZSBlYXJseSBmZWVkYmFjayB0byB0aGUgdXNlciBhcyB0byB3aGVuIHRoZXkgZW50ZXIKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgd2FzIHZhbGlkLCB3ZSBkb24ndCByZW5kZXIgaW52YWxpZGF0aW9uIGZlZWRiYWNrIHVudGlsIHRoZXkgYmx1ciB0aGUgZmllbGQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHRoZSBjb250cm9sIHZhbGlkIHByZXZpb3VzbHk/CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnY3JlYXRlJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd2FzVmFsaWQgPSB0aGlzLmlzVmFsaWQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc1ZhbGlkICYmIHNlbGYud2FzQmx1cnJlZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGJlY2F1c2UgYXQgdGhpcyBleGFjdCBtb21lbnQsIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpcyBzdGlsbCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgLy8galF1ZXJ5IHJhaXNlcyB0aGUga2V5cHJlc3MgZXZlbnQgYWhlYWQgb2YgdGhlIGlucHV0IHJlY2VpdmluZyB0aGUgbmV3IGRhdGEgd2hpY2ggd291bGQgaW5jb3Jwb3JhdGUKICAgICAgICAgICAgICAgICAgICAvLyB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGltZW91dCBwcm92aWRlcyB0aGUgYnJvd3NlciB3aXRoIGVub3VnaCB0aW1lIHRvIHBsdWcgdGhlIHZhbHVlIGludG8gdGhlIGlucHV0IGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aGUgdmFsaWRhdGlvbiBsb2dpYyB1c2VzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb250cm9sIGlzIG5vdyBpbiBhIHZhbGlkIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgZG93biBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleWRvd24gZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHVwIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5dXAgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIYW5kbGVyIGZvciBjbGljayBldmVudC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgQ2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzRGlzYWJsZWQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gdGhlIGVudW0gdmFsdWUgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXRzIHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge2FycmF5fSBlbnVtQXJyYXkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldEVudW06IGZ1bmN0aW9uKGVudW1BcnJheSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLnNhZmVTZXRPYmplY3RBcnJheSh0aGlzLnNjaGVtYSwgImVudW0iLCBlbnVtQXJyYXkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gdGhlIG9wdGlvbiBsYWJlbHMgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1sib3B0aW9uTGFiZWxzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXRzIHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gb3B0aW9uTGFiZWxzQXJyYXkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldE9wdGlvbkxhYmVsczogZnVuY3Rpb24ob3B0aW9uTGFiZWxzQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5vcHRpb25zLCAib3B0aW9uTGFiZWxzIiwgb3B0aW9uTGFiZWxzQXJyYXkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFNvcnRzIHRoZSBnaXZlbiBlbnVtZXJhdGVkIHZhbHVlcyB1c2luZyB0aGUgbG9jYWwgc29ydFNlbGVjdGFibGVPcHRpb25zIG1ldGhvZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNvcnRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gdGhpcy5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyAmJiBlbnVtVmFsdWVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RhYmxlT3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudW1WYWx1ZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gZW51bVZhbHVlc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMgJiYgb3B0aW9uTGFiZWxzLmxlbmd0aCA+PSBpICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZU9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdGV4dAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRTZWxlY3RhYmxlT3B0aW9ucyhzZWxlY3RhYmxlT3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyBzZXQgYmFjawogICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbnVtVmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0YWJsZU9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnVtVmFsdWVzLnB1c2goc2VsZWN0YWJsZU9wdGlvbnNbaV0udmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG9wdGlvbkxhYmVscykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wdGlvbkxhYmVscy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVudW0obmV3RW51bVZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25MYWJlbHMobmV3T3B0aW9uTGFiZWxzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyBhIHNlbGVjdCBvcHRpb25zIGFycmF5IGJ5IG9yZGVyIG9mIGRpc3BsYXlhYmxlIHRleHQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIElmIHlvdSdyZSBsb29raW5nIHRvIHByb3ZpZGUgYSBjdXN0b20gc29ydCBvcmRlciwgeW91IG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25zLnNvcnQgZnVuY3Rpb24gLSBmbihhLCBiKS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdGFibGVPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0U2VsZWN0YWJsZU9wdGlvbnM6IGZ1bmN0aW9uKHNlbGVjdGFibGVPcHRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gaWYgc29ydCBpcyBmYWxzZSwganVzdCByZXR1cm4KICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBhIGRlZmF1bHQgc29ydCBmdW5jdGlvbgogICAgICAgICAgICAgICAgdmFyIHNvcnRGbiA9IEFscGFjYS5kZWZhdWx0U29ydDsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGUgYSBjdXN0b20gc29ydCBmdW5jdGlvbiwgdXNlIHRoYXQgaW5zdGVhZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc29ydCkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZuID0gc2VsZi5vcHRpb25zLnNvcnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNvcnQgaXQKICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnNvcnQoc29ydEZuKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGEgZGF0YXNvdXJjZSBjb25maWd1cmVkIGZvciB0aGlzIGNvbnRyb2wuICBUaGUgcmVzdWx0cyBhcmUgd3JpdHRlbiBpbnRvIHRoZQogICAgICAgICAgICAgKiBnaXZlbiBhcnJheSBhbmQgdGhlIG9uRmluaXNoIG1ldGhvZCBpcyB0aGVuIGNhbGxlZCB3aXRoIChlcnIsIGFycmF5KS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICAgICAgICAqIEBwYXJhbSBvbkZpbmlzaAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW52b2tlRGF0YVNvdXJjZTogZnVuY3Rpb24oYXJyYXksIG1vZGVsLCBvbkZpbmlzaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkZpbmlzaChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlckxvYWREYXRhU291cmNlT3B0aW9ucyhhcnJheSwgbW9kZWwsIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkZpbmlzaChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBzb3J0aW5nIHRvIHdoYXRldmVyIHdlIHByb2R1Y2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoYXJyYXkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5pc2gobnVsbCwgYXJyYXkpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LmJpbmQoc2VsZik7CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1trXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1VyaShzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsZSA9IHNlbGYudmlldy5sb2NhbGU7CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAiIiArIHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICgodXJsLmluZGV4T2YoIj8iKSA9PT0gLTEpID8gIj8iIDogIiYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICJsb2NhbGU9IiArIGxvY2FsZTsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb25Eb2N1bWVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IGpzb25Eb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lciAmJiBBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHMgPSBzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lcihkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG9iamVjdHMsIHdlIHdhbGsgdGhyb3VnaCBvbmUga2V5IGF0IGEgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zZXJ0aW9uIG9yZGVyIGlzIHRoZSBvcmRlciBvZiB0aGUga2V5cyBmcm9tIHRoZSBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcHJlc2VydmUgb3JkZXIsIGNvbnNpZGVyIHVzaW5nIGFuIGFycmF5IGFzIGJlbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChkcywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShkcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXJyYXlzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGluZGV4IGF0IGEgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zZXJ0aW9uIG9yZGVyIGlzIGRpY3RhdGVkIGJ5IHRoZSBvcmRlciBvZiB0aGUgaW5kaWNlcyBpbnRvIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHByZXNlcnZlcyBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2YWx1ZS50ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiJVbmFibGUgdG8gbG9hZCBkYXRhIGZyb20gdXJpIDogIiArIHNlbGYub3B0aW9ucy5kYXRhU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBU09VUkNFX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianFYSFIiIDoganFYSFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclRocm93biIgOiBlcnJvclRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRzID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGRzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogZHNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogZHNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZHNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3IgPSBzZWxmLmNvbm5lY3RvcjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29ubmVjdG9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RvcklkID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29ubmVjdG9yLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbm5lY3RvckNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQsIGNvbm5lY3RvckNvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB1c2luZyBjb25uZWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLmxvYWREYXRhU291cmNlKGNvbmZpZywgZnVuY3Rpb24odmFsdWVzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZXNbaV0pID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2YWx1ZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBzdGFuZGFyZCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZVtrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnM6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGFycmF5KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICAgICAsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2Ygc3BlY2lmaWMgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbUxhYmVsIjoiVmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIE5hbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInNvcnQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU29ydCBGdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmaW5lcyBhbiBmKGEsYikgc29ydCBmdW5jdGlvbiBmb3IgdGhlIGFycmF5IG9mIGVudW1lcmF0ZWQgdmFsdWVzIFt7dGV4dCwgdmFsdWV9XS4gIFRoaXMgaXMgdXNlZCB0byBzb3J0IGVudW0gYW5kIG9wdGlvbkxhYmVscyBhcyB3ZWxsIGFzIHJlc3VsdHMgdGhhdCBjb21lIGJhY2sgZnJvbSBhbnkgZGF0YSBzb3VyY2VzIChmb3Igc2VsZWN0IGFuZCByYWRpbyBjb250cm9scykuICBCeSBkZWZhdWx0IHRoZSBpdGVtcyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiAgIERvbid0IGFwcGx5IGFueSBzb3J0aW5nIGlmIGZhbHNlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGluIHswfS4gIEN1cnJlbnQgdmFsdWUgaXM6IHsxfSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbnRhaW5lckZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Db250YWluZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHNpZ25hbCB0aGF0IHRoaXMgZmllbGQgaXMgYSBjb250YWluZXIgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgb25Db25zdHJ1Y3Q6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuaXNDb250YWluZXJGaWVsZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaXNDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBpc0NvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0Q29udGFpbmVyRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgY29udGFpbmVyIGZpZWxkcywgd2UgdXNlIHRoZSAiY29udGFpbmVyIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRlbXBsYXRlRGVzY3JpcHRvcklkCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCA6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImNvbnRhaW5lciI7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB3YWxrIHRoZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgZmluZCBhIHRlbXBsYXRlIHR5cGUKCiAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciBiID0gdGhpczsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFiLmdldEZpZWxkVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGIuZ2V0RmllbGRUeXBlKCksIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBiID0gYi5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHlwZTsKICAgICAgICB9LAoKICAgICAgICByZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB3YWxrIHRoZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgZmluZCBhIHRlbXBsYXRlIHR5cGUKCiAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciBiID0gdGhpczsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFiLmdldEZpZWxkVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGIuZ2V0RmllbGRUeXBlKCkgKyAiLWl0ZW0iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVyVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udGFpbmVyVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVyVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lcjogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lclRlbXBsYXRlVHlwZSwgc2VsZik7CgogICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGZhbHNlCiAgICAgICAgICAgIHZhciBjb2xsYXBzaWJsZSA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcuY29sbGFwc2libGUpKSB7CiAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZSA9IHRoaXMudmlldy5jb2xsYXBzaWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMuY29sbGFwc2libGUpKSB7CiAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZSA9IHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlID0gY29sbGFwc2libGU7CgogICAgICAgICAgICB2YXIgbGVnZW5kU3R5bGUgPSAiYnV0dG9uIjsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmxlZ2VuZFN0eWxlKSkgewogICAgICAgICAgICAgICAgbGVnZW5kU3R5bGUgPSB0aGlzLnZpZXcubGVnZW5kU3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlKSkgewogICAgICAgICAgICAgICAgbGVnZW5kU3R5bGUgPSB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSA9IGxlZ2VuZFN0eWxlOwoKICAgICAgICAgICAgLy9MYXp5IGxvYWRpbmcKICAgICAgICAgICAgdGhpcy5sYXp5TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZykpIHsKICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSB0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmc7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZGluZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kZWxldGUgdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGhvbGRlcnMgb2YgcmVmZXJlbmNlcyB0byBjaGlsZHJlbgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107CiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeUlkID0ge307CiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250YWluZXIgaXMgRE9NLXdyYXBwZWQgd2l0aCBhIGZvcm0sIHRoZW4gcmVsZWFzZSB0aGUgZm9ybQogICAgICAgICAgICBpZiAodGhpcy5mb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZGVzdHJveSh0cnVlKTsgLy8gcGFzcyBpbiB0cnVlIHNvIHRoYXQgd2UgZG9uJ3QgY2FsbCBiYWNrIHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5mb3JtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZXN0cm95IGFueSBjaGlsZCBjb250cm9scwogICAgICAgICAgICBBbHBhY2EuZWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZCBhICJjb250YWluZXIiIGRvbSBlbGVtZW50IGluc2lkZSBvZiB0aGUgZmllbGQgd2hpY2ggaG91c2VzIG91ciBjdXN0b20gY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjcmVuZGVyRmllbGQKICAgICAgICAgKi8KICAgICAgICByZW5kZXJGaWVsZEVsZW1lbnRzOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEKTsKCiAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICBzZWxmLnByZXBhcmVDb250YWluZXJNb2RlbChmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgICAgICAgc2VsZi5iZWZvcmVSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbihjb250YWluZXJGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5yZXBsYWNlV2l0aChjb250YWluZXJGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciA9IGNvbnRhaW5lckZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKEFscGFjYS5DTEFTU19DT05UQUlORVIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSBmb3JtIGZpZWxkIHdpdGggImFscGFjYS1ob3Jpem9udGFsIiBvciAiYWxwYWNhLXZlcnRpY2FsIgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3Lmhvcml6b250YWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtaG9yaXpvbnRhbCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIuYWRkQ2xhc3MoImFscGFjYS12ZXJ0aWNhbCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImNvbnRhaW5lciIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImNvbnRhaW5lciIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAqLwogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbW9kZWwgPSB7CiAgICAgICAgICAgICAgICAiaWQiOiB0aGlzLmdldElkKCksCiAgICAgICAgICAgICAgICAibmFtZSI6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgICJzY2hlbWEiOiB0aGlzLnNjaGVtYSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGxvYWQgaXRlbXMgaW50byBhcnJheSBhbmQgc3RvcmUgb24gbW9kZWwgZm9yIGZ1dHVyZSB1c2UKICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtcyhmdW5jdGlvbihpdGVtcykgewoKICAgICAgICAgICAgICAgIGlmICghaXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogYXNzdW1lIGNvbnRhaW5lckl0ZW1FbCA9IGZpZWxkRWwKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtc1tpXS5jb250YWluZXJJdGVtRWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uY29udGFpbmVySXRlbUVsID0gaXRlbXNbaV0uZ2V0RmllbGRFbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5pdGVtcyA9IGl0ZW1zOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250YWluZXIgaW50byB0aGUgZmllbGQgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IEFscGFjYS50bXBsKHRoaXMuY29udGFpbmVyRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjayhjb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhZnRlciB0aGUgY29udGFpbmVyIGlzIHJlbmRlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmVmb3JlQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgc2VsZi5hcHBseUNyZWF0ZWRJdGVtcyhtb2RlbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtcyhtb2RlbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5jb2xsYXBzaWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb2xsYXBzaWJsZSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbnkgc3ViLWl0ZW1zIGZvciB0aGlzIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb25fcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYmVmb3JlQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBsYXlvdXRCaW5kaW5ncyA9IG51bGw7CiAgICAgICAgICAgIGlmIChzZWxmLmlzVG9wTGV2ZWwoKSAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzID0gc2VsZi52aWV3LmdldExheW91dCgpLmJpbmRpbmdzOwoKICAgICAgICAgICAgICAgIC8vIGlmIGxheW91dCBhbmQgYmluZGluZ3Mgbm90IHByb3ZpZGVkLCBhc3N1bWUgYSBkZWZhdWx0IHN0cmF0ZWd5CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzICYmIHNlbGYudmlldy5nZXRMYXlvdXQoKS50ZW1wbGF0ZURlc2NyaXB0b3IgJiYgbW9kZWwuaXRlbXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBtb2RlbC5pdGVtc1tpXS5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3NbbmFtZV0gPSAiW2RhdGEtYWxwYWNhLWxheW91dC1iaW5kaW5nPSciICsgbmFtZSArICInXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBtb2RlbC5pdGVtcy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5yZW1vdmVBdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50ID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIlsiICsgQWxwYWNhLk1BUktFUl9EQVRBX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0tFWSArICI9JyIgKyBpdGVtLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmICghbGF5b3V0QmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGRlciA9ICQoaW5zZXJ0aW9uUG9pbnQpLnBhcmVudCgpOwoKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZXBsYWNlV2l0aChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGRvbUVsIHRvIGFsbG93IGZvciByZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9IGhvbGRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYSBsYXlvdXQKICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0lkID0gbGF5b3V0QmluZGluZ3NbaXRlbS5uYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0lkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGRlciA9ICQoYmluZGluZ0lkLCBzZWxmLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvbGRlci5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQsIGZhbGxiYWNrIHRvIElEIGJhc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9ICQoJyMnICsgYmluZGluZ0lkLCBzZWxmLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgd3JhcHBlciAod2hpY2ggd2lsbCBzZXJ2ZSBhcyB0aGUgZG9tRWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbS5kb21FbCkuYWRkQ2xhc3MoImFscGFjYS1sYXlvdXQtYmluZGluZy1ob2xkZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbS5kb21FbCkuYXR0cigiYWxwYWNhLWxheW91dC1iaW5kaW5nLWZpZWxkLW5hbWUiLCBpdGVtLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmFwcGVuZChpdGVtLmRvbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwuYXBwZW5kKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0iKTsKCiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBtb2RlbC5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiLCBpKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBpdGVtLm5hbWUpOwogICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkIiwgc2VsZi5nZXRJZCgpKTsKCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5jb2xsYXBzaWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb2xsYXBzaWJsZSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtczogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCBjaGlsZCBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbnRyb2x9IGNoaWxkIENoaWxkIGZpZWxkIHRvIGJlIGFkZGVkLgogICAgICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggSW5kZXggb2YgdGhlIG5ldyBjaGlsZC4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckNoaWxkOiBmdW5jdGlvbihjaGlsZCwgaW5kZXgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGluZGV4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkLmdldElkKCldID0gY2hpbGQ7CiAgICAgICAgICAgIGlmIChjaGlsZC5wcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdID0gY2hpbGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgICAgKi8KICAgICAgICB1bnJlZ2lzdGVyQ2hpbGQ6IGZ1bmN0aW9uKGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpbmRleF07CiAgICAgICAgICAgIGlmICghY2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkLmdldElkKCldOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbY2hpbGQucHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIsIHNlbGYuY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5yZW1vdmVBdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgLy8gc2V0IHBhdGggaWYgbm90IHNldAogICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpICsgIl0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgY2hpbGQucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2hpbGQuY2FsY3VsYXRlTmFtZSgpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0Iik7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0ta2V5Iik7CgogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0iKTsKCiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZSIsIGNoaWxkLm5hbWUpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDaGlsZERPTVdyYXBwZXJFbGVtZW50KGksIGNoaWxkKTsKCiAgICAgICAgICAgICAgICBjaGlsZC51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFWFRFTlNJT04gUE9JTlQgdGhhdCBhbGxvd3MgY29udGFpbmVycyB0byB1cGRhdGUgYW55IGN1c3RvbSB3cmFwcGVyIGVsZW1lbnRzIGZvciBjaGlsZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpCiAgICAgICAgICogQHBhcmFtIGNoaWxkCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudDogZnVuY3Rpb24oaSwgY2hpbGQpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGlzIGR5bmFtaWNhbGx5IGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBhIGNvbnRhaW5lci4gIFRoaXMgYWxsb3dzIGFsbCBvZiB0aGUKICAgICAgICAgKiBjb250YWluZXIgbWFya2VycyB0byByZWZyZXNoIG9uIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2g6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmdldFBhcmVudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZSBkb20gbWFya2VycyBmb3IgcGFyZW50IHdoaWNoIHdpbGwgdHJpY2tsZSBkb3duIHRvIHRvIGNvdmVyIHRoaXMgZmllbGQgYW5kIG91ciBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5nZXRQYXJlbnQoKS51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBqdXN0IG91cnNlbHZlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIHNpZ25hbCBkb3duIHRvIGFsbCBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIHNpZ25hbCBkb3duIHRvIGFsbCBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudENvbmNlYWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzIGFuIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4gIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBvciBpZiBubyBpbnZhbGlkIGVsZW1lbnRzLCBwaWNrCiAgICAgICAgICogdGhlIGZpcnN0IGNoaWxkLiAgSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIGlzIGZpcmVkIGFuZCBwYXNzZWQgdGhlIGNvbnRyb2wgZWxlbWVudAogICAgICAgICAqIHRoYXQgcmVjZWl2ZWQgdGhlIGZvY3VzLgogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW52YWxpZEluZGV4ID0gLTE7CgogICAgICAgICAgICAvLyB1c2UgdGhlIGRvbSB0byBjcmVhdGUgYW4gYXJyYXkgdGhhdCBvcmRlcnMgdGhpbmdzIGFzIHRoZXkgYXJlIGxhaWQgb3V0IG9uIHRoZSBwYWdlCiAgICAgICAgICAgIHZhciBwYWdlT3JkZXJlZENoaWxkcmVuID0gW107CiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0Q29udGFpbmVyRWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkgewogICAgICAgICAgICAgICAgZWwgPSB0aGlzLmZvcm0uZ2V0Rm9ybUVsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyB0aGlzLmdldElkKCkgKyAiJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkSW5kZXggPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4Iik7CiAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuLnB1c2goc2VsZi5jaGlsZHJlbltjaGlsZEluZGV4XSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gd2FsayB0aGUgb3JkZXJlZCBjaGlsZHJlbiBhbmQgZmluZCBmaXJzdCBpbnZhbGlkCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWdlT3JkZXJlZENoaWxkcmVuW2ldLmlzVmFsaWQodHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0NvbnRyb2xGaWVsZCAmJgogICAgICAgICAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuW2ldLmlzQXV0b0ZvY3VzYWJsZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlT3JkZXJlZENoaWxkcmVuW2ldLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGludmFsaWQsIGp1c3QgZm9jdXMgb24gZmlyc3QgaXRlbQogICAgICAgICAgICBpZiAoaW52YWxpZEluZGV4ID09PSAtMSAmJiBwYWdlT3JkZXJlZENoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludmFsaWRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIHRoZSBmb2N1cyBpZiB3ZSBmb3VuZCBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuW2ludmFsaWRJbmRleF0uZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhwYWdlT3JkZXJlZENoaWxkcmVuW2ludmFsaWRJbmRleF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0uZGlzYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmVuYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IHZhbHVlIEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldENvbnRhaW5lclZhbHVlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAiICAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludAogICAgICAgICAqLwogICAgICAgIGdldENvbnRhaW5lclZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBmaXJzdENoaWxkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5jaGlsZHJlblswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0sCgogICAgICAgIGxhc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJsYXp5TG9hZGluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhenkgTG9hZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDaGlsZCBmaWVsZHMgd2lsbCBvbmx5IGJlIHJlbmRlcmVkIHdoZW4gdGhlIGZpZWxkc2V0IGlzIGV4cGFuZGVkIGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2libGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzaWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBzZXQgaXMgY29sbGFwc2libGUgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbGxhcHNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBzZXQgaXMgaW5pdGlhbGx5IGNvbGxhcHNlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMZWdlbmQgU3R5bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGxlZ2VuZCBzdHlsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJidXR0b24iLCJsaW5rIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImJ1dHRvbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbmltYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQW5pbWF0ZSBtb3ZlbWVudHMgYW5kIHRyYW5zaXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVwIGFuZCBkb3duIHRyYW5zaXRpb25zIHdpbGwgYmUgYW5pbWF0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJsYXp5TG9hZGluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiTGF6eSBsb2FkaW5nIGNoaWxkIGZpZWxkcyA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJMYXp5IGxvYWRpbmcgd2lsbCBiZSBlbmFibGVkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2libGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkZpZWxkIHNldCBjb2xsYXBzaWJsZSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBzZXQgaXMgY29sbGFwc2libGUgaWYgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkZpZWxkIHNldCBpbml0aWFsbHkgY29sbGFwc2VkID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsZWdlbmRTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiQW5pbWF0ZSBtb3ZlbWVudHMgYW5kIHRyYW5zaXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZvcm0gPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Gb3JtLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBUaGlzIGNsYXNzIGlzIGZvciBtYW5hZ2luZyBIVE1MIGZvcm0gY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21FbCBGaWVsZCBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZG9tRWwsIG9wdGlvbnMsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICAvLyBjb250YWluZXIKICAgICAgICAgICAgdGhpcy5kb21FbCA9IGRvbUVsOwoKICAgICAgICAgICAgLy8gcGFyZW50CiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKCiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOwogICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrOwoKICAgICAgICAgICAgLy8gb3B0aW9ucwogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC50eXBlID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0Lm5hbWUgPSAnc3VibWl0JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnZhbHVlID0gJ1N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlID0gJ3Jlc2V0JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC5uYW1lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC52YWx1ZSA9ICdSZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNvbWUgZ2VuZXJhbCBjb3JyZWN0aW9uCiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50aXRsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmF0dHJpYnV0ZXMuaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzdWJtaXQgYnV0dG9uIHNwZWNpZmllZCwgYW5kIHRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUgaXNuJ3QgZGVmaW5lZCwgc2V0IHRvIHRydWUgYnkgZGVmYXVsdAogICAgICAgICAgICAvLyBkb24ndCBhbGxvdyB0aGUgZm9ybSB0byBzdWJtaXQgdW5sZXNzIHZhbGlkCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucyAmJiB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQgJiYgQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnZpZXdUeXBlID0gb3B0aW9ucy52aWV3VHlwZTsKCiAgICAgICAgICAgIC8vIHNldCBhIHJ1bnRpbWUgdmlldwogICAgICAgICAgICB0aGlzLnZpZXcgPSBuZXcgQWxwYWNhLlJ1bnRpbWVWaWV3KHZpZXdJZCwgdGhpcyk7CgogICAgICAgICAgICAvLyBmb3IgZWFjaCBidXR0b24sIG1ha2Ugc3VyZSB0aGF0IGNsYXNzZXMgaXMgc2V0IG1pbmltYWxseSB0byB2aWV3LnN0eWxlcy5idXR0b24KICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZm9ybSBpbnRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyIGl0CiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlbmRlcih0aGlzLmRvbUVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBiaW5kIG91ciBmaWVsZCBkb20gZWxlbWVudCBpbnRvIHRoZSBkb21FbAogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgIC8vIGFkZCBkZWZhdWx0IGNsYXNzCiAgICAgICAgICAgICAgICBzZWxmLmZvcm0uYWRkQ2xhc3MoImFscGFjYS1mb3JtIik7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmb3JtIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImZvcm0iKTsKCiAgICAgICAgICAgICAgICAvLyBleGVjdXRlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJJbml0aWFsaXplOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpIHsKCiAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgc3VibWl0IGJ1dHRvbiBzdGF0ZQogICAgICAgICAgICAgICAgc2VsZi5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRvcCBjb250cm9sIGlzIGVudGlyZWx5IHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBpc0Zvcm1WYWxpZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gcmUtY29tcHV0ZSB2YWxpZGF0aW9uIGZvciB0aGUgZnVsbCBjb250cm9sIHNldAogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wudmFsaWRhdGUodHJ1ZSk7CgogICAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnRvcENvbnRyb2wuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgLy90aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNGb3JtVmFsaWQoKTsKICAgICAgICB9LAoKICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24oY2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKGNoaWxkcmVuKTsKICAgICAgICB9LAoKICAgICAgICBlbmFibGVTdWJtaXRCdXR0b246IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYXR0clByb3AoImRpc2FibGVkIiwgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGVTdWJtaXRCdXR0b246IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYXR0clByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICBpZiAoJC5tb2JpbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyeSB7ICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYnV0dG9uKCdyZWZyZXNoJyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWRqdXN0U3VibWl0QnV0dG9uU3RhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVN1Ym1pdEJ1dHRvbigpOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNGb3JtVmFsaWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVTdWJtaXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlc3BvbnNpYmxlIGZvciBmZXRjaGluZyBhbnkgdGVtcGxhdGVzIG5lZWRlZCBzbyBhcyB0byByZW5kZXIgdGhlCiAgICAgICAgICogY3VycmVudCBtb2RlIGZvciB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogT25jZSBjb21wbGV0ZWQsIHRoZSBvblN1Y2Nlc3MgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRFbCBGaWVsZCBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBwcm9jZXNzUmVuZGVyOiBmdW5jdGlvbihwYXJlbnRFbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb29rdXAgdGhlIHRlbXBsYXRlIHdlIHNob3VsZCB1c2UgdG8gcmVuZGVyCiAgICAgICAgICAgIHRoaXMuZm9ybURlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJmb3JtIik7CiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDb3VsZCBub3QgZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yOiBmb3JtIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZW5kZXJlZERvbUVsZW1lbnQgPSBBbHBhY2EudG1wbCh0aGlzLmZvcm1EZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICBpZDogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgdGhpcy5mb3JtID0gcmVuZGVyZWREb21FbGVtZW50OwoKICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHNDb250YWluZXIgPSAkKHRoaXMuZm9ybSkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQpOwogICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHNDb250YWluZXIucmVtb3ZlQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmZvcm0uYXR0cigiaWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItZm9ybS1vdXRlciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmZvcm0uYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiLCB0aGlzLmdldElkKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgZm9ybSBmaWVsZAogICAgICAgICAgICAkKHBhcmVudEVsKS5maW5kKCJmb3JtIikuYXR0cih0aGlzLmF0dHJpYnV0ZXMpOwoKICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGJ1dHRvbnMgYXMgd2VsbAogICAgICAgICAgICB0aGlzLmJ1dHRvbnMgPSB7fTsKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJidXR0b24tcHVzaGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEta2V5Iik7CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25Db25maWcgPSBzZWxmLm9wdGlvbnMuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChidXR0b25Db25maWcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGZvcm0sIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChmb3JtLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIGJ1dHRvbkNvbmZpZy5jbGljaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGb3JtIGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZm9ybSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGlzIGZvcm0ncyBwYXJlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3JtIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgSlNPTiByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSBWYWx1ZSBvZiB0aGUgSlNPTiByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcENvbnRyb2wuZ2V0VmFsdWUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSlNPTiB0byBiZSByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0LgogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgZXZlbnRzIGhhbmRsaW5nIChGb3JtIFN1Ym1pc3Npb24pIGZvciB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmb3JtVGFnID0gJCh0aGlzLmRvbUVsKS5maW5kKCJmb3JtIik7CgogICAgICAgICAgICB2YXIgdiA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgJChmb3JtVGFnKS5zdWJtaXQodiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uU3VibWl0KGUsIF90aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGZpZWxkdXBkYXRlcyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvcm0gaXMgdmFsaWQuCiAgICAgICAgICAgIC8vIGlmIHNvLCBlbmFibGUgdGhlIHN1Ym1pdCBidXR0b24uLi4KICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBkaXNhYmxlIGl0CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGR1cGRhdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRrZXl1cCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkKF90aGlzLnRvcENvbnRyb2wuZ2V0RmllbGRFbCgpKS5iaW5kKCJmaWVsZGJsdXIiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0QnV0dG9uRWw6IGZ1bmN0aW9uKGJ1dHRvbklkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICQodGhpcy5kb21FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbi0iICsgYnV0dG9uSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgZm9ybSBzdWJtaXQgZXZlbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgU3VibWl0IGV2ZW50LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmb3JtIHRoZSBmb3JtCiAgICAgICAgICovCiAgICAgICAgb25TdWJtaXQ6IGZ1bmN0aW9uKGUsIGZvcm0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5zdWJtaXRIYW5kbGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5zdWJtaXRIYW5kbGVyKGUsIGZvcm0pOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh2KSkgewogICAgICAgICAgICAgICAgICAgIHYgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBzdWJtaXQgaGFuZGxlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmdW5jIFN1Ym1pdCBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJTdWJtaXRIYW5kbGVyOiBmdW5jdGlvbiAoZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRIYW5kbGVyID0gZnVuYzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc3BsYXlzIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gb2YgYWxsIGZpZWxkcyBvZiB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNoaWxkcmVuIHdoZXRoZXIgdG8gcmVuZGVyIHZhbGlkYXRpb24gc3RhdGUgZm9yIGNoaWxkIGZpZWxkcwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSB2YWxpZGF0aW9uIHN0YXRlLgogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKGNoaWxkcmVuLCBjYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGlzYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5kaXNhYmxlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRW5hYmxlcyB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZW5hYmxlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyBvbiB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGZvY3VzZWQgY29udHJvbC4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmZvY3VzKGZ1bmN0aW9uKGNvbnRyb2xXaXRoRm9jdXMpIHsKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKGNvbnRyb2xXaXRoRm9jdXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQdXJnZSBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhlIGZvcm0gZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBza2lwUGFyZW50IHdoZW4gdHJ1ZSwgdGhlIGZvcm0gY2xlYW5zIHVwIHdpdGhvdXQgdHJhdmVyc2luZyB0aHJvdWdoIHBhcmVudCBjaGlsZCBjb250cm9scwogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKHNraXBQYXJlbnQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldEZvcm1FbCgpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gd2UgYWxsb3cgZm9ybS5kZXN0cm95KCkgd2hpY2ggdGVsbHMgcGFyZW50IGNvbnRyb2wgdG8gZGVzdHJveQogICAgICAgICAgICAvLyBpZiBza2lwUGFyZW50ID09IHRydWUsIHRoZW4gd2UgZG8gbm90IGNhbGwgdXAgKGludm9rZWQgZnJvbSBjb250YWluZXIpCiAgICAgICAgICAgIGlmICghc2tpcFBhcmVudCAmJiB0aGlzLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgc2hvdzogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBoaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldEZvcm1FbCgpLmNzcyh7CiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIGZvcm0gYW5kIHJlc2V0cyB2YWx1ZXMgb2YgaXRzIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzdG9wVXBkYXRlVHJpZ2dlciBJZiBmYWxzZSwgdHJpZ2dlcnMgdGhlIHVwZGF0ZSBldmVudCBvZiB0aGlzIGV2ZW50LgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbihzdG9wVXBkYXRlVHJpZ2dlcikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5jbGVhcihzdG9wVXBkYXRlVHJpZ2dlcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGZvcm0gaXMgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9ybSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcENvbnRyb2wuaXNFbXB0eSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZm9ybS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSBhcmcxCiAgICAgICAgICogQHBhcmFtIGFyZzIKICAgICAgICAgKiBAcGFyYW0gYXJnMwogICAgICAgICAqIEBwYXJhbSBhcmc0CiAgICAgICAgICogQHBhcmFtIGFyZzUKICAgICAgICAgKi8KICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGlkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmZpcmVDYWxsYmFjayh0aGlzLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBmb3JtIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVuZGVyZWQgRE9NIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0Rm9ybUVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyBhIHJlZ3VsYXIgb2xkIHN1Ym1pdC4KICAgICAgICAgKi8KICAgICAgICBzdWJtaXQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZm9ybS5zdWJtaXQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyB0aGUgc3VibWl0IGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBoYW5kcyBiYWNrIHRoZSBqUXVlcnkgcHJvbWlzZS4KICAgICAgICAgKgogICAgICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBjYW4gYmUgcGFzc2VkIGluIHRvIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgalF1ZXJ5IGFqYXggWEhSLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgYWpheFN1Ym1pdDogZnVuY3Rpb24oY29uZmlnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25maWcudXJsID0gc2VsZi5vcHRpb25zLmF0dHJpYnV0ZXMuYWN0aW9uOwogICAgICAgICAgICBjb25maWcudHlwZSA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLm1ldGhvZDsKCiAgICAgICAgICAgIGlmICghY29uZmlnLmRhdGEpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhVHlwZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmRhdGFUeXBlID0gImpzb24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29uZmlnLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5oZWFkZXJzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgQ1NSRiBoZXJlCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVyc1tBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRV0gPSBjc3JmVG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkLmFqYXgoY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICBkZXRlcm1pbmVDc3JmVG9rZW46IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgZGlyZWN0IHRva2VuIHNwZWNpZmllZD8KICAgICAgICAgICAgdmFyIGNzcmZUb2tlbiA9IEFscGFjYS5DU1JGX1RPS0VOOwogICAgICAgICAgICBpZiAoIWNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBjb29raWUgdGhhdCB3ZSBjYW4gcHVsbCB0aGUgdmFsdWUgZnJvbT8KICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgQWxwYWNhLkNTUkZfQ09PS0lFX05BTUVTLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVOYW1lID0gQWxwYWNhLkNTUkZfQ09PS0lFX05BTUVTW3RdOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llVmFsdWUgPSBBbHBhY2EucmVhZENvb2tpZShjb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjc3JmVG9rZW4gPSBjb29raWVWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY3NyZlRva2VuOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTWVtb3J5Q2FjaGUgPSBmdW5jdGlvbihjb25maWcpCiAgICB7CiAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgfQoKICAgICAgICB2YXIgY2FjaGUgPSB7fTsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGssIHYsIHR0bCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKHYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZVtrXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdjogdgogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghdHRsICYmIGNvbmZpZy50dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHRsID0gY29uZmlnLnR0bDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVba10uZXhwaXJlcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgdHRsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yICJjbGVhciIgbWV0aG9kIC0gcmVtb3ZlcyBldmVyeXRoaW5nIGZyb20gY2FjaGUKICAgICAgICAgICAgaWYgKGsgPT0gImNsZWFyIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHphID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciB6IGluIGNhY2hlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHphLnB1c2goeik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHphLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVt6YVtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkID0gY2FjaGVba107CiAgICAgICAgICAgIGlmICghZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICBpZiAoZC5leHBpcmVzICYmIGQuZXhwaXJlcyA8IG5vdykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGQudjsKICAgICAgICB9OwogICAgfTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSgibWVtb3J5IiwgQWxwYWNhLk1lbW9yeUNhY2hlKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTnVsbENhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm51bGwiLCBBbHBhY2EuTnVsbENhY2hlKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29ubmVjdG9yID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIHJlbW90ZSBkYXRhIHN0b3Jlcy4KCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbm5lY3RvciBJRAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgQ29ubmVjdG9yIENvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihpZCwgY29uZmlnKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIHJlc291cmNlIGlzIGEgdXJpCiAgICAgICAgICAgIHRoaXMuaXNVcmkgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNFbXB0eShyZXNvdXJjZSkgJiYgQWxwYWNhLmlzVXJpKHJlc291cmNlKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVsbCIsCiAgICAgICAgICAgICAgICAgICAgImNvbmZpZyI6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlLnR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS50eXBlID0gIm51bGwiOwogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlLmNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNhY2hlID0gQWxwYWNhLmdldENhY2hlKGNvbmZpZy5jYWNoZS50eXBlKShjb25maWcuY2FjaGUuY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIGRhdGEgc291cmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIG9uU3VjY2VzcygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgdGVtcGxhdGUgKEhUTUwgb3IgVGV4dCkuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgc291cmNlIGlzIGEgVVJJLCB0aGVuIGl0IGlzIGxvYWRlZC4KICAgICAgICAgKiBJZiBpdCBpcyBub3QgYSBVUkksIHRoZW4gdGhlIHNvdXJjZSBpcyBzaW1wbHkgaGFuZGVkIGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNvdXJjZSBTb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRUZW1wbGF0ZTogZnVuY3Rpb24gKHNvdXJjZSwgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzb3VyY2UpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVXJpKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uKGxvYWRlZERhdGEpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvblN1Y2Nlc3MgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25TdWNjZXNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGxvYWRlZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChsb2FkRXJyb3IpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGxvYWRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3Moc291cmNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRXJyb3IoewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiRW1wdHkgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogIlRFTVBMQVRFX0xPQURJTkdfRVJST1IiCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiBzY2hlbWEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkVmlldzogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHNjaGVtYSwgZm9ybSwgdmlldyBhbmQgZGF0YSBpbiBhIHNpbmdsZSBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkQWxsOiBmdW5jdGlvbiAocmVzb3VyY2VzLCBvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgb25Db25uZWN0U3VjY2VzcyA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBkYXRhU291cmNlID0gcmVzb3VyY2VzLmRhdGFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hU291cmNlID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zU291cmNlID0gcmVzb3VyY2VzLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgdmlld1NvdXJjZSA9IHJlc291cmNlcy52aWV3U291cmNlOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJzY2hlbWEiIHRvIGNvbnRhaW4gYSBVUkkgYXMgd2VsbCAoYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpCiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYVNvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnNjaGVtYSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYWxsb3cgIm9wdGlvbnMiIHRvIGNvbnRhaW4gYSBVUkkgYXMgd2VsbCAoYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5vcHRpb25zKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJ2aWV3IiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCF2aWV3U291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMudmlldykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlldzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgbG9hZGVkID0ge307CgogICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIHZhciBpbnZvY2F0aW9uQ291bnQgPSAwOwoKICAgICAgICAgICAgICAgIHZhciBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudGVyID09PSBpbnZvY2F0aW9uQ291bnQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWQuZGF0YSwgbG9hZGVkLm9wdGlvbnMsIGxvYWRlZC5zY2hlbWEsIGxvYWRlZC52aWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIGVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbiAobG9hZEVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY291bnQgb3V0IHRoZSB0b3RhbCAjIG9mIGludm9rZXMgd2UncmUgZ29pbmcgdG8gZmlyZSBvZmYKICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpZXdTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaW52b2NhdGlvbkNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gaW52b2tlLCBzbyBqdXN0IGhhbmQgYmFjawogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9NZXJnZSA9IGZ1bmN0aW9uKHAsIHYxLCB2MikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHYyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YobG9hZGVkW3BdKSA9PT0gIm9iamVjdCIpICYmICh0eXBlb2YodjIpID09PSAib2JqZWN0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChsb2FkZWRbcF0sIHYyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZFtwXSA9IHYyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBmaXJlIG9mZiBhbGwgb2YgdGhlIGludm9rZXMKICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZERhdGEoZGF0YVNvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJkYXRhIiwgcmVzb3VyY2VzLmRhdGEsIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFNjaGVtYShzY2hlbWFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJzY2hlbWEiLCByZXNvdXJjZXMuc2NoZW1hLCBzY2hlbWEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRPcHRpb25zKG9wdGlvbnNTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24ob3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgib3B0aW9ucyIsIHJlc291cmNlcy5vcHRpb25zLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpZXdTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkVmlldyh2aWV3U291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHZpZXcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoInZpZXciLCByZXNvdXJjZXMudmlldywgdmlldyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgb25Db25uZWN0RXJyb3IgID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkgewogICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlbGYuY29ubmVjdChvbkNvbm5lY3RTdWNjZXNzLCBvbkNvbm5lY3RFcnJvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgYSBKU09OIHRocm91Z2ggQWpheCBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVyaSBsb2NhdGlvbiBvZiB0aGUganNvbiBkb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRKc29uIDogZnVuY3Rpb24odXJpLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5sb2FkVXJpKHVyaSwgdHJ1ZSwgb25TdWNjZXNzLCBvbkVycm9yKTsKICAgICAgICB9ICwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50LiAgU2V0IHVwIGRlZmF1bHQgYWpheCBjb25maWd1cmF0aW9uIGZvciBVUkwgcmV0cmlldmFsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHVyaQogICAgICAgICAqIEBwYXJhbSBpc0pzb24KICAgICAgICAgKiBAcmV0dXJucyB7e3VybDogKiwgdHlwZTogc3RyaW5nfX0KICAgICAgICAgKi8KICAgICAgICBidWlsZEFqYXhDb25maWc6IGZ1bmN0aW9uKHVyaSwgaXNKc29uKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFqYXhDb25maWcgPSB7CiAgICAgICAgICAgICAgICAidXJsIjogdXJpLAogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2V0IgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKGlzSnNvbikgewogICAgICAgICAgICAgICAgYWpheENvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAidGV4dCI7CiAgICAgICAgICAgICAgICBpZiAodXJpICYmIHVyaS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi5odG1sIikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhamF4Q29uZmlnOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgZ2VuZXJhbCBkb2N1bWVudCB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgdXNlcyBqUXVlcnkgdG8gcGVyZm9ybSB0aGUgQWpheCBjYWxsLiAgSWYgeW91IG5lZWQgdG8gY3VzdG9taXplIGNvbm5lY3Rpdml0eSB0byB5b3VyIG93biByZW1vdGUgc2VydmVyLAogICAgICAgICAqIHRoaXMgd291bGQgYmUgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIHRvIGRvIHNvLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVyaSB1cmkgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0pzb24gV2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBKU09OIG9yIG5vdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVXJpIDogZnVuY3Rpb24odXJpLCBpc0pzb24sIG9uU3VjY2Vzcywgb25FcnJvcikgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGFqYXhDb25maWcgPSBzZWxmLmJ1aWxkQWpheENvbmZpZyh1cmksIGlzSnNvbik7CgogICAgICAgICAgICBhamF4Q29uZmlnWyJzdWNjZXNzIl0gPSBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHVyaSwganNvbkRvY3VtZW50KTsKCiAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoanNvbkRvY3VtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgYWpheENvbmZpZ1siZXJyb3IiXSA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiJVbmFibGUgdG8gbG9hZCBkYXRhIGZyb20gdXJpIDogIiArIHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgInN0YWdlIjogIkRBVEFfTE9BRElOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHRTdGF0dXMiIDogdGV4dFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclRocm93biIgOiBlcnJvclRocm93bgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKHVyaSk7CgogICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQgJiYgb25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKICAgICAgICAgICAgICAgIG9uU3VjY2VzcyhjYWNoZWREb2N1bWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkLmFqYXgoYWpheENvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVMb2FkSnNvblJlc291cmNlOiBmdW5jdGlvbiAocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzVXJpKHJlc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5sb2FkSnNvbihyZXNvdXJjZSwgZnVuY3Rpb24obG9hZGVkUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobG9hZGVkUmVzb3VyY2UpOwogICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2socmVzb3VyY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBzb3VyY2UgKHZhbHVlL3RleHQpIHBhaXJzIGZyb20gYSByZW1vdGUgc291cmNlLgogICAgICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgZm9yIGNvbmZpZyB0byBiZSBhIHN0cmluZyBpZGVudGlmeWluZyBhIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcKICAgICAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YVNvdXJjZTogZnVuY3Rpb24gKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWREYXRhU291cmNlKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVybCA9IGNvbmZpZzsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh1cmwpKSB7CiAgICAgICAgICAgICAgICB1cmwgPSBjb25maWcudXJsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZSh1cmwsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckNvbm5lY3RvckNsYXNzKCJkZWZhdWx0IiwgQWxwYWNhLkNvbm5lY3Rvcik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yID0gQWxwYWNhLkNvbm5lY3Rvci5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBjbGFzcyBDb25uZWN0cyBBbHBhY2EgdG8gQ2xvdWQgQ01TCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IG90aGVyd2lzZSBjb25maWd1cmVkIHRvIHVzZSBhIGNhY2hlLCB3ZSBkZWZhdWx0IHRvIGEgbWVtb3J5IGNhY2hlIHdpdGggYSA1IG1pbnV0ZSBUVEwKICAgICAgICAgICAgaWYgKCFjb25maWcuY2FjaGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZSA9IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJtZW1vcnkiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0dGwiOiAxMDAwICogNjAgKiA1IC8vIGZpdmUgbWludXRlcwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShpZCwgY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIGRhdGEgc291cmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjZm4gPSBmdW5jdGlvbihlcnIsIGJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChicmFuY2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBDaGFpbihicmFuY2gpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmRIZWxwZXJGdW5jdGlvbnMoc2VsZi5icmFuY2gpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG9uU3VjY2VzcygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5nbG9iYWxDb250ZXh0ICYmIEFscGFjYS5nbG9iYWxDb250ZXh0LmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2ZuKG51bGwsIEFscGFjYS5nbG9iYWxDb250ZXh0LmJyYW5jaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmJyYW5jaCA9IG51bGw7CgogICAgICAgICAgICAgICAgc2VsZi5kb0Nvbm5lY3QoZnVuY3Rpb24gKGVyciwgYnJhbmNoKSB7CiAgICAgICAgICAgICAgICAgICAgY2ZuKGVyciwgYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9Db25uZWN0OiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5rZXkgPSAiZGVmYXVsdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEdpdGFuYS5jb25uZWN0KHRoaXMuY29uZmlnLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RHJpdmVyKCkuZ2V0T3JpZ2luYWxDb25maWd1cmF0aW9uKCkubG9hZEFwcEhlbHBlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzdG9yZSgiY29udGVudCIpLnJlYWRCcmFuY2goIm1hc3RlciIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGJpbmRIZWxwZXJGdW5jdGlvbnM6IGZ1bmN0aW9uKGJyYW5jaCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hID0gZnVuY3Rpb24oc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWREb2N1bWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCBjYWNoZWREb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2Evc2NoZW1hIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJpZCJdID0gc2NoZW1hSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUoc2NoZW1hSWRlbnRpZmllciwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYU9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKG9wdGlvbnNJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL29wdGlvbnMiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbInNjaGVtYUlkIl0gPSByZXNvdXJjZXMuc2NoZW1hU291cmNlOwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IG9wdGlvbnNJZGVudGlmaWVyOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbkdldFJlc3BvbnNlKHRoaXMsIHVyaUZ1bmN0aW9uLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllciwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FEYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYURhdGEgPSBmdW5jdGlvbihkYXRhSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IGRhdGFJZGVudGlmaWVyOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbkdldFJlc3BvbnNlKHRoaXMsIHVyaUZ1bmN0aW9uLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhU291cmNlID0gZnVuY3Rpb24oY29uZmlnLCBwYWdpbmF0aW9uLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY29weUludG8ocGFyYW1zLCBwYWdpbmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9kYXRhc291cmNlIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpblBvc3RSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zLCBjb25maWcpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZS5kYXRhc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBmcm9tIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBub2RlSWQgdGhlIG5vZGUgaWQgdG8gbG9hZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uobm9kZUlkLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBjbG91ZCBjbXMKICAgICAgICAgICAgc2VsZi5icmFuY2gubG9hZEFscGFjYURhdGEobm9kZUlkLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb2JqID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYmogPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob2JqKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMganNvbiBzY2hlbWEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNjaGVtYUlkZW50aWZpZXIgdGhlIGRlZmluaXRpb24gcW5hbWUgdG8gbG9hZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRTY2hlbWE6IGZ1bmN0aW9uIChzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBjbG91ZCBjbXMKICAgICAgICAgICAgc2VsZi5icmFuY2gubG9hZEFscGFjYVNjaGVtYShzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgc2NoZW1hCgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHNjaGVtYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gb3B0aW9ucyBmcm9tIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgdGhlIGZvcm0ga2V5IHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkT3B0aW9uczogZnVuY3Rpb24gKG9wdGlvbnNJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zKG9wdGlvbnNJZGVudGlmaWVyLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgb3B0aW9ucykgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBvcHRpb25zCgogICAgICAgICAgICAgICAgLy8gbWl4IGluIGJ1dHRvbnMgb250byBmb3JtCiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0uYnV0dG9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuYWpheFN1Ym1pdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhockZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhDcmVkZW50aWFscyI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9zc0RvbWFpbiI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NEYXRhIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnRUeXBlIjogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sLnRyaWdnZXIoImZvcm1TdWJtaXRTdWNjZXNzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sLnRyaWdnZXIoImZvcm1TdWJtaXRGYWlsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb2N1cyA9IEFscGFjYS5kZWZhdWx0Rm9jdXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBhY3Rpb24gaGFuZGxlciByZWxhdGl2ZSB0byBiYXNlVVJMCiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0uYXR0cmlidXRlcy5hY3Rpb24gPSBzZWxmLmNvbmZpZy5iYXNlVVJMICsgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uOwoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhvcHRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgYSByZWZlcmVuY2VkIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogU3VwcG9ydHMgcW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfQogICAgICAgICAqCiAgICAgICAgICogT3RoZXJ3aXNlLCBmYWxscyBiYWNrIHRvIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNjaGVtYUlkZW50aWZpZXIgc2NoZW1hIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9IiAod2hpY2ggaXMgdGhlIENsb3VkIENNUyBvZmZpY2lhbCBmb3JtYXQpCiAgICAgICAgICAgIC8vIHRoZW4gY29udmVydCB0byBiYXNpYyBRTmFtZSB3aGljaCB3ZSBzdXBwb3J0IGhlcmUgd2l0aGluIEFscGFjYSBDbG91ZCBDTVMgY29ubmVjdG9yCiAgICAgICAgICAgIGlmIChzY2hlbWFJZGVudGlmaWVyLmluZGV4T2YoInFuYW1lOi8vIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IHNjaGVtYUlkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgc2NoZW1hSWRlbnRpZmllciA9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgoc2NoZW1hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6Ly8iKSA9PT0gMCkgfHwgKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwczovLyIpID09PSAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbG9hZCBKU09OIGZyb20gZW5kcG9pbnQKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGFzc3VtZSBpdCBpcyBhIFFOYW1lCiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHJlZmVyZW5jZWQgSlNPTiBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogLy8gU3VwcG9ydHMgcW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfS97Zm9ybUtleX0KICAgICAgICAgKgogICAgICAgICAqIEF0IHByZXNlbnQsIHRoaXMgaWdub3JlcyBRTmFtZS4KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBvcHRpb25zSWRlbnRpZmllciBmb3JtIHRvIGxvYWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZU9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaXMgaXQgSFRUUCBvciBIVFRQUz8KICAgICAgICAgICAgaWYgKChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6Ly8iKSA9PT0gMCkgfHwgKG9wdGlvbnNJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShvcHRpb25zSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc291cmNlcyA9IG51bGw7CgogICAgICAgICAgICAvLyBpZiB0aGUgcmVmZXJlbmNlIGNvbWVzIGluIGZvcm0gInFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9IiAod2hpY2ggaXMgdGhlIENsb3VkIENNUyBvZmZpY2lhbCBmb3JtYXQpCiAgICAgICAgICAgIC8vIHRoZW4gY29udmVydCB0byBiYXNpYyBRTmFtZSB3aGljaCB3ZSBzdXBwb3J0IGhlcmUgd2l0aGluIEFscGFjYSBDbG91ZCBDTVMgY29ubmVjdG9yCiAgICAgICAgICAgIGlmIChvcHRpb25zSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBvcHRpb25zSWRlbnRpZmllci5zdWJzdHJpbmcoOCkuc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHFuYW1lCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0ge307CiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnNjaGVtYVNvdXJjZSA9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV07CgogICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gaWQKICAgICAgICAgICAgICAgICAgICBvcHRpb25zSWRlbnRpZmllciA9IHBhcnRzWzJdOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobnVsbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBzb3VyY2UgZWxlbWVudHMgYmFzZWQgb24gYSBjb250ZW50IHF1ZXJ5IHRvIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcKICAgICAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YVNvdXJjZTogZnVuY3Rpb24gKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHBhZ2luYXRpb24gPSBjb25maWcucGFnaW5hdGlvbjsKICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5wYWdpbmF0aW9uOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhU291cmNlKGNvbmZpZywgcGFnaW5hdGlvbiwgZnVuY3Rpb24oZXJyLCBhcnJheSkgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGFycmF5KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckNvbm5lY3RvckNsYXNzKCJjbG91ZGNtcyIsIEFscGFjYS5DbG91ZENtc0Nvbm5lY3Rvcik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNpemUpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaXplID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIGFzc3VtZSBodG1sNSBpbnB1dCB0eXBlID0gInRleHQiCiAgICAgICAgICAgIGlmICghdGhpcy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRleHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSB0aGlzLm9wdGlvbnMuaW5wdXRUeXBlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gZGF0YS0qIGF0dHJpYnV0ZXMgc3VwcG9ydAogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gImF1dG9jb21wbGV0ZSIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gIm9uIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInRydWUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZS50b0xvd2VyQ2FzZSgpID09PSAieWVzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuZGlzYWxsb3dPbmx5RW1wdHlTcGFjZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCB0eXBlYWhlYWQKICAgICAgICAgICAgaWYgKCB0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLnR5cGVhaGVhZCAmJiB0aGlzLm9wdGlvbnMudHlwZWFoZWFkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkudHlwZWFoZWFkKCdkZXN0cm95Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5QXV0b2NvbXBsZXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hc2sKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5TWFzaygpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0eXBlYWhlYWQKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5VHlwZUFoZWFkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlBdXRvY29tcGxldGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGF1dG9jb21wbGV0ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hdXRvY29tcGxldGUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLWF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoImF1dG9jb21wbGV0ZSIsIChzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlID8gIm9uIiA6ICJvZmYiKSk7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXV0b2NvbXBsZXRlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseU1hc2s6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIG1hc2sgaXQKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC5tYXNrICYmIHNlbGYub3B0aW9ucy5tYXNrU3RyaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wubWFzayhzZWxmLm9wdGlvbnMubWFza1N0cmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVR5cGVBaGVhZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC50eXBlYWhlYWQgJiYgc2VsZi5vcHRpb25zLnR5cGVhaGVhZCAmJiAhQWxwYWNhLmlzRW1wdHkoc2VsZi5vcHRpb25zLnR5cGVhaGVhZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0Q29uZmlnID0gc2VsZi5vcHRpb25zLnR5cGVhaGVhZC5jb25maWc7CiAgICAgICAgICAgICAgICBpZiAoIXRDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICB0Q29uZmlnID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHREYXRhc2V0cyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuZGF0YXNldHM7CiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cykgewogICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMubmFtZSA9IHNlbGYuZ2V0SWQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgdEV2ZW50cyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuZXZlbnRzOwogICAgICAgICAgICAgICAgaWYgKCF0RXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgdEV2ZW50cyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVhY2ggZGF0YXNldHMgKGxvY2FsLCByZW1vdGUsIHByZWZldGNoKQogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMuaW5pdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJsb2NhbCIgfHwgdERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiIHx8IHREYXRhc2V0cy50eXBlID09PSAicHJlZmV0Y2giKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJsb29kSG91bmRDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXR1bVRva2VuaXplcjogZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuaGFzT3duUHJvcGVydHkoaykgfHwgZFtrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9ICIgIiArIGRba107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlKHRva2Vucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsID0gW107CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodERhdGFzZXRzLnNvdXJjZSkgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IHREYXRhc2V0cy5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHREYXRhc2V0cy5zb3VyY2UubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxFbGVtZW50ID0gdERhdGFzZXRzLnNvdXJjZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihsb2NhbEVsZW1lbnQpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFbGVtZW50ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGxvY2FsRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnB1c2gobG9jYWxFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLmxvY2FsID0gbG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMubG9jYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IHREYXRhc2V0cy5sb2NhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5wcmVmZXRjaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2guZmlsdGVyID0gdERhdGFzZXRzLmZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gInJlbW90ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdERhdGFzZXRzLnNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy5maWx0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5yZW1vdGUuZmlsdGVyID0gdERhdGFzZXRzLmZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy5yZXBsYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLnJlcGxhY2UgPSB0RGF0YXNldHMucmVwbGFjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgYW55IGFkZGl0aW9uYWwgZGF0YXNldCBjb25maWcgcGFyYW1zIGluIHRoZSBCbG9vZGhvdW5kIGNvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godERhdGFzZXRzLCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAndHlwZScgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdzb3VyY2UnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnZmlsdGVyJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3JlcGxhY2UnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnbG9jYWwnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAndGVtcGxhdGVzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnW2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbmV3IEJsb29kaG91bmQoYmxvb2RIb3VuZENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5pbml0aWFsaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy5zb3VyY2UgPSBlbmdpbmUudHRBZGFwdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy5pbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHREYXRhc2V0cy50ZW1wbGF0ZXNba107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGVtcGxhdGUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLnRlbXBsYXRlc1trXSA9IEhhbmRsZWJhcnMuY29tcGlsZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0eXBlYWhlYWQKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS50eXBlYWhlYWQodENvbmZpZywgdERhdGFzZXRzKTsKCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yICJhdXRvY29tcGxldGVkIiBldmVudCBhbmQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yICJzZWxlY3RlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDpzZWxlY3RlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoZGF0dW0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0RXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0RXZlbnRzLmF1dG9jb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6YXV0b2NvbXBsZXRlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2ZW50cy5hdXRvY29tcGxldGVkKGV2ZW50LCBkYXR1bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDpzZWxlY3RlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2ZW50cy5zZWxlY3RlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlcywgY2hhbmdlIHRoZSBxdWVyeSBpbiB0eXBlYWhlYWQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8ga2VlcCB0aGUgdHlwZWFoZWFkIGNvbnRyb2wgc3luYydkIHdpdGggdGhlIGFjdHVhbCBkb20gdmFsdWUKICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB0aGUgcXVlcnkgZG9lc24ndCBhbHJlYWR5IG1hdGNoCiAgICAgICAgICAgICAgICB2YXIgZmkgPSAkKHNlbGYuY29udHJvbCk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSAkKGZpKS50eXBlYWhlYWQoJ3ZhbCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKGZpKS50eXBlYWhlYWQoJ3ZhbCcsIG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gc29tZSBVSSBjbGVhbnVwICh3ZSBkb24ndCB3YW50IHR5cGVhaGVhZCB0byByZXN0eWxlKQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIikuZmlyc3QoKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsgLy8gU1BBTiB0byBiZWhhdmUgbW9yZSBsaWtlIERJViwgbmV4dCBsaW5lCiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmZpbmQoInNwYW4udHdpdHRlci10eXBlYWhlYWQgaW5wdXQudHQtaW5wdXQiKS5maXJzdCgpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsICIiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuaW5wdXRUeXBlID0gc2VsZi5pbnB1dFR5cGU7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICB1cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3I6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlcnJTdGF0ZSA9IGZhbHNlOwoKICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIHNlbGYub3B0aW9ucy5zaG93TWF4TGVuZ3RoSW5kaWNhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwoKICAgICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5zY2hlbWEubWF4TGVuZ3RoIC0gdmFsLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChkaWZmID49IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJZb3UgaGF2ZSAiICsgZGlmZiArICIgY2hhcmFjdGVycyByZW1haW5pbmciOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91ciBtZXNzYWdlIGlzIHRvbyBsb25nIGJ5ICIgKyAoZGlmZiotMSkgKyAiIGNoYXJhY3RlcnMiOwogICAgICAgICAgICAgICAgICAgIGVyclN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgaW5kaWNhdG9yID0gJChzZWxmLmZpZWxkKS5maW5kKCIuYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IiKTsKICAgICAgICAgICAgICAgIGlmIChpbmRpY2F0b3IubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9ICQoIjxwIGNsYXNzPSdhbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvcic+PC9wPiIpOwogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hZnRlcihpbmRpY2F0b3IpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5odG1sKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLnJlbW92ZUNsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIGlmIChlcnJTdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuYWRkQ2xhc3MoImVyciIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwoKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC5tYXNrICYmIHNlbGYub3B0aW9ucy5tYXNrU3RyaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBnZXQgdW5tYXNrZWQgdmFsdWUKICAgICAgICAgICAgICAgIHZhciBmbiA9ICQodGhpcy5jb250cm9sKS5kYXRhKCQubWFzay5kYXRhTmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoZm4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmbigpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lbnN1cmVQcm9wZXJUeXBlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKCIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgdGhpcy51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVBhdHRlcm4oKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWRQYXR0ZXJuIiksIFt0aGlzLnNjaGVtYS5wYXR0ZXJuXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heExlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdUb29Mb25nIiksIFt0aGlzLnNjaGVtYS5tYXhMZW5ndGhdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluTGVuZ3RoKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdUb29TaG9ydCIpLCBbdGhpcy5zY2hlbWEubWluTGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgcGF0dGVybiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0IG1hdGNoZXMgdGhlIHBhdHRlcm4sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVQYXR0ZXJuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdmFsLm1hdGNoKHRoaXMuc2NoZW1hLnBhdHRlcm4pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgdGhlIHNjaGVtYSBtaW5MZW5ndGggcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdHMgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWluTGVuZ3RoLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluTGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1pbkxlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZih2YWwgIT09IHZhbCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgoIiIrdmFsKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWF4TGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgbGVzcyB0aGFuIG1heExlbmd0aCAsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhMZW5ndGg6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEubWF4TGVuZ3RoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoID4gdGhpcy5zY2hlbWEubWF4TGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmb2N1c2VzIHRoZSBjb250cm9sIGFuZCBhbHNvIHBvc2l0aW9ucyB0aGUgaW5wdXQgYXQgdGhlIGVuZAoKICAgICAgICAgICAgICAgIHZhciBlbCA9ICQodGhpcy5jb250cm9sKS5nZXQoMCk7CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbUxlbiA9IGVsLnZhbHVlID8gZWwudmFsdWUubGVuZ3RoIDogMDsKICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gZWxlbUxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgdHlwZSBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlnbm9yZSB0YWIgYW5kIGFycm93IGtleXMKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOSB8fCBlLmtleUNvZGUgPT09IDM3IHx8IGUua2V5Q29kZSA9PT0gMzggfHwgZS5rZXlDb2RlID09PSAzOSB8fCBlLmtleUNvZGUgPT09IDQwICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA4KSAvLyBiYWNrc3BhY2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5taW5MZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWluTGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID49IHNlbGYuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzIpIC8vIHNwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGlzYWxsb3dFbXB0eVNwYWNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgYXBwbGljYWJsZSwgdXBkYXRlIHRoZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRrZXl1cCIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGtleXVwIik7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2luZ2xlLUxpbmUgVGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3Igc2luZ2xlLWxpbmUgdGV4dC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW1hbCBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW1hbCBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIExlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgdmFsdWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5MZW5ndGgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFNpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2l6ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6NDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWFzayBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIHRoZSBmaWVsZCBtYXNrLiBGaWVsZCBtYXNraW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBub3QgZW1wdHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBsYWNlaG9sZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgUGxhY2Vob2xkZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgcGxhY2Vob2xkZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGVhaGVhZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlR5cGUgQWhlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvdmlkZXMgY29uZmlndXJhdGlvbiBmb3IgdGhlICQudHlwZWFoZWFkIHBsdWdpbiBpZiBpdCBpcyBhdmFpbGFibGUuICBGb3IgZnVsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3R3aXR0ZXIvdHlwZWFoZWFkLmpzIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFsbG93T3B0aW9uYWxFbXB0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFsbG93IE9wdGlvbmFsIEVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyB0aGlzIG5vbi1yZXF1aXJlZCBmaWVsZCB0byB2YWxpZGF0ZSB3aGVuIHRoZSB2YWx1ZSBpcyBlbXB0eSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIVE1MNSBJbnB1dCBUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3IgdGhlIG92ZXJyaWRlIG9mIHRoZSB1bmRlcmx5aW5nIEhUTUw1IGlucHV0IHR5cGUuICBJZiBub3Qgc3BlY2lmaWVkLCBhbiBhc3N1bWVkIHZhbHVlIGlzIHByb3ZpZGVkIGJhc2VkIG9uIHRoZSBraW5kIG9mIGlucHV0IGNvbnRyb2wgKGkuZS4gJ3RleHQnLCAnZGF0ZScsICdlbWFpbCcgYW5kIHNvIGZvcnRoKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0YSBhdHRyaWJ1dGVzIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBrZXkvdmFsdWUgbWFwIG9mIGRhdGEgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgYWRkZWQgYXMgRE9NIGF0dHJpYnVldHMgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wuICBUaGUgZGF0YSBhdHRyaWJ1dGVzIHdpbGwgYmUgYWRkZWQgYXMgZGF0YS17bmFtZX09J3t2YWx1ZX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhdXRvY29tcGxldGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIVE1MIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIERPTSBpbnB1dCBjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgYXV0b2NvbXBsZXRlIGF0dHJpYnV0ZSBmb3IgdGhlIHVuZGVybHlpbmcgaW5wdXQgY29udHJvbCB3aGV0aGVyIG9yIG5vdCBmaWVsZCBzaG91bGQgaGF2ZSBhdXRvY29tcGxldGUgZW5hYmxlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3dFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IEVtcHR5IFNwYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGRpc2FsbG93IHRoZSBlbnRyeSBvZiBlbXB0eSBzcGFjZXMgaW4gdGhlIHRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93T25seUVtcHR5U3BhY2VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3cgT25seSBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2Ygb25seSBlbXB0eSBzcGFjZXMgaW4gdGhlIHRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJhIC0gYW4gYWxwaGEgY2hhcmFjdGVyOzkgLSBhIG51bWVyaWMgY2hhcmFjdGVyOyogLSBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlucHV0VHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRoaXMgZmllbGQgc2hvdWxkIGhhdmUgcGF0dGVybiB7MH0iLAogICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IGxlYXN0IHswfSBudW1iZXJzIG9yIGNoYXJhY3RlcnMiLAogICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4gYXQgbW9zdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0IiwgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygic3RyaW5nIiwgInRleHQiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0ZXh0YXJlYSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJvd3MpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yb3dzID0gNTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29scykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHMgPSA0MDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgICAgICBpZiAodmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB3b3JkY291bnQgPSB2YWwuc3BsaXQoIiAiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRjb3VudCA+IHRoaXMub3B0aW9ucy53b3JkbGltaXQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNdWx0aS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dGFyZWEgZmllbGQgZm9yIG11bHRpcGxlIGxpbmUgdGV4dC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIHJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogNDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXb3JkIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpbWl0cyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFsbG93ZWQgaW4gdGhlIHRleHQgYXJlYS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIndvcmRMaW1pdEV4Y2VlZGVkIjogIlRoZSBtYXhpbXVtIHdvcmQgbGltaXQgb2YgezB9IGhhcyBiZWVuIGV4Y2VlZGVkLiIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRleHRhcmVhIiwgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY2hlY2tib3giOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Yoc2VsZi5zY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIG1vZGUKCiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgZW51bSB2YWx1ZXMsIGNvcHkgdGhlbSBpbnRvIGNoZWNrYm94IG9wdGlvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLmdldEVudW0oKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBlbnVtZXJhdGVkIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydEVudW0oKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgICAgICQuZWFjaChzZWxmLmdldEVudW0oKSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbkxhYmVscykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbdmFsdWVdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdGV4dAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkICJkYXRhc291cmNlIiwgd2UgY29weSB0byAiZGF0YVNvdXJjZSIKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZSAmJiAhc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgbW9kZQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmlnaHRMYWJlbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGVja2JveE9wdGlvbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuY2hlY2tib3hPcHRpb25zID0gc2VsZi5jaGVja2JveE9wdGlvbnM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIGlmICghdmFsdWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMuZW51bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5lbnVtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBPVkVSUklERQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbkxhYmVsczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaXRlbXMgJiYgdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVscykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLm9wdGlvbnMuaXRlbXMub3B0aW9uTGFiZWxzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXIgZm9yIHRoZSBldmVudCB0aGF0IHRoZSBjaGVja2JveCBpcyBjbGlja2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNiZWZvcmVSZW5kZXJDb250cm9sCiAgICAgICAgICovCiAgICAgICAgYmVmb3JlUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIG11bHRpcGxlIG1vZGUKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuY2hlY2tib3hPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5jaGVja2JveE9wdGlvbnMsIG1vZGVsLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGJ1aWxkIG91dCB0aGUgZW51bSBhbmQgb3B0aW9uTGFiZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2VudW0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3B0aW9uTGFiZWxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hlY2tib3hPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lbnVtLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLmNoZWNrYm94T3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEVudW0oX2VudW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25MYWJlbHMoX29wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhICYmIHR5cGVvZihzZWxmLmRhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHNlbGYuZGF0YSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZm9yIG11bHRpcGxlIG1vZGUsIG1hcmsgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG5vbmUgY2hlY2tlZAogICAgICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhQXJyYXkgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5kYXRhKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheSA9IHNlbGYuZGF0YS5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBkYXRhQXJyYXkubGVuZ3RoOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUFycmF5W2FdID0gJC50cmltKGRhdGFBcnJheVthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YUFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveFtkYXRhLWNoZWNrYm94LXZhbHVlPVwiIiArIGRhdGFBcnJheVtrXSArICJcIl0iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyB3aGVuZXZlciB0aGUgc3RhdGUgb2Ygb25lIG9mIG91ciBpbnB1dDpjaGVja2JveCBjb250cm9scyBpcyBjaGFuZ2VkIChlaXRoZXIgdmlhIGEgY2xpY2sgb3IgcHJvZ3JhbW1hdGljYWxseSksCiAgICAgICAgICAgICAgICAvLyB3ZSBzaWduYWwgdG8gdGhlIHRvcC1sZXZlbCBmaWVsZCB0byBmaXJlIHVwIGEgY2hhbmdlCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGRlcGVuZGVuY3kgc3lzdGVtIHRvIHJlY2FsY3VsYXRlIGFuZCBzdWNoCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3giKS5jaGFuZ2UoZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBzY2FsYXIgdmFsdWUKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgdmFsdWVzCiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hlY2tib3hPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dEZpZWxkID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC1pbmRleD0nIiArIGkgKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmNoZWNrZWQoaW5wdXRGaWVsZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9ICQoaW5wdXRGaWVsZCkuYXR0cigiZGF0YS1jaGVja2JveC12YWx1ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyB3ZSdyZSBnb2luZyB0byBoYW5kIHRoaXMgdmFsdWUgYmFjawoKICAgICAgICAgICAgICAgIC8vIGlmIHR5cGUgPT0gImFycmF5Iiwgd2UganVzdCBoYW5kIGJhY2sgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJzdHJpbmciLCB3ZSBidWlsZCBhIGNvbW1hLWRlbGltaXRlZCBsaXN0CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmpvaW4oIiwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4sIHN0cmluZyAoInRydWUiKSwgc3RyaW5nICgiYSxiLGMiKSBvciBhbiBhcnJheSBvZiB2YWx1ZXMKCiAgICAgICAgICAgIHZhciBhcHBseVNpbmdsZVZhbHVlID0gZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPT09ICJ0cnVlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQiKTsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgYXBwbHlNdWx0aVZhbHVlID0gZnVuY3Rpb24odmFsdWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgY29tbWEtZGVsaW1pdGVkIHN0cmluZ3MKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdHJpbSB0aGluZ3MgdG8gcmVtb3ZlIGFueSBleGNlc3Mgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IEFscGFjYS50cmltKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHZhbHVlcyBhbmQgYXNzaWduIGludG8gYXBwcm9wcmlhdGUgaW5wdXRzCiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dFtkYXRhLWNoZWNrYm94LXZhbHVlXSIpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dFtkYXRhLWNoZWNrYm94LXZhbHVlPVwiIiArIHZhbHVlc1tqXSArICJcIl0iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGxpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgdmFsdWUgbW9kZQoKICAgICAgICAgICAgICAgIC8vIGJvb2xlYW4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09PSAiYm9vbGVhbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YodmFsdWUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseVNpbmdsZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseU11bHRpVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFwcGxpZWQgJiYgdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2hlY2tib3hGaWVsZCBjYW5ub3Qgc2V0IHZhbHVlIGZvciBzY2hlbWEudHlwZT0iICsgc2VsZi5zY2hlbWEudHlwZSArICIgYW5kIHZhbHVlPSIgKyB2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5IGluIHRoZSBjYXNlIHRoYXQgdGhlIGNoZWNrYm94IGZpZWxkIGlzIGluIG11bHRpcGxlIG1vZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWwgPSBzZWxmLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CgogICAgICAgICAgICBpZiAoIXNlbGYuaXNSZXF1aXJlZCgpICYmIEFscGFjYS5pc1ZhbEVtcHR5KHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB2YWwgaXMgYSBzdHJpbmcsIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCIsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuYW55RXF1YWxpdHkodmFsLCBzZWxmLmdldEVudW0oKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CgogICAgICAgICAgICBzZWxmLmNvbnZlcnRUb0RhdGFWYWx1ZShzY2FsYXJWYWx1ZSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgICAgICAvLyBzdG9yZSBzY2FsYXIgdmFsdWUgb250byBjb250cm9sCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wudmFsKHNjYWxhclZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIG9ic2VydmFibGVzIGFuZCB1cGRhdGVzCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0sCgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNoZWNrYm94IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCBmb3IgYm9vbGVhbiAodHJ1ZS9mYWxzZSksIHN0cmluZyAoJ3RydWUnLCAnZmFsc2UnIG9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgb2YgdmFsdWVzKSBvciBkYXRhIGFycmF5LiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgcmlnaHQtaGFuZCBzaWRlIGxhYmVsIGZvciBzaW5nbGUgY2hlY2tib3ggZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byByZW5kZXIgbXVsdGlwbGUgY2hlY2tib3hlcyBmb3IgbXVsdGktdmFsdWVkIHR5cGUgKHN1Y2ggYXMgYW4gYXJyYXkgb3IgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhU291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgc291cmNlIGZvciBnZW5lcmF0aW5nIGxpc3Qgb2Ygb3B0aW9ucy4gIFRoaXMgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uICBJZiBhIHN0cmluZywgaXQgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB0byBhIHNlcnZpY2UgdGhhdCBwcm9kdWNlcyBhIG9iamVjdCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycyBvciBhbiBhcnJheSBvZiBlbGVtZW50cyBvZiBzdHJ1Y3R1cmUgeyd0ZXh0JzogJycsICd2YWx1ZSc6ICcnfS4gIFRoaXMgY2FuIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBwcm9kdWNlIHRoZSBzYW1lIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVzZURhdGFTb3VyY2VBc0VudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJVc2UgRGF0YSBTb3VyY2UgYXMgRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gdGhlIGZpZWxkJ3Mgc2NoZW1hIGVudW0gcHJvcGVydHkgdG8gdGhlIHZhbHVlcyB0aGF0IGNvbWUgYmFjayBmcm9tIHRoZSBkYXRhIHNvdXJjZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNoZWNrYm94IiwgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImJvb2xlYW4iLCAiY2hlY2tib3giKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImZpbGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICB9LAoKICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uSGFuZGxlcihlLnRhcmdldC5maWxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcm9jZXNzU2VsZWN0aW9uSGFuZGxlcjogZnVuY3Rpb24oZmlsZXMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgSFRNTDUgRmlsZVJlYWRlciwgd2UgY2FuIHB1bGwgaW4gdGhlIHN0cmVhbSBmb3IgcHJldmlldwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihGaWxlUmVhZGVyKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIGxvYWRlZCBkYXRhCiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRlZERhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZENvdW50ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVXJpID0gZXZlbnQudGFyZ2V0LnJlc3VsdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWREYXRhLnB1c2goZGF0YVVyaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnQrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZENvdW50ID09PSBmaWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQub3B0aW9ucy5zZWxlY3Rpb25IYW5kbGVyLmNhbGwoZmllbGQsIGZpbGVzLCBsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KS5jYWxsKHRoaXMpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciB1cGxvYWRpbmcgZmlsZXMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uSGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNlbGVjdGlvbiBIYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGZpbGVzIGFyZSBzZWxlY3RlZC4gIFJlcXVpcmVzIEhUTUw1LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uSGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImZpbGUiLCBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgIGlmIChzZWxmLmdldEVudW0oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgIHNlbGYuc29ydEVudW0oKTsKCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTGFiZWxzID0gc2VsZi5nZXRPcHRpb25MYWJlbHMoKTsKCiAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1tpbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbdmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQXV0byBhc3NpZ24gZGF0YSBpZiB3ZSBoYXZlIGRhdGEgYW5kIHRoZSBmaWVsZCBpcyByZXF1aXJlZCBhbmQgcmVtb3ZlRGVmYXVsdE5vbmUgaXMgZWl0aGVyIHVuc3BlY2lmaWVkIG9yIHRydWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZWxmLmlzUmVxdWlyZWQoKSAmJiAhc2VsZi5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZSA9PT0gdHJ1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudW1WYWx1ZXMgPSBzZWxmLmdldEVudW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyAmJiBlbnVtVmFsdWVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBlbnVtVmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZSAmJiAhc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhU291cmNlID0gc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdlIG9wdGlvbmFsbHkgYWxsb3cgdGhlIGRhdGEgc291cmNlIHJldHVybiB2YWx1ZXMgdG8gb3ZlcnJpZGUgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubm9uZUxhYmVsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm5vbmVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgibm9uZUxhYmVsIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuaGlkZU5vbmUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuaGlkZU5vbmUgPSBzZWxmLmlzUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRm4gPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5kYXRhKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGFyVmFsdWUgPT09IHNlbGYuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW52b2tlRGF0YVNvdXJjZShzZWxmLnNlbGVjdE9wdGlvbnMsIG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGJ1aWxkIG91dCB0aGUgZW51bSBhbmQgb3B0aW9uTGFiZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2VudW0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3B0aW9uTGFiZWxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29wdGlvbkxhYmVscy5wdXNoKHNlbGYuc2VsZWN0T3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEVudW0oX2VudW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25MYWJlbHMoX29wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GbigpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb1NjYWxhclZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvRGF0YVZhbHVlOiBmdW5jdGlvbihzY2FsYXJWYWx1ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGZpZWxkIHZhbHVlIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIERhdGFzb3VyY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0YXNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlbW92ZSBEZWZhdWx0IE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGRlZmF1bHQgJ05vbmUnIG9wdGlvbiB3aWxsIG5vdCBiZSBzaG93bi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm5vbmVMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5vbmUgTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxhYmVsIHRvIHVzZSBmb3IgdGhlICdOb25lJyBvcHRpb24gaW4gYSBsaXN0IChzZWxlY3QsIHJhZGlvIG9yIG90aGVyd2lzZSkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlTm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhpZGUgTm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGhpZGUgdGhlIE5vbmUgb3B0aW9uIGZyb20gYSBsaXN0IChzZWxlY3QsIHJhZGlvIG9yIG90aGVyd2lzZSkuICBUaGlzIHdpbGwgYmUgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVzZURhdGFTb3VyY2VBc0VudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJVc2UgRGF0YSBTb3VyY2UgYXMgRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gdGhlIGZpZWxkJ3Mgc2NoZW1hIGVudW0gcHJvcGVydHkgdG8gdGhlIHZhbHVlcyB0aGF0IGNvbWUgYmFjayBmcm9tIHRoZSBkYXRhIHNvdXJjZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm5vbmVMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlTm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIHRoZSAnTm9uZScgb3B0aW9uIGZyb20gdGhlIGxpc3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vbmVMYWJlbCI6ICJOb25lIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQgPSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInJhZGlvIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5uYW1lKQogICAgICAgICAgICB7CgkJCQl0aGlzLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTsKCQkJfQoJCQllbHNlIGlmICghdGhpcy5uYW1lKQogICAgICAgICAgICB7CgkJCQl0aGlzLm5hbWUgPSB0aGlzLmdldElkKCkgKyAiLW5hbWUiOwoJCQl9CgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHZlcnRpY2FsIG9yaWVudGF0aW9uCiAgICAgICAgICAgIC8vIGVtcHR5IHNlbGVjdCBmaXJzdCB0byBmYWxzZSBieSBkZWZhdWx0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZlcnRpY2FsKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZlcnRpY2FsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCI6Y2hlY2tlZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjbGVhciBhbGwKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQodGhpcyksIG51bGwpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIG1hcmsgc2VsZWN0ZWQgdmFsdWUKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXRbdmFsdWU9XCIiICsgdmFsICsgIlwiXSIpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub25lIHNlbGVjdGVkIGFuZCAiZW1wdHlTZWxlY3RGaXJzdCIsIHRoZW4gc2VsZWN0CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpjaGVja2VkIikubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoc2VsZi5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmZpcnN0KCksICJjaGVja2VkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciBpbnB1dHMgPSAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKTsKCiAgICAgICAgICAgIGlucHV0cy5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaW5wdXRzLmJsdXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC5zZWxlY3RPcHRpb25zID0gc2VsZi5zZWxlY3RPcHRpb25zOwogICAgICAgICAgICAgICAgbW9kZWwucmVtb3ZlRGVmYXVsdE5vbmUgPSBzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmU7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CgogICAgICAgICAgICAgICAgICAgIGlmICgkKCJpbnB1dDpyYWRpbzpjaGVja2VkIiwgc2VsZi5jb250cm9sKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW9bdmFsdWU9XCIiICsgc2VsZi5kYXRhICsgIlwiXSIpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdGFjayByYWRpbyBzZWxlY3RvcnMgdmVydGljYWxseQogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy52ZXJ0aWNhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSAibmFtZSIgcHJvcGVydHkgb24gdGhlIGNvbnRyb2wgaXMga2VwdCBpbiBzeW5jLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvIikuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25DbGljawogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoImlucHV0IikudmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB2YWwpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIGZvciByYWRpbyBidXR0b25zLCB3ZSBhbHNvIG1hcmsgdGhlIG91dGVyIERJViBhcyBkaXNhYmxlZCB0byBwcmV2ZW50IGxhYmVsIGNsaWNrcwogICAgICAgICAgICAvLyBhbmQgYXBwbHkgc29tZSBDU1Mgc3R5bGluZwogICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJhZGlvIEdyb3VwIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCB3aXRoIGxpc3Qgb2Ygb3B0aW9ucy4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KCQlnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJInByb3BlcnRpZXMiOiB7CgkJCQkJIm5hbWUiOiB7CgkJCQkJCSJ0aXRsZSI6ICJGaWVsZCBuYW1lIiwKCQkJCQkJImRlc2NyaXB0aW9uIjogIkZpZWxkIG5hbWUuIiwKCQkJCQkJInR5cGUiOiAic3RyaW5nIgoJCQkJCX0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBvc2l0aW9uIHRoZSByYWRpbyBzZWxlY3RvciBpdGVtcyB2ZXJ0aWNhbGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkJ5IGRlZmF1bHQsIHJhZGlvIGNvbnRyb2xzIGFyZSBzdGFja2VkIHZlcnRpY2FsbHkuICBTZXQgdG8gZmFsc2UgaWYgeW91J2QgbGlrZSByYWRpbyBjb250cm9scyB0byBsYXkgb3V0IGhvcml6b250YWxseS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQoJCQkJfQoJCQl9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAKICAgIH0pOwogICAgCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJyYWRpbyIsIEFscGFjYS5GaWVsZHMuUmFkaW9GaWVsZCk7CiAgICAKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQgPSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gInNlbGVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYVsidHlwZSJdICYmIHNlbGYuc2NoZW1hWyJ0eXBlIl0gPT09ICJhcnJheSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgdHVybiBvbiAiaGlkZU5vbmUiIGlmIHdlJ3JlIGluIG11bHRpc2VsZWN0IG1vZGUgYW5kIGhhdmUgdGhlIG11bHRpc2VsZWN0IHBsdWdpbgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMgYW5kIG1pbkl0ZW1zIG9uIHRoZSBzY2hlbWEuaXRlbXMgc3Vib2JqZWN0LgogICAgICAgICAgICAvLyBpZiBub3QgZGVmaW5lZCBwcm9wZXJseSwgd2Ugb2ZmZXIgc29tZSBhdXRvbWF0aWMgZm9yd2FyZCBtaWdyYXRpb24gb2YgdGhlc2UgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLm1heEl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLm1heEl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5taW5JdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5taW5JdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCAmJiB0eXBlb2Yoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0LmRpc2FibGVJZkVtcHR5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBuZXdTY2FsYXJWYWwgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CiAgICAgICAgICAgIHZhciBjdXJyZW50U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZShzZWxmLmdldFZhbHVlKCkpOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGVuIHNldAogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuY29tcGFyZUFycmF5Q29udGVudChuZXdTY2FsYXJWYWwsIGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkobmV3U2NhbGFyVmFsKSAmJiB0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKG5ld1NjYWxhclZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcHBseSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgQWxwYWNhLmlzRW1wdHkoY3VycmVudFNjYWxhclZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3U2NhbGFyVmFsICE9PSBjdXJyZW50U2NhbGFyVmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYXBwbHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCAmJiB0eXBlb2YobmV3U2NhbGFyVmFsKSAhPT0gInVuZGVmaW5lZCIgJiYgbmV3U2NhbGFyVmFsICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5MaXN0RmllbGQjZ2V0RW51bQogICAgICAgICAqLwogICAgICAgIGdldEVudW06IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjaGVtYVsidHlwZSJdICYmIHRoaXMuc2NoZW1hWyJ0eXBlIl0gPT09ICJhcnJheSIgJiYgdGhpcy5zY2hlbWFbIml0ZW1zIl0gJiYgdGhpcy5zY2hlbWFbIml0ZW1zIl1bImVudW0iXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFbIml0ZW1zIl1bImVudW0iXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBidXR0b24gPSB0aGlzLmNvbnRyb2wucGFyZW50KCkuZmluZCgiYnV0dG9uLm11bHRpc2VsZWN0Iik7CgogICAgICAgICAgICAgICAgYnV0dG9uLmZvY3VzKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgYnV0dG9uLmJsdXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24gKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgb3V0ICJkaXNwbGF5YWJsZVRleHQiCiAgICAgICAgICAgICAgICB2YXIgZGlzcGxheWFibGVUZXh0cyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5zZWxlY3RPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hcFttb2RlbC5zZWxlY3RPcHRpb25zW2ldLnZhbHVlXSA9IG1vZGVsLnNlbGVjdE9wdGlvbnNbaV0udGV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkobW9kZWwuZGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtYXBbbW9kZWwuZGF0YVtpXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZVRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtYXBbbW9kZWwuZGF0YV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZVRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vZGVsLmRpc3BsYXlhYmxlVGV4dCA9IGRpc3BsYXlhYmxlVGV4dHMuam9pbigiLCAiKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIGVtcHR5U2VsZWN0Rmlyc3QgYW5kIG5vdGhpbmcgY3VycmVudGx5IGNoZWNrZWQsIHRoZW4gcGljayBmaXJzdCBpdGVtIGluIHRoZSB2YWx1ZSBsaXN0CiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgdmlzdWFsbHkgc2VsZWN0IGl0CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHNlbGYuZGF0YSkgJiYgc2VsZi5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QgJiYgc2VsZi5zZWxlY3RPcHRpb25zICYmIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuc2VsZWN0T3B0aW9uc1swXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyB0aGlzIGxpdHRsZSB0cmljayBzbyB0aGF0IGlmIHdlIGhhdmUgYSBkZWZhdWx0IHZhbHVlLCBpdCBnZXRzIHNldCBkdXJpbmcgZmlyc3QgcmVuZGVyCiAgICAgICAgICAgICAgICAvLyB0aGlzIGNhdXNlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wKICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBpbiBtdWx0aXBsZSBtb2RlIGFuZCB0aGUgYm9vdHN0cmFwIG11bHRpc2VsZWN0IHBsdWdpbiBpcyBhdmFpbGFibGUsIGJpbmQgaXQgaW4KICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgJiYgJC5mbi5tdWx0aXNlbGVjdCAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzID0gc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCA9ICJOb25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5ub25lTGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCA9IHNlbGYub3B0aW9ucy5ub25lTGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250cm9sRWwoKSkubXVsdGlzZWxlY3Qoc2V0dGluZ3MpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBhZ2FpbnN0IGVudW0gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh2YWwpICYmICFBbHBhY2EuaXNPYmplY3QodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFt2YWxdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHZhbCwgZnVuY3Rpb24oaSx2KSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbkFycmF5ID0gQWxwYWNhLmluQXJyYXkoX3RoaXMuc2NoZW1hWyJlbnVtIl0sIHNjYWxhclZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugd2UncmUgYW4gYXJyYXkgbW9kZWxlZCBvbiBhIHNpbmdsZSBzZWxlY3QsIGp1c3QgdXNlIHRoZSAwdGggZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbFswXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IF90aGlzLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5BcnJheSh0aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CgogICAgICAgICAgICBzZWxmLmNvbnZlcnRUb0RhdGFWYWx1ZShzY2FsYXJWYWx1ZSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgICAgICAvLyBzdG9yZSBzY2FsYXIgdmFsdWUgb250byBjb250cm9sCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wudmFsKHNjYWxhclZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIG9ic2VydmFibGVzIGFuZCB1cGRhdGVzCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluSXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5taW5JdGVtcyAmJiB0aGlzLnNjaGVtYS5taW5JdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJCgiOnNlbGVjdGVkIix0aGlzLmNvbnRyb2wpLmxlbmd0aCA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJCgiOnNlbGVjdGVkIix0aGlzLmNvbnRyb2wpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heEl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZXQgZm9jdXMgb250byB0aGUgc2VsZWN0CiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIGVsLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250cm9sRWwoKSkubXVsdGlzZWxlY3QoImRpc2FibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJlbmFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlbGVjdCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bGl0cGxlIFNlbGVjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNwbGF5ZWQgT3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2Ygb3B0aW9ucyB0byBiZSBzaG93bi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1wdHlTZWxlY3RGaXJzdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVtcHR5IFNlbGVjdCBGaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0aGUgZGF0YSBpcyBlbXB0eSwgdGhlbiBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlzZWxlY3QgUGx1Z2luIFNldHRpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk11bHRpc2VsZWN0IHBsdWdpbiBwcm9wZXJ0aWVzIC0gaHR0cDovL2Rhdmlkc3R1dHouZ2l0aHViLmlvL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFsbG93IG11bHRpcGxlIHNlbGVjdGlvbiA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1wdHlTZWxlY3RGaXJzdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlzZWxlY3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIk11bHRpc2VsZWN0IHBsdWdpbiBwcm9wZXJ0aWVzIC0gaHR0cDovL2Rhdmlkc3R1dHouZ2l0aHViLmlvL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInNlbGVjdCIsIEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJudW1iZXIiOwogICAgICAgICAgICAvLyBUT0RPOiB3ZSBjYW4ndCBkbyB0aGlzIGJlY2F1c2UgQ2hyb21lIHNjcmV3cyB1cCBpdCdzIGhhbmRsaW5nIG9mIG51bWJlciB0eXBlCiAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB1cyBmcm9tIHZhbGlkYXRpbmcgcHJvcGVybHkKICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE2NDIwODI4L2pxdWVyeS12YWwtcmVmdXNlcy10by1yZXR1cm4tbm9uLW51bWVyaWMtaW5wdXQtZnJvbS1hLW51bWJlci1maWVsZC11bmRlci1jaHJvbWUKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5udW1lcmljRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZSB8fCAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubnVtZXJpY0VudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIChrZXkgPj0gNDggJiYga2V5IDw9IDU3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBldmVuIGFsbG93IGVudHJ5IG9mIGludmFsaWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PSAidW5kZWZpbmVkIiB8fCAiIiA9PSB2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTnVtYmVyKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoInN0cmluZ05vdEFOdW1iZXIiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGl2aXNpYmxlQnkoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ0RpdmlzaWJsZUJ5IiksIFt0aGlzLnNjaGVtYS5kaXZpc2libGVCeV0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhpbXVtKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIiIsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICghc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXVsibWVzc2FnZSJdID0gQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIiksIFt0aGlzLnNjaGVtYS5tYXhpbXVtXSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXVsibWVzc2FnZSJdID0gQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdWYWx1ZVRvb0xhcmdlIiksIFt0aGlzLnNjaGVtYS5tYXhpbXVtXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluaW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWluaW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29TbWFsbCIpLCBbdGhpcy5zY2hlbWEubWluaW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU11bHRpcGxlT2YoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIiksIFt0aGlzLnNjaGVtYS5tdWx0aXBsZU9mXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmQgYmFjayBhIHRydWUvZmFsc2UKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdEaXZpc2libGVCeSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vU21hbGwiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb0xvbmciXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vU2hvcnQiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgcmVxdWlyZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gRmFsc2UgaWYgdGhpcyBmaWVsZCB2YWx1ZSBpcyBlbXB0eSBidXQgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU9wdGlvbmFsOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSgkKHRoaXMuY29udHJvbCkudmFsKCkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgZmxvYXQgbnVtYmVyLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgZmxvYXQgbnVtYmVyCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTnVtYmVyOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBhcyB0ZXh0CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGV4dFZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRleHRWYWx1ZSA9ICIiICsgdGV4dFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbGxvdyBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbGlkIG51bWJlciBmb3JtYXQKICAgICAgICAgICAgdmFyIHZhbGlkTnVtYmVyID0gQWxwYWNhLnRlc3RSZWdleChBbHBhY2EucmVnZXhwcy5udW1iZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBkaXZpc2libGVCeSBjb25zdHJhaW50LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IHBhc3NlcyB0aGUgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEaXZpc2libGVCeTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLmRpdmlzaWJsZUJ5KSkgewoKICAgICAgICAgICAgICAgIC8vIG1vZAogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJSB0aGlzLnNjaGVtYS5kaXZpc2libGVCeSAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhpbXVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heGltdW0pKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA+IHRoaXMuc2NoZW1hLm1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09IHRoaXMuc2NoZW1hLm1heGltdW0gJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG1pbmltdW0gY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5pbXVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1pbmltdW0pKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA8IHRoaXMuc2NoZW1hLm1pbmltdW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09IHRoaXMuc2NoZW1hLm1pbmltdW0gJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG11bHRpcGxlT2YgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG11bHRpcGxlT2YgY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNdWx0aXBsZU9mOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm11bHRpcGxlT2YpKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSAmJiB0aGlzLnNjaGVtYS5tdWx0aXBsZU9mICE9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmKEFscGFjYS5pc051bWJlcihuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoIDw9IHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1heExlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmKEFscGFjYS5pc051bWJlcihuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID49IHNlbGYuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzIpIC8vIHNwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGlzYWxsb3dFbXB0eVNwYWNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgYXBwbGljYWJsZSwgdXBkYXRlIHRoZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRrZXl1cCIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGtleXVwIik7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlT2YiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWx0aXBsZSBPZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2Ygc2NoZW1hIHByb3BlcnR5IHN1Y2ggdGhhdCBkaXZpc2lvbiBieSB0aGlzIHZhbHVlIHlpZWxkcyBhbiBpbnRlcmdlciAobW9kIHplcm8pLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFeGNsdXNpdmUgTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBjYW4gbm90IGVxdWFsIHRoZSBudW1iZXIgZGVmaW5lZCBieSB0aGUgbWluaW11bSBzY2hlbWEgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNYXhpbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1heGltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc1NjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHZhbHVlIG11c3QgYmUgYSBpbnRlZ3JhbCBtdWx0aXBsZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRXhjbHVzaXZlIG1pbmltdW0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gYnV0IG5vdCBlcXVhbCB0byB0aGlzIG51bWJlciBpZiBjaGVja2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRXhjbHVzaXZlIE1heGltdW0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gYnV0IG5vdCBlcXVhbCB0byB0aGlzIG51bWJlciBpZiBjaGVja2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibnVtZXJpY0VudHJ5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTnVtZXJpYyBFbnRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGNvbnN0cmFpbiBkYXRhIGVudHJ5IGtleSBwcmVzc2VzIHRvIG51bWVyaWMgdmFsdWVzICgwLTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTnVtYmVyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBmbG9hdCBudW1iZXJzLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJUaGUgbWluaW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIHswfSIsCiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmFsdWUgb2YgdGhpcyBmaWVsZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBsZXNzIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAiVGhlIHZhbHVlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHswfSIsCiAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIiwKICAgICAgICAic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgezB9IgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJudW1iZXIiLCBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm51bWJlciIsICJudW1iZXIiKTsKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQgPSBBbHBhY2EuQ29udGFpbmVyRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBpdGVtOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY29udGFpbmVySXRlbVRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci0iICsgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSArICItaXRlbSIsIHNlbGYpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJTdHlsZSkgPyAiYnV0dG9uIiA6IHRoaXMudmlldy50b29sYmFyU3R5bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSBBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcuYWN0aW9uYmFyU3R5bGUpID8gInRvcCIgOiB0aGlzLnZpZXcuYWN0aW9uYmFyU3R5bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSA9ICJ0b3AiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24gPSBBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclBvc2l0aW9uKSA/ICJ0b3AiIDogdGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24gPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5pdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvZmZlciBzb21lIGJhY2t3YXJkIGNvbXBhYmlsaXR5IGhlcmUgYXMgb2xkZXIgdmVyc2lvbiBvZiBBbHBhY2EgdXNlZCB0byBpbmNvcnJlY3RseSBsb29rIGZvcgogICAgICAgICAgICAvLyBtYXhJdGVtcywgbWluSXRlbXMgYW5kIHVuaXF1ZUl0ZW1zIG9uIHRoZSBzY2hlbWEuaXRlbXMgc3Vib2JqZWN0LgogICAgICAgICAgICAvLyBpZiBub3QgZGVmaW5lZCBwcm9wZXJseSwgd2Ugb2ZmZXIgc29tZSBhdXRvbWF0aWMgZm9yd2FyZCBtaWdyYXRpb24gb2YgdGhlc2UgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLm1heEl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLm1heEl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5taW5JdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5taW5JdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIHVzaW5nICJydWJ5IG9uIHJhaWxzIiBjb21wYXRpYmlsaXR5IG1vZGUKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub3B0aW9ucyAmJiB0aGlzLnBhcmVudC5vcHRpb25zLmZvcm0gJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMucnVieXJhaWxzKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucnVieXJhaWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRvb2xiYXJTdGlja3kgPSBBbHBhY2EuZGVmYXVsdFRvb2xiYXJTdGlja3k7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3RpY2t5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9vbGJhclN0aWNreSA9IHRoaXMudmlldy50b29sYmFyU3RpY2t5OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9vbGJhclN0aWNreSA9IHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSA9IHRvb2xiYXJTdGlja3k7CgogICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBoaWRlIHRvb2xiYXIgd2hlbiBjaGlsZHJlbi5jb3VudCA+IDAKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuaGlkZVRvb2xiYXJXaXRoQ2hpbGRyZW4pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRW5hYmxlIGZvcmNlUmV2YWxpZGF0aW9uIG9wdGlvbiBzbyB0aGF0IGFueSBjaGFuZ2UgaW4gY2hpbGRyZW4gd2lsbCB0cmlnZ2VyIHBhcmVudCdzIHJldmFsaWRhdGlvbi4KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuZGF0YSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIiIgPT0gdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdG8gYmUgYSBzZXJpYWxpemVkIGFycmF5IG9yIG9iamVjdCwgY29udmVydAogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlZEpTT04gPSBBbHBhY2EucGFyc2VKU09OKHRoaXMuZGF0YSk7CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkocGFyc2VkSlNPTikgJiYgIUFscGFjYS5pc09iamVjdChwYXJzZWRKU09OKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIHBhcnNlZCBzdHJpbmcgZGF0YSBidXQgaXQgd2FzIG5vdCBhbiBhcnJheTogIiArIHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHBhcnNlZEpTT047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUganVzdCBhIHN0cmluZyB2YWx1ZSwgcHV0IGludG8gYXJyYXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbdGhpcy5kYXRhXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLmRhdGEpICYmICFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIkFycmF5RmllbGQgZGF0YSBpcyBub3QgYW4gYXJyYXk6ICIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQUNUSU9OUwogICAgICAgICAgICAvLwogICAgICAgICAgICB2YXIgYXBwbHlBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25zLCBrZXksIGFjdGlvbkNvbmZpZykgewogICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNlbGYuZmluZEFjdGlvbihhY3Rpb25zLCBrZXkpOwogICAgICAgICAgICAgICAgaWYgKCFhY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJjb3JlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGFjdGlvbkNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGlmICghYWN0aW9uW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbltrXSA9IGFjdGlvbkNvbmZpZ1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjbGVhbnVwQWN0aW9ucyA9IGZ1bmN0aW9uKGFjdGlvbnMsIHNob3dMYWJlbHMpIHsKICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgIGRvIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYWN0aW9uc1tpXS5lbmFibGVkKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1tpXS5lbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgbGFiZWwgaWYgZ2xvYmFsIGRpc2FibGUKICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dMYWJlbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFjdGlvbnNbaV0ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbnNbaV0uZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBhY3Rpb25zLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgLy8gc29ydCBzbyB0aGF0IGNvcmUgYWN0aW9ucyBhcHBlYXIgZmlyc3QKICAgICAgICAgICAgICAgIGFjdGlvbnMuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEuY29yZSAmJiAhYi5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmNvcmUgJiYgYi5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc2V0IHVwIGRlZmF1bHQgYWN0aW9ucyBmb3IgdGhlIHRvcCBhcnJheSB0b29sYmFyCiAgICAgICAgICAgIHNlbGYudG9vbGJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRvb2xiYXIpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXJba10gPSBBbHBhY2EuY29weU9mKHNlbGYub3B0aW9ucy50b29sYmFyW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYudG9vbGJhci5zaG93TGFiZWxzKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNlbGYudG9vbGJhci5zaG93TGFiZWxzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYudG9vbGJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuYWN0aW9ucyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCAiYWRkIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJhZGRJdGVtQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlVG9vbEJhckFkZEl0ZW1DbGljayhmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYudG9vbGJhci5hY3Rpb25zLCBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyk7CgogICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBhZGQgaW50byB0aGUgcGVyLWl0ZW0gYWN0aW9uYmFyCiAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyID0ge307CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrMiBpbiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25iYXJbazJdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMuYWN0aW9uYmFyW2syXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYuYWN0aW9uYmFyLmFjdGlvbnMpIHsKICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAiYWRkIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJhZGRCdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJhZGQiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgiYWRkSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhckFkZEl0ZW1DbGljayhpdGVtSW5kZXgsIGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgInJlbW92ZSIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgicmVtb3ZlQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicmVtb3ZlIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoInJlbW92ZUljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJSZW1vdmVJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJ1cCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgidXBCdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJ1cCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJ1cEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImRvd24iLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoImRvd25CdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJkb3duIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImRvd25JY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYW51cEFjdGlvbnMoc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscyk7CgogICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGRhdGEgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5kYXRhKTsKICAgICAgICAgICAgZGF0YS5sZW5ndGggPSBsZW47CgogICAgICAgICAgICB0aGlzLmRhdGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkYXRhKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhcGFydCB0aGUgYXJyYXkgYW5kIHNldCBvbnRvIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFBbHBhY2EuaXNBcnJheShkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgZmllbGRzCiAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IGkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEZpZWxkLnNldFZhbHVlKGRhdGFbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlSXRlbShpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkYXRhIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGNoaWxkIGVsZW1lbnRzCiAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBhZGQgdGhlIG5ldyBmaWVsZHMKICAgICAgICAgICAgaWYgKGkgPCBkYXRhLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbVNjaGVtYSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVW5hYmxlIHRvIHJlc29sdmUgc2NoZW1hIGZvciBpdGVtOiAiICsgaSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHdhdGVyZmFsbCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gKGZ1bmN0aW9uKGksIGRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaSwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGRhdGFbaV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaSwgZGF0YSk7CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jcy5wdXNoKGYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UncmUgZW1wdHkgYW5kIHdlJ3JlIGFsc28gbm90IHJlcXVpcmVkLCB0aGVuIHdlIGhhbmQgYmFjayBlbXB0eSBzZXQKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGNvbnN0cnVjdCBhbiBhcnJheSBhbmQgaGFuZCBpdCBiYWNrCiAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYodiAhPT0gdikgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIHYgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgby5wdXNoKHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqCiAgICAgICAgICogQ3JlYXRlcyBzdWItaXRlbXMgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5kYXRhICYmIHNlbGYuZGF0YS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdG90YWxJdGVtQ291bnQgPSBzZWxmLmRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGl0ZW1zQnlJbmRleCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vIGFsbCBpdGVtcyB3aXRoaW4gdGhlIGFycmF5IGhhdmUgdGhlIHNhbWUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBvbmx5IG5lZWQgdG8gbG9hZCB0aGlzIG9uY2UKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHdhdGVyZmFsbCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2VsZi5kYXRhLmxlbmd0aDsgaW5kZXgrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuZGF0YVtpbmRleF07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGYgPSAoZnVuY3Rpb24oaW5kZXgsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKGluZGV4LCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgdmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlJbmRleFtpbmRleF0gPSBpdGVtOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB9KShpbmRleCwgdmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChwZik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwoZnVuY3MsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBpbnRlbmRlZCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsSXRlbUNvdW50OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNCeUluZGV4W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBjcmVhdGVJdGVtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICogQHBhcmFtIGl0ZW1TY2hlbWEKICAgICAgICAgKiBAcGFyYW0gaXRlbU9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0gaXRlbURhdGEKICAgICAgICAgKiBAcGFyYW0gcG9zdFJlbmRlckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWF4SXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBmb3JtRWwuYWxwYWNhKHsKICAgICAgICAgICAgICAgICAgICAiZGF0YSIgOiBpdGVtRGF0YSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgICAgICJzY2hlbWEiIDogaXRlbVNjaGVtYSwKICAgICAgICAgICAgICAgICAgICAidmlldyIgOiB0aGlzLnZpZXcuaWQgPyB0aGlzLnZpZXcuaWQgOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKGVycikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAicmVuZGVyIjogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhcmVudCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIGl0ZW0gcGF0aAogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArICJbIiArIGluZGV4ICsgIl0iOwogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpZWxkQ29udHJvbC5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscGFjYSBmaW5pc2hlZAoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1FbCA9IEFscGFjYS50bXBsKHNlbGYuY29udGFpbmVySXRlbVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHNlbGYub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSwKCQkJCQkJCSJ0b29sYmFyTG9jYXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhckxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblBvaW50RWwgPSAkKGNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiQ2Fubm90IGZpbmQgaW5zZXJ0aW9uIHBvaW50IGZvciBmaWVsZDogIiArIHNlbGYuZ2V0SWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW50byBwbGFjZQogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnRFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNvbnRhaW5lckl0ZW1FbCA9IGNvbnRhaW5lckl0ZW1FbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgYWZ0ZXIgcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihjb250cm9sLCBmdW5jdGlvbihfY29udHJvbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUjogaHR0cHM6Ly9naXRodWIuY29tL2dpdGFuYS9hbHBhY2EvcHVsbC8xMjQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLml0ZW1zLnBvc3RSZW5kZXIuY2FsbChjb250cm9sLCBpbnNlcnRpb25Qb2ludEVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlbmRlckNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMgdG8gdXRpbGl6ZSBmb3IgaXRlbXMgd2l0aGluIHRoaXMgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhdmVhdDogIGlmIHdlJ3JlIGluIHJlYWQtb25seSBtb2RlLCB0aGUgY2hpbGQgbXVzdCBhbHNvIGJlIGluIHJlYWQtb25seSBtb2RlCiAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkSXRlbVNjaGVtYSwgcmVzb2x2ZWRJdGVtT3B0aW9ucywgY2lyY3VsYXIpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGl0ZW1PcHRpb25zOwogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCBmb3Igb3B0aW9ucy5maWVsZHMuaXRlbQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbSkgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLmZpZWxkcy5pdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXRlbU9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zLml0ZW1zKSB7CiAgICAgICAgICAgICAgICBpdGVtT3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuaXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGl0ZW1TY2hlbWE7CiAgICAgICAgICAgIGlmIChfdGhpcy5zY2hlbWEgJiYgX3RoaXMuc2NoZW1hLml0ZW1zKSB7CiAgICAgICAgICAgICAgICBpdGVtU2NoZW1hID0gX3RoaXMuc2NoZW1hLml0ZW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAoaXRlbVNjaGVtYSAmJiBpdGVtU2NoZW1hWyIkcmVmIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzY2hlbWFSZWZlcmVuY2VJZCA9IGl0ZW1TY2hlbWFbIiRyZWYiXTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnNbIiRyZWYiXSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNSZWZlcmVuY2VJZCA9IGl0ZW1PcHRpb25zWyIkcmVmIl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWVsZENoYWluID0gW3RvcEZpZWxkXTsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRDaGFpbi5wdXNoKHRvcEZpZWxkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtU2NoZW1hID0gaXRlbVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEl0ZW1PcHRpb25zID0gaXRlbU9wdGlvbnM7CgogICAgICAgICAgICAgICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zKHRvcEZpZWxkLCBzY2hlbWFSZWZlcmVuY2VJZCwgb3B0aW9uc1JlZmVyZW5jZUlkLCBmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmaWVsZCBjaGFpbiB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2lyY3VsYXJpdHkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRDaGFpbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZENoYWluW2ldLnNjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09IHNjaGVtYVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHNjaGVtYVJlZmVyZW5jZUlkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChmaWVsZENoYWluW2ldLnNjaGVtYVsiJHJlZiJdID09PSBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgaGlnaGVyIGxpbWl0IGZvciBhcnJheXMsIHBlcmhhcHMgMTAKICAgICAgICAgICAgICAgICAgICAvL3ZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEwKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkSXRlbVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEl0ZW1TY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgb3JpZ2luYWxJdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtU2NoZW1hLCBpdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc29sdmVkSXRlbVNjaGVtYS5pZDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkSXRlbU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgb3JpZ2luYWxJdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1PcHRpb25zLCBpdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubmV4dFRpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZVVuaXF1ZUl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJ2YWx1ZU5vdFVuaXF1ZSIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWF4SXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluSXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoIm5vdEVub3VnaEl0ZW1zIiksIFt0aGlzLnNjaGVtYS5taW5JdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidmFsdWVOb3RVbmlxdWUiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl1bInN0YXR1cyJdICYmIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWF4SXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNYXhJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1heEl0ZW1zICYmIHRoaXMuc2NoZW1hLm1heEl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA+PSB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFcXVhbE1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpIDw9IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpIDwgdGhpcy5zY2hlbWEubWluSXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIG92ZXIgbWF4SXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIG92ZXIgbWF4SXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1heEl0ZW1zICYmIHRoaXMuc2NoZW1hLm1heEl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA+IHRoaXMuc2NoZW1hLm1heEl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGFsbCBpdGVtcyBhcmUgdW5pcXVlLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGFsbCBpdGVtcyBhcmUgdW5pcXVlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVVuaXF1ZUl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBoYXNoID0ge307CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaFtrZXldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGFzaFtrZXldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgZmluZEFjdGlvbjogZnVuY3Rpb24oYWN0aW9uc0FycmF5LCBhY3Rpb25LZXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYWN0aW9uID0gbnVsbDsKCiAgICAgICAgICAgICQuZWFjaChhY3Rpb25zQXJyYXksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgIGlmICh2LmFjdGlvbiA9PT0gYWN0aW9uS2V5KSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBhY3Rpb247CiAgICAgICAgfSwKCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGFyZSB6ZXJvIGNoaWxkcmVuLCBzaG93IHRoZSBhcnJheSB0b29sYmFyCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qCiAgICAgICAgYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtczogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGFyZSB6ZXJvIGNoaWxkcmVuLCBzaG93IHRoZSBhcnJheSB0b29sYmFyCiAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBjaGlsZHJlbi4KICAgICAgICAgKi8KICAgICAgICBnZXRTaXplOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBPVkVSUklERQogICAgICAgICAqCiAgICAgICAgICogQWRqdXN0IHRoZSBwYXRoIGFuZCBuYW1lIGFoZWFkIG9mIHJlZnJlc2hpbmcgdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnVwZGF0ZVBhdGhBbmROYW1lKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGludm9rZWQgYWZ0ZXIgaXRlbXMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkLCByZW1vdmVkIG9yIG1vdmVkIGFyb3VuZCBpbiB0aGUgY2hpbGQgY2hhaW4uCiAgICAgICAgICogSXQgYWRqdXN0cyBjbGFzc2VzIG9uIGNoaWxkIERPTSBlbGVtZW50cyB0byBtYWtlIHN1cmUgdGhleSdyZSBjb3JyZWN0LgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBhdGhBbmROYW1lOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdXBkYXRlQ2hpbGRyZW5QYXRoQW5kTmFtZSA9IGZ1bmN0aW9uKHBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2gocGFyZW50LmNoaWxkcmVuLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZVBhdGggJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5wYXRoLCBwYXJlbnQucHJlUGF0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlUGF0aCA9IHYucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucGF0aCA9IHYucGF0aC5yZXBsYWNlKHBhcmVudC5wcmVQYXRoLCBwYXJlbnQucGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQucHJlTmFtZSAmJiBBbHBhY2Euc3RhcnRzV2l0aCh2Lm5hbWUsIHBhcmVudC5wcmVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5uYW1lLnJlcGxhY2UocGFyZW50LnByZU5hbWUsIHBhcmVudC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodi5maWVsZCkuYXR0cigibmFtZSIsIHYubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUodik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSB2LnBhdGgubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdFNlZ21lbnQgPSB2LnBhdGguc3Vic3RyaW5nKGlkeCsxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50LmluZGV4T2YoIlsiKSA+IDAgJiYgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHBhcnNlSW50KGxhc3RTZWdtZW50LnN1YnN0cmluZyhsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgKyAxLCBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggIT09IGkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHYucGF0aCA9IHYucGF0aC5zdWJzdHJpbmcoMCwgaWR4KSArICIvIiArIGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBsYXN0U2VnbWVudC5pbmRleE9mKCJbIikpICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgKHYubmFtZUNhbGN1bGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZU5hbWUgPSB2Lm5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5wYXJlbnQgJiYgdi5wYXJlbnQubmFtZSAmJiB2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYucGFyZW50Lm5hbWUgKyAiXyIgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhdGgucmVwbGFjZSgvXC8vZywgIiIpLnJlcGxhY2UoL1xbL2csICJfIikucmVwbGFjZSgvXF0vZywgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQub3B0aW9ucy5ydWJ5cmFpbHMgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2LnBhcmVudC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodi5maWVsZCkuYXR0cigibmFtZSIsIHYubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXYucHJlUGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlUGF0aCA9IHYucGF0aDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUodik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHN0YXR1cyBvZiBhcnJheSBpdGVtIGFjdGlvbiB0b29sYmFyIGJ1dHRvbnMuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlVG9vbGJhcnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXkgbW9kZSwgd2UgZG8gbm90IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiZGlzcGxheSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gcmVhZG9ubHkgbW9kZSwgZG9uJ3QgZG8gdGhpcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyZSBjYWxsYmFja3MgdG8gdmlldyB0byByZW1vdmUgYW5kIGNyZWF0ZSB0b29sYmFyCiAgICAgICAgICAgIGlmIChzZWxmLnRvb2xiYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheVRvb2xiYXIiLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheVRvb2xiYXIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyZSBjYWxsYmFja3MgdG8gdmlldyB0byByZW1vdmUgYW5kIGNyZWF0ZSBhbiBhY3Rpb25iYXIgZm9yIGVhY2ggaXRlbQogICAgICAgICAgICBpZiAoc2VsZi5hY3Rpb25iYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheUFjdGlvbmJhcnMiLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheUFjdGlvbmJhcnMiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVE9PTEJBUgogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdmFyIHRvb2xiYXJFbCA9ICQodGhpcy5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktdG9vbGJhcltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgIiddIik7CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaG93IHRvb2xiYXIKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5zaG93KCk7CgogICAgICAgICAgICAgICAgLy8gQ0xJQ0s6IGFycmF5IHRvb2xiYXIgYnV0dG9ucwogICAgICAgICAgICAgICAgJCh0b29sYmFyRWwpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uS2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi50b29sYmFyLmFjdGlvbnMsIGFjdGlvbktleSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykub2ZmKCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmNsaWNrLmNhbGwoc2VsZiwgYWN0aW9uS2V5LCBhY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTkJBUgogICAgICAgICAgICAvLwoKICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHVzaW5nIHRoZSAic3RpY2t5IiB0b29sYmFyLCB0aGVuIHNob3cgYW5kIGhpZGUgdGhlIGl0ZW0gYWN0aW9uIGJ1dHRvbnMgd2hlbiBob3ZlcmVkCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpID09PSAidW5kZWZpbmVkIiB8fCB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSA9PT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCBlYWNoIGl0ZW0KICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0RmllbGRFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpOwogICAgICAgICAgICAgICAgJChpdGVtcykuZWFjaChmdW5jdGlvbihpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgYWN0aW9uYmFyIGZvciB0aGlzIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGZyb20gY29udGFpbmVySXRlbUVsCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVsID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ11bZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXg9JyIgKyBpdGVtSW5kZXggKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uYmFyRWwgJiYgYWN0aW9uYmFyRWwubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWx3YXlzIHNob3cgdGhlIGFjdGlvbmJhcnMKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddIikuY3NzKCJkaXNwbGF5IiwgImlubGluZS1ibG9jayIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWx3YXlzIGhpZGUgdGhlIGFjdGlvbmJhcnMKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddIikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDTElDSzogYWN0aW9uYmFyIGJ1dHRvbnMKICAgICAgICAgICAgLy8gTk9URTogYWN0aW9uYmFyRWxzIHNpemUgc2hvdWxkIGJlIDAgb3IgMQogICAgICAgICAgICB2YXIgYWN0aW9uYmFyRWxzID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SW5kZXggPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4Iik7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRhcmdldEluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJpbmQgYnV0dG9uIGNsaWNrIGhhbmRsZXJzCiAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uS2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNlbGYuZmluZEFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGF0IG1heCBjYXBhY2l0eSwgZGlzYWJsZSAiYWRkIiBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtaW4gY2FwYWNpdHksIGRpc2FibGUgInJlbW92ZSIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNaW5JdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3JlbW92ZSddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBmaXJzdCBhY3Rpb25iYXIgaGFzIGl0cyAibW92ZSB1cCIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5maXJzdCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ndXAnXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gbGFzdCBhY3Rpb25iYXIgaGFzIGl0cyAibW92ZSBkb3duIiBidXR0b24gZGlzYWJsZWQKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmxhc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2Rvd24nXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gRFlOQU1JQyBNRVRIT0RTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBob3cgbWFueSBjaGlsZHJlbiBkbyB3ZSBoYXZlIGN1cnJlbnRseT8KICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOwoKICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZShpdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgIHNlbGYuYWRkSXRlbShpbnNlcnRpb25Qb2ludCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAvLyBvciB0aGUgc2NoZW1hIGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNjaGVtYTogIiArIEpTT04uc3RyaW5naWZ5KGl0ZW1TY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBhcnJheVZhbHVlcyA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaXRlbUluZGV4ICsgMSwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSB1bmRlcmx5aW5nIGZpZWxkcyByZXF1aXJlIHRoZWlyIGRhdGEgdG8gYmUgcmVzZXQKICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciBmb3IgdGhlIGRpc3BsYXkgdG8gd29yayBvdXQgcHJvcGVybHkgKHJhZGlvIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlcy5zcGxpY2UoaXRlbUluZGV4ICsgMSwgMCwgaXRlbS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5VmFsdWVzKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJSZW1vdmVJdGVtQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZUFjdGlvbkJhck1vdmVJdGVtVXBDbGljazogZnVuY3Rpb24oaXRlbUluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuc3dhcEl0ZW0oaXRlbUluZGV4LCBpdGVtSW5kZXggLSAxLCBzZWxmLm9wdGlvbnMuYW5pbWF0ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbURvd25DbGljazogZnVuY3Rpb24oaXRlbUluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuc3dhcEl0ZW0oaXRlbUluZGV4LCBpdGVtSW5kZXggKyAxLCBzZWxmLm9wdGlvbnMuYW5pbWF0ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhZGRJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoYWRkSXRlbUNvbnRhaW5lcikuYXBwZW5kKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluc2VydCBhdCBhIHNwZWNpZmljIGluZGV4CiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdFbGVtZW50ID0gYWRkSXRlbUNvbnRhaW5lci5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgKGluZGV4LTEpICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gdGhlIHRvb2xiYXIgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdmlhIHRoZSB1c2VyIGludGVyZmFjZS4gIFRoZSBtZXRob2QgY2FuIGFsc28KICAgICAgICAgKiBiZSBjYWxsZWQgcHJvZ3JhbW1hdGljYWxseSB0byBpbnNlcnQgaXRlbXMgb24gdGhlIGZseS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggdGhlIGluZGV4IHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgdGhlIGpzb24gc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIGpzb24gb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbmV3bHkgaW5zZXJ0ZWQgaXRlbQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWF4SXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKGluZGV4LCBzY2hlbWEsIG9wdGlvbnMsIGRhdGEsIGZ1bmN0aW9uKGl0ZW0pIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RlckNoaWxkKGl0ZW0sIGluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb0FkZEl0ZW0oaW5kZXgsIGl0ZW0sIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IGFkZAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGl0ZW0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb1JlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBjaGlsZEluZGV4ICsgIiddIikucmVtb3ZlKCk7CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJSZW1vdmVJdGVtKGNoaWxkSW5kZXgsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBzZXRWYWx1ZSgpIHdoZW4gdGhlIG51bWJlciBvZiBpdGVtcyBiZWluZyBzZXQgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIKICAgICAgICAgKiBvZiBmaWVsZCBlbGVtZW50cy4KCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGNoaWxkSW5kZXggaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHJlbW92ZWQKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIHJlbW92ZWQKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdW5yZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYudW5yZWdpc3RlckNoaWxkKGNoaWxkSW5kZXgpOwoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdGVtQ29udGFpbmVyRWwgZnJvbSBET00KICAgICAgICAgICAgICAgIHNlbGYuZG9SZW1vdmVJdGVtKGNoaWxkSW5kZXgsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogcmVtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJyZW1vdmUiLCBjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBtb3ZpbmcgYW4gaXRlbSBpbiB0aGUgYXJyYXkgdG8gYSBuZXcgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gYmUgbW92ZWQgdG8KICAgICAgICAgKiBAcGFyYW0gW0Jvb2xlYW5dIGFuaW1hdGUgd2hldGhlciB0byBhbmltYXRlCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZCBhbmQgcmVmcmVzaCBvY2N1cnMKICAgICAgICAgKi8KICAgICAgICBtb3ZlSXRlbTogZnVuY3Rpb24oc291cmNlSW5kZXgsIHRhcmdldEluZGV4LCBhbmltYXRlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhbmltYXRlOwogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGUgPyBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA6IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc291cmNlSW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc291cmNlSW5kZXggPSBwYXJzZUludChzb3VyY2VJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRhcmdldEluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBzZWxmLmNoaWxkcmVuLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIHRhcmdldCBpbmRleAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IHRhcmdldEluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0YXJnZXRDaGlsZCA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICBpZiAoIXRhcmdldENoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB0YXJnZXQgY2hpbGQgbm90IGZvdW5kCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYWRqdXN0ZWRUYXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFRhcmdldEluZGV4LS07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3BsaWNlIG91dCBjaGlsZAogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gc2VsZi5jaGlsZHJlbi5zcGxpY2Uoc291cmNlSW5kZXgsIDEpWzBdOwogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5zcGxpY2UoYWRqdXN0ZWRUYXJnZXRJbmRleCwgMCwgY2hpbGQpOwoKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCByZWZyZXNoCiAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigibW92ZSIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IDA7CiAgICAgICAgICAgIGlmIChhbmltYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcmVudEZpZWxkSWQgPSBzZWxmLmdldElkKCk7CgogICAgICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgc291cmNlSW5kZXggKyAiJ11bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgcGFyZW50RmllbGRJZCArICInXSIpOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ11bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgcGFyZW50RmllbGRJZCArICInXSIpOwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0d28gdGVtcCBlbGVtZW50cyBhcyBtYXJrZXJzIGZvciBzd2l0Y2gKICAgICAgICAgICAgICAgIHZhciB0ZW1wU291cmNlTWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjEnPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgICAgIHZhciB0ZW1wVGFyZ2V0TWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjInPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmJlZm9yZSh0ZW1wVGFyZ2V0TWFya2VyKTsKCiAgICAgICAgICAgICAgICAvLyBtb3ZlcyBkaXYgdmlzdWFsbHkKICAgICAgICAgICAgICAgIEFscGFjYS5hbmltYXRlZE1vdmUoc291cmNlQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIGR1cmF0aW9uLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBzd2FwcGluZyBhbiBpdGVtIGZyb20gb25lIGluZGV4IGluIHRoZSBhcnJheSB0byBhbm90aGVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgc3dhcEl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNoaWxkID0gc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF07CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKCiAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuW3NvdXJjZUluZGV4XSA9IHRhcmdldENoaWxkOwogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF0gPSBzb3VyY2VDaGlsZDsKCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9LAoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFycmF5IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgbGlzdCBvZiBpdGVtcyB3aXRoIHNhbWUgZGF0YSB0eXBlIG9yIHN0cnVjdHVyZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQXJyYXkgSXRlbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2NoZW1hIGZvciBhcnJheSBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gSXRlbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBudW1iZXIgb2YgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSXRlbXMgVW5pcXVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkl0ZW0gdmFsdWVzIHNob3VsZCBiZSB1bmlxdWUgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW5bMF0pIHsKICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZShwcm9wZXJ0aWVzLnByb3BlcnRpZXMuaXRlbXMucHJvcGVydGllcywgdGhpcy5jaGlsZHJlblswXS5nZXRTY2hlbWFPZlNjaGVtYSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3RpY2t5IFRvb2xiYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLiAgSWYgZmFsc2UsIHRoZSB0b29sYmFyIGlzIGFsd2F5cyBkaXNhYmxlZC4gIElmIHVuZGVmaW5lZCBvciBudWxsLCB0aGUgdG9vbGJhciB3aWxsIGFwcGVhciB3aGVuIGhvdmVyZWQgb3Zlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBraW5kIG9mIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICdidXR0b24nIG9yICdsaW5rJy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclBvc2l0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBQb3NpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMb2NhdGlvbiBvZiB0aGUgdG9wLWxldmVsIHRvb2xiYXIgdG8gcmVuZGVyIGZvciB0aGUgYXJyYXkgZmllbGQuICBFaXRoZXIgJ3RvcCcgb3IgJ2JvdHRvbScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidG9wIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uYmFyIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBraW5kIG9mIGFjdGlvbmJhciB0byByZW5kZXIgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuICBFaXRoZXIgJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsIG9yICdyaWdodCcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidG9wIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93TGFiZWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIEFjdGlvbnMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gS2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBMYWJlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENTUyBDbGFzc2VzIGZvciBJY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpY2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENsaWNrIEhhbmRsZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXaGV0aGVyIHRvIHNob3cgbGFiZWxzIG5leHQgdG8gYWN0aW9ucyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbnMgQmFyIEFjdGlvbnMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gS2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBMYWJlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENTUyBDbGFzc2VzIGZvciBJY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpY2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENsaWNrIEhhbmRsZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVUb29sYmFyV2l0aENoaWxkcmVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhpZGUgVG9vbGJhciB3aXRoIENoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB3aGV0aGVyIHRvIGhpZGUgdGhlIHRvcCB0b29sYmFyIHdoZW4gY2hpbGQgZWxlbWVudHMgYXJlIGF2YWlsYWJsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdGlja3kiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInRvb01hbnlJdGVtcyI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaXMgezB9IiwKICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVmFsdWVzIGFyZSBub3QgdW5pcXVlIiwKICAgICAgICAibm90QW5BcnJheSI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhbiBBcnJheSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYXJyYXkiLCBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygiYXJyYXkiLCAiYXJyYXkiKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZGQgTmV3IEl0ZW0iLAogICAgICAgICJhZGRCdXR0b25MYWJlbCI6ICJBZGQiLAogICAgICAgICJyZW1vdmVCdXR0b25MYWJlbCI6ICJSZW1vdmUiLAogICAgICAgICJ1cEJ1dHRvbkxhYmVsIjogIlVwIiwKICAgICAgICAiZG93bkJ1dHRvbkxhYmVsIjogIkRvd24iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCi8qanNoaW50IC1XMDgzICovIC8vIGlubGluZSBmdW5jdGlvbnMgYXJlIHVzZWQgc2FmZWx5CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQgPSBBbHBhY2EuQ29udGFpbmVyRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5yZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzU3RyaW5nKHRoaXMuZGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiT2JqZWN0RmllbGQgcGFyc2VkIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gb2JqZWN0OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGRhdGEgb2JqZWN0IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBhbiBvYmplY3QgYnkgdGhpcyBwb2ludCwgd2UgZG9uJ3QgaGFuZGxlIGl0CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzT2JqZWN0KGRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNvcnQgZXhpc3RpbmcgZmllbGRzIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIHRoaXMuY2hpbGRyZW5CeUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBuZXcgZGF0YSBtYXBwZWQgYnkgcHJvcGVydHkgaWQKICAgICAgICAgICAgdmFyIG5ld0RhdGFCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhQnlQcm9wZXJ0eUlkW2tdID0gZGF0YVtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIG5ldyBwcm9wZXJ0eSBpZHMKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBleGlzdHMsIHNldCB2YWx1ZSBvbnRvIGl0IGFuZCByZW1vdmUgZnJvbSBuZXdEYXRhQnlQcm9wZXJ0eUlkIGFuZCBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZAogICAgICAgICAgICAvLyBpZiBhIGZpZWxkIGRvZXNuJ3QgZXhpc3QsIGxldCBpdCByZW1haW4gaW4gbGlzdAogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIG5ld0RhdGFCeVByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKGZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG5ld0RhdGFCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pOwoKICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld0RhdGFCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFueXRoaW5nIGxlZnQgaW4gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgZGVzY3JpYmVzIGRhdGEgdGhhdCBpcyBtaXNzaW5nLCBudWxsIG9yIGVtcHR5CiAgICAgICAgICAgIC8vIHdlIG51bGwgb3V0IHRob3NlIHZhbHVlcwogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIG5ld0RhdGFCeVByb3BlcnR5SWQgaXMgbmV3IHN0dWZmIHRoYXQgd2UgbmVlZCB0byBhZGQKICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBmaWVsZCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBzaW5jZSBpdCBydW5zIGFnYWluc3QgYSBzY2hlbWEKICAgICAgICAgICAgLy8gc28gd2UgZHJvcCB0aGlzIG9mZgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlY29uc3RydWN0cyB0aGUgZGF0YSBvYmplY3QgZnJvbSB0aGUgY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIGVtcHR5IG9iamVjdAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaGFuZCBiYWNrIGFuIG9iamVjdCB3aXRoIG91ciBjaGlsZCBwcm9wZXJ0aWVzIGluIGl0CiAgICAgICAgICAgIHZhciBvID0ge307CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9iamVjdAogICAgICAgICAgICAvLyBmb3IgZWFjaCBwcm9wZXJ0eSwgd2UgaW5zZXJ0IGl0IGludG8gYSBKU09OIG9iamVjdCB0aGF0IHdlJ2xsIGhhbmQgYmFjayBhcyB0aGUgcmVzdWx0CgogICAgICAgICAgICAvLyBpZiB0aGUgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdGhlbiB3ZSBldmFsdWF0ZSB0aG9zZSBkZXBlbmRlbmNpZXMgZmlyc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCiAgICAgICAgICAgIC8vIHJlc3VsdGluZyBwcm9wZXJ0eSBzaG91bGQgYmUgaW5jbHVkZWQKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGtleSBhbmQgdmxhdWUKICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkVmFsdWUgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYoZmllbGRWYWx1ZSAhPT0gZmllbGRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXNzaWduZWRWYWx1ZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGZpZWxkVmFsdWUpID09PSAiYm9vbGVhbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSAoZmllbGRWYWx1ZT8gdHJ1ZTogZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGZpZWxkVmFsdWUpIHx8IEFscGFjYS5pc09iamVjdChmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNOdW1iZXIoZmllbGRWYWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkVmFsdWUgfHwgZmllbGRWYWx1ZSA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRWYWx1ZSA9IGZpZWxkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc3NpZ25lZFZhbHVlICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW3Byb3BlcnR5SWRdID0gYXNzaWduZWRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlcyB3aXphcmQgaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHNlbGYudmlldy5nZXRXaXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLndpemFyZENvbmZpZ3MpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYud2l6YXJkQ29uZmlncyB8fCBzZWxmLndpemFyZENvbmZpZ3MgPT09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmRDb25maWdzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi53aXphcmRDb25maWdzICYmIEFscGFjYS5pc09iamVjdChzZWxmLndpemFyZENvbmZpZ3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheW91dFRlbXBsYXRlRGVzY3JpcHRvciB8fCBzZWxmLndpemFyZENvbmZpZ3MuYmluZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHRoZSBhdXRvbWF0aWMgd2l6YXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdXRvV2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFudWFsIHdpemFyZCBiYXNlZCBvbiBsYXlvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqCiAgICAgICAgICogQ3JlYXRlcyBzdWItaXRlbXMgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CgogICAgICAgICAgICAvLyB3ZSBrZWVwIGEgbWFwIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiBvdXIgb3JpZ2luYWwgZGF0YSBvYmplY3QKICAgICAgICAgICAgLy8gYXMgd2UgcmVuZGVyIGVsZW1lbnRzIG91dCBvZiB0aGUgc2NoZW1hLCB3ZSByZW1vdmUgZnJvbSB0aGUgZXh0cmFEYXRhUHJvcGVydGllcyBtYXAKICAgICAgICAgICAgLy8gd2hhdGV2ZXIgaXMgbGVmdG92ZXIgYXJlIHRoZSBkYXRhIHByb3BlcnRpZXMgdGhhdCB3ZXJlIE5PVCByZW5kZXJlZCBiZWNhdXNlIHRoZXkgd2VyZSBub3QgcGFydAogICAgICAgICAgICAvLyBvZiB0aGUgc2NoZW1hCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJpbWFyaWx5IG1haW50YWluZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgc28gYXMgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIgb2YgbWlzbWF0Y2hlcwogICAgICAgICAgICB2YXIgZXh0cmFEYXRhUHJvcGVydGllcyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBkYXRhS2V5IGluIHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgZXh0cmFEYXRhUHJvcGVydGllc1tkYXRhS2V5XSA9IGRhdGFLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gc2VsZi5kYXRhOwogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEgJiYgc2VsZi5zY2hlbWEucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNlbGYuc2NoZW1hLnByb3BlcnRpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjZiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjaGVtYSBhbmQgdGhlIGRhdGEgbGluZSB1cCBwZXJmZWN0bHksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBwcm9wZXJ0aWVzIGluIHRoZSBkYXRhIHRoYXQgYXJlCiAgICAgICAgICAgICAgICAvLyBub3QgYWxzbyBpbiB0aGUgc2NoZW1hLCBhbmQgdGh1cywgZXh0cmFEYXRhUHJvcGVydGllcyB3aWxsIGJlIGVtcHR5LgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSBhcmUgc29tZSBwcm9wZXJ0aWVzIGluIGRhdGEgdGhhdCB3ZXJlIG5vdCBpbiBzY2hlbWEsIHRoZW4gdGhleSB3aWxsCiAgICAgICAgICAgICAgICAvLyByZW1haW4gaW4gZXh0cmFEYXRhUHJvcGVydGllcyBhbmQgd2UgY2FuIGluZm9ybSBkZXZlbG9wZXJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICB2YXIgZXh0cmFEYXRhS2V5cyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgZXh0cmFEYXRhS2V5IGluIGV4dHJhRGF0YVByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgICAgICBleHRyYURhdGFLZXlzLnB1c2goZXh0cmFEYXRhS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChleHRyYURhdGFLZXlzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlRoZXJlIHdlcmUgIiArIGV4dHJhRGF0YUtleXMubGVuZ3RoICsgIiBleHRyYSBkYXRhIGtleXMgdGhhdCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBzY2hlbWEgIiArIEpTT04uc3RyaW5naWZ5KGV4dHJhRGF0YUtleXMpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBlYWNoIHByb3BlcnR5IGluIHRoZSBvYmplY3QgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2NoZW1hIGFuZCBvcHRpb25zIHNvIHdlIG5lZWQgdG8gcHJvY2VzcwogICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBhbmQgd2FpdCBmb3IgYWxsIHRvIGNvbXBsZXRlCgogICAgICAgICAgICB2YXIgaXRlbXNCeVByb3BlcnR5SWQgPSB7fTsKCiAgICAgICAgICAgIC8vIHdyYXAgaW50byB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUZ1bmN0aW9ucyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGF0YSA9IHNlbGYuZGF0YVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYWxsb3cgdGhpcyBpZiB3ZSBoYXZlIGRhdGEsIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlUHJvcGVydHlTY2hlbWFPcHRpb25zKHByb3BlcnR5SWQsIGZ1bmN0aW9uIChzY2hlbWEsIG9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNjaGVtYTogIiArIEpTT04uc3RyaW5naWZ5KHNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZUl0ZW0ocHJvcGVydHlJZCwgc2NoZW1hLCBvcHRpb25zLCBpdGVtRGF0YSwgbnVsbCwgZnVuY3Rpb24gKGFkZGVkSXRlbUNvbnRyb2wpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSBhZGRlZEl0ZW1Db250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBleHRyYURhdGFQcm9wZXJ0aWVzIGhlbHBlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleHRyYURhdGFQcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgfSkocHJvcGVydHlJZCwgaXRlbURhdGEsIGV4dHJhRGF0YVByb3BlcnRpZXMpOwoKICAgICAgICAgICAgICAgIHByb3BlcnR5RnVuY3Rpb25zLnB1c2gocGYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwocHJvcGVydHlGdW5jdGlvbnMsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGl0ZW1zIGFycmF5IGluIGNvcnJlY3QgcHJvcGVydHkgb3JkZXIKICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gcHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYW55IG9yZGVyIGluZm9ybWF0aW9uIGluIHRoZSBpdGVtcz8KICAgICAgICAgICAgICAgIHZhciBoYXNPcmRlckluZm9ybWF0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihpdGVtc1tpXS5vcHRpb25zLm9yZGVyKSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaGFzT3JkZXJJbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckEgPSBhLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJBKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZGVyQSAtIG9yZGVyQik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2YoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBzdWItaXRlbSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcG9zdFJlbmRlckNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gcG9zdFJlbmRlckNhbGxiYWNrIGNhbGxlZCBvbmNlIHRoZSBpdGVtIGhhcyBiZWVuIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbTogZnVuY3Rpb24ocHJvcGVydHlJZCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBpbnNlcnRBZnRlcklkLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybUVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAiZGF0YSIgOiBpdGVtRGF0YSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogaXRlbU9wdGlvbnMsCiAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAidmlldyIgOiB0aGlzLnZpZXcuaWQgPyB0aGlzLnZpZXcuaWQgOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAiY29ubmVjdG9yIjogdGhpcy5jb25uZWN0b3IsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXN0cm95KCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdFRvcExldmVsIjp0cnVlLAogICAgICAgICAgICAgICAgInJlbmRlciIgOiBmdW5jdGlvbihmaWVsZENvbnRyb2wsIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhcmVudCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBwcm9wZXJ0eSBJZAogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wcm9wZXJ0eUlkID0gcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYXRoICE9PSAiLyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiLyIgKyBwcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnJlbmRlcihudWxsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiBmdW5jdGlvbihjb250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFscGFjYSBmaW5pc2hlZAoKICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIgdGhlIG91dGVyIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGNvbnRyb2wubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHNlbGYub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogaXRlbURhdGEKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKGNvbnRhaW5lckl0ZW1FbCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChjb250YWluZXJJdGVtRWwpLmhhc0NsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW50byBwbGFjZQogICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnRFbCkuYmVmb3JlKGNvbnRyb2wuZ2V0RmllbGRFbCgpKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNvbnRhaW5lckl0ZW1FbCA9IGNvbnRhaW5lckl0ZW1FbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5LCBhcyBwZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWlyY2FsL2FscGFjYS9jb21taXQvNDA2MWMzMzc4N2JkN2EyYjg2ZmI2MTMzMTczNzRkMzY1ZDlhY2M5MgogICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihjb250cm9sLCBmdW5jdGlvbihfY29udHJvbCkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlbmRlckNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIHN1Yi1vYmplY3RzIHdpdGhpbiB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9uczogZnVuY3Rpb24ocHJvcGVydHlJZCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGNvbXBsZXRpb25GdW5jdGlvbiA9IGZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3BlcnR5T3B0aW9ucy5yZWFkb25seSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2socmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eVNjaGVtYSA9IG51bGw7CiAgICAgICAgICAgIGlmIChfdGhpcy5zY2hlbWEgJiYgX3RoaXMuc2NoZW1hLnByb3BlcnRpZXMgJiYgX3RoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5U2NoZW1hID0gX3RoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zLmZpZWxkcyAmJiBfdGhpcy5vcHRpb25zLmZpZWxkc1twcm9wZXJ0eUlkXSkgewogICAgICAgICAgICAgICAgcHJvcGVydHlPcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmRsZSAkcmVmCiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVNjaGVtYSAmJiBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlSZWZlcmVuY2VJZCA9IHByb3BlcnR5U2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5U2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlPcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZmVyZW5jZUlkID0gcHJvcGVydHlPcHRpb25zWyIkcmVmIl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWVsZENoYWluID0gW3RvcEZpZWxkXTsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRDaGFpbi5wdXNoKHRvcEZpZWxkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnR5U2NoZW1hOwogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zID0gcHJvcGVydHlPcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgcHJvcGVydHlSZWZlcmVuY2VJZCwgZmllbGRSZWZlcmVuY2VJZCwgZnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmaWVsZCBjaGFpbiB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2lyY3VsYXJpdHkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRDaGFpbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZENoYWluW2ldLnNjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpIHx8IChmaWVsZENoYWluW2ldLnNjaGVtYS5pZCA9PT0gIiMiICsgcHJvcGVydHlSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gcHJvcGVydHlSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIGNpcmN1bGFyID0gKHJlZkNvdW50ID4gMSk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5U2NoZW1hID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlTY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIG9yaWdpbmFsIGlkCiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgJiYgb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3BlcnR5U2NoZW1hLmlkID0gb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYS5pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9kZWxldGUgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkUHJvcGVydHlPcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgb3JpZ2luYWxQcm9wZXJ0eU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBwcm9wZXJ0eU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihwcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBtb2RlbC5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gbW9kZWwuaXRlbXNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gaXRlbS5wcm9wZXJ0eUlkOwoKICAgICAgICAgICAgICAgICAgICAvLyBIQU5ETEUgUFJPUEVSVFkgREVQRU5ERU5DSUVTIChJRiBUSEUgUFJPUEVSVFkgSEFTIFRIRU0pCgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgc2hvdyBvciBoaWRlIHRoaXMgYWRkZWQgaXRlbSByaWdodCBhd2F5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIGJpbmQgdXBkYXRlIGhhbmRsZXJzIHRvIGRlcGVuZGVudCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudChwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCB0cmlnZ2VyIHRob3NlIHRvIGVuc3VyZSBpdCBpcyBpbiB0aGUgcmlnaHQgc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hEZXBlbmRlbnRGaWVsZFN0YXRlcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYoMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlQcm9wZXJ0aWVzIiksIFt0aGlzLnNjaGVtYS5tYXhQcm9wZXJ0aWVzXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pblByb3BlcnRpZXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5taW5Qcm9wZXJ0aWVzXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55UHJvcGVydGllcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJ0b29GZXdQcm9wZXJ0aWVzIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIG1heFByb3BlcnRpZXMgc2NoZW1hIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgbWF4UHJvcGVydGllcyBpcyBzYXRpc2ZpZWQKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhQcm9wZXJ0aWVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hWyJtYXhQcm9wZXJ0aWVzIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1heFByb3BlcnRpZXMgPSB0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdOwoKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgICAgdmFyIHByb3BlcnR5Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvcGVydHlDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlDb3VudCA8PSBtYXhQcm9wZXJ0aWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIG1heFByb3BlcnRpZXMgc2NoZW1hIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgbWF4UHJvcGVydGllcyBpcyBzYXRpc2ZpZWQKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hWyJtaW5Qcm9wZXJ0aWVzIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1pblByb3BlcnRpZXMgPSB0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdOwoKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgICAgdmFyIHByb3BlcnR5Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvcGVydHlDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlDb3VudCA+PSBtaW5Qcm9wZXJ0aWVzOwogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBERVBFTkRFTkNJRVMKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3Mgb3IgaGlkZXMgYSBwcm9wZXJ0eSdzIGZpZWxkIGJhc2VkIG9uIGhvdyBpdHMgZGVwZW5kZW5jaWVzIGV2YWx1YXRlLgogICAgICAgICAqIElmIGEgcHJvcGVydHkgZG9lc24ndCBoYXZlIGRlcGVuZGVuY2llcywgdGhpcyBuby1vcHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIHNob3dPckhpZGVQcm9wZXJ0eUJhc2VkT25EZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy5kZXRlcm1pbmVBbGxEZXBlbmRlbmNpZXNWYWxpZChwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLnNob3coKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRSZXZlYWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW0uaGlkZSgpOwogICAgICAgICAgICAgICAgaXRlbS5vbkRlcGVuZGVudENvbmNlYWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlbS5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlc29sdmluZyBkZXBlbmRlbmNpZXMgZm9yIGEgY2hpbGQgcHJvcGVydHkuCiAgICAgICAgICogVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgSlNPTiBTY2hlbWEgdjQgYW5kIGFsc28gcHJvdmlkZXMgZm9yIGxlZ2FjeSB2MyBzdXBwb3J0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBnZXRDaGlsZERlcGVuZGVuY2llczogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGZpcnN0LCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIHdpdGhpbiB0aGUgb2JqZWN0IChjb250YWluZXIpCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gbnVsbDsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmRlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbURlcGVuZGVuY2llcyA9IHRoaXMuc2NoZW1hLmRlcGVuZGVuY2llc1twcm9wZXJ0eUlkXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBvbiB0aGUgaXRlbSBpdHNlbGYKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBzY2hlbWEKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSBpdGVtLnNjaGVtYS5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtRGVwZW5kZW5jaWVzOwogICAgICAgIH0sCgogICAgICAgIGdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXRlbUNvbmRpdGlvbmFsRGVwZW5kZW5jaWVzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIHNlY29uZCwgY2hlY2sgZm9yIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBvbiB0aGUgaXRlbSBpdHNlbGYKICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBzdXBwb3J0IGxlZ2FjeSB2MyBqc29uIG9wdGlvbnMKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbmFsRGVwZW5kZW5jaWVzID0gaXRlbS5vcHRpb25zLmRlcGVuZGVuY2llczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlcGVuZGVuY2llcyBmb3IgYSBwcm9wZXJ0eSBwYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBkZXRlcm1pbmVBbGxEZXBlbmRlbmNpZXNWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIHdpdGhpbiB0aGUgb2JqZWN0IChjb250YWluZXIpCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTs7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyB5ZXMsIHdlIHBhc3MKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxpZCA9IHNlbGYuZGV0ZXJtaW5lU2luZ2xlRGVwZW5kZW5jeVZhbGlkKHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIGZpZWxkIHVwZGF0ZXMgdG8gYW55IGZpZWxkIGRlcGVuZGVuY2llcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgYmluZERlcGVuZGVuY3lGaWVsZFVwZGF0ZUV2ZW50OiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIGJpbmRFdmVudCA9IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmN5UHJvcGVydHlJZCBpcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHByb3BlcnR5IHRoYXQgdGhlIGZpZWxkICJwcm9wZXJ0eUlkIiBpcyBkZXBlbmRlbnQgb24KCiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRGaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkuYmluZCgiZmllbGR1cGRhdGUiLCAoZnVuY3Rpb24ocHJvcGVydHlGaWVsZCwgZGVwZW5kZW5jeUZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgImRlcGVuZGVuY3lQcm9wZXJ0eUlkIiBjaGFuZ2VkIGFuZCBhZmZlY3RzIHRhcmdldCBwcm9wZXJ0eSAoInByb3BlcnR5SWQiKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBVSSBzdGF0ZSBmb3IgdGFyZ2V0IHByb3BlcnR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3dPckhpZGVQcm9wZXJ0eUJhc2VkT25EZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgfSkoaXRlbSwgZGVwZW5kZW50RmllbGQsIHByb3BlcnR5SWQsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgZmllbGQgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiaW5kRXZlbnQocHJvcGVydHlJZCwgaXRlbURlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtRGVwZW5kZW5jaWVzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBiaW5kRXZlbnQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgcHJvcGVydHlGaWVsZCA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghcHJvcGVydHlGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGl0ZW1EZXBlbmRlbmNpZXMgPSBzZWxmLmdldENoaWxkRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28gc2ltcGxlIHJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbgogICAgICAgICAgICB2YXIgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkgPSBmdW5jdGlvbihvdGhlclByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBkZXBlbmRlbnRGaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgb3RoZXJQcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRGaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkoaXRlbURlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtRGVwZW5kZW5jaWVzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRmllbGRVcGRhdGVGb3JQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIGEgc2luZ2xlIHByb3BlcnR5J3MgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogSW4gb3JkZXIgdG8gYmUgdmFsaWQsIHRoZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgbXVzdCBleGlzdCAoSlNPTiBzY2hlbWEpIGFuZCBvcHRpb25hbGx5IG11c3Qgc2F0aXNmeQogICAgICAgICAqIGFueSBkZXBlbmRlbmN5IG9wdGlvbnMgKHZhbHVlIG1hdGNoZXMgdXNpbmcgYW4gQU5EKS4gIEZpbmFsbHksIHRoZSBkZXBlbmRlbmN5IGZpZWxkIG11c3QgYmUgc2hvd2luZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eUlkIEZpZWxkIHByb3BlcnR5IGlkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXBlbmRlbnRPblByb3BlcnR5SWQgUHJvcGVydHkgaWQgb2YgdGhlIGRlcGVuZGVuY3kgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBhbGwgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBzYXRpc2ZpZWQgYW5kIHRoZSBmaWVsZCBuZWVkcyB0byBiZSBzaG93biwKICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lU2luZ2xlRGVwZW5kZW5jeVZhbGlkOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbnRPblByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVja3MgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkICJkZXBlbmRlbnQtb24iIHByb3BlcnR5IGhhcyBhIHZhbHVlCiAgICAgICAgICAgIC8vIGJhc2ljIEpTT04tc2NoZW1hIHN1cHBvcnRzIHRoaXMgKGlmIGl0IGhhcyBBTlkgdmFsdWUsIGl0IGlzIGNvbnNpZGVyZWQgdmFsaWQKICAgICAgICAgICAgLy8gc3BlY2lhbCBjb25zaWRlcmF0aW9uIGZvciBib29sZWFuIGZhbHNlCiAgICAgICAgICAgIHZhciBkZXBlbmRlbnRPbkZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbnRPblByb3BlcnR5SWQpOwogICAgICAgICAgICBpZiAoIWRlcGVuZGVudE9uRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVudC1vbiBmaWVsZCBmb3VuZCwgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkZXBlbmRlbnRPbkRhdGEgPSBkZXBlbmRlbnRPbkZpZWxkLmRhdGE7CgogICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXNuJ3QgdmFsaWQKICAgICAgICAgICAgdmFyIHZhbGlkID0gZmFsc2U7CgogICAgICAgICAgICAvLyBnbyBvbmUgb2YgdHdvIGRpcmVjdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgb3Igbm90CiAgICAgICAgICAgIHZhciBjb25kaXRpb25hbERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0Q2hpbGRDb25kaXRpb25hbERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFjb25kaXRpb25hbERlcGVuZGVuY2llcyB8fCBjb25kaXRpb25hbERlcGVuZGVuY2llcy5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBCQVNJQyBERVBFTkVOREVOQ1kgQ0hFQ0tJTkcgKENPUkUgSlNPTiBTQ0hFTUEpCiAgICAgICAgICAgICAgICAvLwoKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogaWYgdGhlIGZpZWxkIGlzIGEgYm9vbGVhbiBmaWVsZCBhbmQgd2UgaGF2ZSBubyBjb25kaXRpb25hbCBkZXBlbmRlbmN5IGNoZWNraW5nLAogICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBzZXQgdmFsaWQgPSBmYWxzZSBpZiB0aGUgZmllbGQgZGF0YSBpcyBhIGJvb2xlYW4gZmFsc2UKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICF0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdLm9wdGlvbnMuZGVwZW5kZW5jaWVzICYmICFkZXBlbmRlbnRPbkRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9ICFBbHBhY2EuaXNWYWxFbXB0eShkZXBlbmRlbnRPbkZpZWxkLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIENPTkRJVElPTkFMIERFUEVOREVOQ1kgQ0hFQ0tJTkcgKEFMUEFDQSBFWFRFTlNJT04gVklBIE9QVElPTlMpCiAgICAgICAgICAgICAgICAvLwoKICAgICAgICAgICAgICAgIC8vIEFscGFjYSBleHRlbmRzIEpTT04gc2NoZW1hIGJ5IGFsbG93aW5nIGRlcGVuZGVuY2llcyB0byB0cmlnZ2VyIG9ubHkgZm9yIHNwZWNpZmljIHZhbHVlcyBvbiB0aGUKICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVudCBmaWVsZHMuICBJZiBvcHRpb25zIGFyZSBzcGVjaWZpZWQgdG8gZGVmaW5lIHRoaXMsIHdlIHdhbGsgdGhyb3VnaCBhbmQgcGVyZm9ybSBhbgogICAgICAgICAgICAgICAgLy8gQU5EIG9wZXJhdGlvbiBhY3Jvc3MgYW55IGZpZWxkcwoKICAgICAgICAgICAgICAgIC8vIGRvIHNvbWUgZGF0YSBzYW5pdHkgY2xlYW51cAogICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVudE9uRmllbGQuZ2V0VHlwZSgpID09PSAiYm9vbGVhbiIgJiYgIWRlcGVuZGVudE9uRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudE9uRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25hbERhdGEgPSBjb25kaXRpb25hbERlcGVuZGVuY2llc1tkZXBlbmRlbnRPblByb3BlcnR5SWRdOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBvcHRpb24gaXMgYSBmdW5jdGlvbiwgdGhlbiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2hvdwogICAgICAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIGV2YWx1YXRlcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNjaGVtYS1iYXNlZCBmYWxsYmFjayBkZXRlcm1pbmVkIHdlIHNob3VsZCBzaG93CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY29uZGl0aW9uYWxEYXRhKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGNvbmRpdGlvbmFsRGF0YS5jYWxsKHRoaXMsIGRlcGVuZGVudE9uRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRydWUKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25kaXRpb25hbCBkYXRhIGlzIGFuIGFycmF5IG9mIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShjb25kaXRpb25hbERhdGEpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhcnJheSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5hbnlFcXVhbGl0eShkZXBlbmRlbnRPbkRhdGEsIGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb2JqZWN0IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZGl0aW9uYWxEYXRhKSAmJiAhQWxwYWNhLmFueUVxdWFsaXR5KGNvbmRpdGlvbmFsRGF0YSwgZGVwZW5kZW50T25EYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gTkVTVEVEIEhJRERFTlMgREVQRU5ERU5DWSBISURFUyAoQUxQQUNBIEVYVEVOU0lPTikKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGZpbmFsIGNoZWNrOiBvbmx5IHNldCB2YWxpZCBpZiB0aGUgZGVwZW5kZW50T25Qcm9wZXJ0eUlkIGlzIHNob3dpbmcKICAgICAgICAgICAgaWYgKGRlcGVuZGVudE9uRmllbGQgJiYgZGVwZW5kZW50T25GaWVsZC5pc0hpZGRlbigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjaGlsZCBpbmRleC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqLwogICAgICAgIGdldEluZGV4OiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHByb3BlcnR5SWQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcGlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgaWYgKHBpZCA9PSBwcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gRFlOQU1JQyBNRVRIT0RTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhbiBpdGVtIHRvIHRoZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVNjaGVtYSBzY2hlbWEKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPcHRpb25zIENoaWxkIGZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIENoaWxkIGZpZWxkIHZhbHVlCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGluc2VydEFmdGVySWQgTG9jYXRpb24gd2hlcmUgdGhlIGNoaWxkIGl0ZW0gd2lsbCBiZSBpbnNlcnRlZC4KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGFkZEl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmNyZWF0ZUl0ZW0ocHJvcGVydHlJZCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBpbnNlcnRBZnRlcklkLCBmdW5jdGlvbihjaGlsZCkgewoKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QWZ0ZXJJZCAmJiBzZWxmLmNoaWxkcmVuQnlJZFtpbnNlcnRBZnRlcklkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyB6KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlblt6XS5nZXRJZCgpID09IGluc2VydEFmdGVySWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gejsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RlckNoaWxkKGNoaWxkLCAoKGluZGV4ICE9IG51bGwpID8gaW5kZXggKyAxIDogMCkpOwoKICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgc2VsZi5kb0FkZEl0ZW0oaW5kZXgsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAvL3NlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IGFkZAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYWRkIiwgY2hpbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyICJyZWFkeSIKICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsICJyZWFkeSIsICJkb3duIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluc2VydCBmaXJzdCBpbnRvIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucHJlcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgaW5kZXggKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGFmdGVyCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LmFmdGVyKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyQWRkSXRlbShpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHJlYWR5CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KGl0ZW0pOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbW92ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoY2hpbGRGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9ICQuZ3JlcCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAodmFsLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsLnByb3BlcnR5SWQgIT09IHByb3BlcnR5SWQpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jaGlsZHJlbkJ5SWRbY2hpbGRGaWVsZC5nZXRJZCgpXTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEZpZWxkKTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb1JlbW92ZUl0ZW06IGZ1bmN0aW9uKGl0ZW0pCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgcmVtb3ZlSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgcmVtb3ZlSXRlbUNvbnRhaW5lci5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lPSciICsgaXRlbS5uYW1lICsgIiddIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBkZXN0cm95IGNoaWxkIGZpZWxkIGl0c2VsZgogICAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBXSVpBUkQKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogV3JhcHMgdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gYSB3aXphcmQgY29udGFpbmVyIGFuZCB3aXJlcyB1cCB0aGUgbmF2aWdhdGlvbiBhbmQgYnV0dG9ucyBzbyB0aGF0CiAgICAgICAgICogd2l6YXJkIGVsZW1lbnRzIGZsaXAgbmljZWx5LgogICAgICAgICAqLwogICAgICAgIHdpemFyZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY29uZmlnLWRyaXZlbgogICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0b3JzID0gdGhpcy53aXphcmRDb25maWdzLnN0ZXBzOwogICAgICAgICAgICBpZiAoIXN0ZXBEZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3JzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdpemFyZFRpdGxlID0gdGhpcy53aXphcmRDb25maWdzLnRpdGxlOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSB0aGlzLndpemFyZENvbmZpZ3MuZGVzY3JpcHRpb247CiAgICAgICAgICAgIHZhciBidXR0b25EZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5idXR0b25zOwogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9ycyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdID0ge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSA9ICJQcmV2aW91cyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24gPSAibGVmdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdID0ge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udGl0bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udGl0bGUgPSAiTmV4dCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLmFsaWduKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLmFsaWduID0gInJpZ2h0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy53aXphcmRDb25maWdzLmhpZGVTdWJtaXRCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdID0ge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnRpdGxlID0gIlN1Ym1pdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS5hbGlnbikgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgYnV0dG9uS2V5IGluIGJ1dHRvbkRlc2NyaXB0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzW2J1dHRvbktleV0udHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1N0ZXBzID0gdGhpcy53aXphcmRDb25maWdzLnNob3dTdGVwczsKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93U3RlcHMpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzaG93UHJvZ3Jlc3NCYXIgPSB0aGlzLndpemFyZENvbmZpZ3Muc2hvd1Byb2dyZXNzQmFyOwogICAgICAgICAgICB2YXIgcGVyZm9ybVZhbGlkYXRpb24gPSB0aGlzLndpemFyZENvbmZpZ3MudmFsaWRhdGlvbjsKICAgICAgICAgICAgaWYgKHR5cGVvZihwZXJmb3JtVmFsaWRhdGlvbikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXRpdGxlIik7CiAgICAgICAgICAgIHZhciB3aXphcmREZXNjcmlwdGlvbiA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWRlc2NyaXB0aW9uIik7CiAgICAgICAgICAgIHZhciBfd2l6YXJkVmFsaWRhdGlvbiA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXZhbGlkYXRpb24iKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkVmFsaWRhdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uID0gX3dpemFyZFZhbGlkYXRpb24gPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF93aXphcmRTaG93U3RlcHMgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zaG93LXN0ZXBzIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFNob3dTdGVwcykgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNob3dTdGVwcyA9IF93aXphcmRTaG93U3RlcHMgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF93aXphcmRTaG93UHJvZ3Jlc3NCYXIgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zaG93LXByb2dyZXNzLWJhciIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93UHJvZ3Jlc3NCYXIpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFsbCBvZiB0aGUgc3RlcHMKICAgICAgICAgICAgdmFyIHN0ZXBFbHMgPSAkKHRoaXMuZmllbGQpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIik7CgogICAgICAgICAgICAvLyBET00tZHJpdmVuIGNvbmZpZ3VyYXRpb24gb2Ygc3RlcCBkZXNjcmlwdG9ycwogICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGVwRWxzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0b3IgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBUaXRsZSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtdGl0bGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBUaXRsZSkgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9IHN0ZXBUaXRsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci50aXRsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLnRpdGxlID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0aW9uID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc3RlcC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RlcERlc2NyaXB0aW9uKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gc3RlcERlc2NyaXB0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IuZGVzY3JpcHRpb24gPSAiU3RlcCAiICsgaTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycy5wdXNoKHN0ZXBEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgc29tZXRoaW5nIGZvciBwcm9ncmVzcyBiYXIgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHNob3dQcm9ncmVzc0JhcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzdGVwRGVzY3JpcHRvcnMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLy8gbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIHdpemFyZAogICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgbW9kZWwud2l6YXJkVGl0bGUgPSB3aXphcmRUaXRsZTsKICAgICAgICAgICAgbW9kZWwud2l6YXJkRGVzY3JpcHRpb24gPSB3aXphcmREZXNjcmlwdGlvbjsKICAgICAgICAgICAgbW9kZWwuc2hvd1N0ZXBzID0gc2hvd1N0ZXBzOwogICAgICAgICAgICBtb2RlbC5wZXJmb3JtVmFsaWRhdGlvbiA9IHBlcmZvcm1WYWxpZGF0aW9uOwogICAgICAgICAgICBtb2RlbC5zdGVwcyA9IHN0ZXBEZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuYnV0dG9ucyA9IGJ1dHRvbkRlc2NyaXB0b3JzOwogICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSBzZWxmLnNjaGVtYTsKICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHNlbGYub3B0aW9uczsKICAgICAgICAgICAgbW9kZWwuZGF0YSA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgbW9kZWwuc2hvd1Byb2dyZXNzQmFyID0gc2hvd1Byb2dyZXNzQmFyOwogICAgICAgICAgICBtb2RlbC5tYXJrQWxsU3RlcHNWaXNpdGVkID0gdGhpcy53aXphcmRDb25maWdzLm1hcmtBbGxTdGVwc1Zpc2l0ZWQ7CiAgICAgICAgICAgIG1vZGVsLnZpZXcgPSBzZWxmLnZpZXc7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGFjdHVhbCB3aXphcmQKICAgICAgICAgICAgdmFyIHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoIndpemFyZCIsIHNlbGYpOwogICAgICAgICAgICBpZiAod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkRWwgPSBBbHBhY2EudG1wbCh3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmFwcGVuZCh3aXphcmRFbCk7CgogICAgICAgICAgICAgICAgdmFyIHdpemFyZE5hdiA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLW5hdiIpOwogICAgICAgICAgICAgICAgdmFyIHdpemFyZFN0ZXBzID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtc3RlcHMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRCdXR0b25zID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtYnV0dG9ucyIpOwogICAgICAgICAgICAgICAgdmFyIHdpemFyZFByb2dyZXNzQmFyID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtcHJvZ3Jlc3MtYmFyIik7CgogICAgICAgICAgICAgICAgLy8gbW92ZSBzdGVwcyBpbnRvIHBsYWNlCiAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5hcHBlbmQoc3RlcEVscyk7CgogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAwOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNCdXR0b25FbCA9ICQod2l6YXJkQnV0dG9ucykuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1idXR0b24ta2V5PSdwcmV2aW91cyddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRCdXR0b25FbCA9ICQod2l6YXJkQnV0dG9ucykuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1idXR0b24ta2V5PSduZXh0J10iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3VibWl0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nc3VibWl0J10iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc25hcCBpbnRvIHBsYWNlIGEgbGl0dGxlIGNvbnRyb2xsZXIgdG8gd29yayB0aGUgYnV0dG9ucwogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmlyc3Qgc3RlcAogICAgICAgICAgICAgICAgICAgIHZhciByZWZyZXNoU3RlcHMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOQVYKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dTdGVwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RlbC52aXNpdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlzaXRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBtYXJrIGFsbCBzdGVwcyBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcEVsZW1lbnRzID0gJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0c1tnXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBzdGVwIGFzIHZpc2l0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0c1tjdXJyZW50SW5kZXhdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcEVsZW1lbnRzID0gJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygiY29tcGxldGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA8IGN1cnJlbnRJbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnID09PSBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtYXJrIGRpc2FibGVkIGZvciB0aGlzIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tnXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoInZpc2l0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBST0dSRVNTIEJBUgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuc2hvd1Byb2dyZXNzQmFyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVOb3cgPSBjdXJyZW50SW5kZXggKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTWF4ID0gbW9kZWwuc3RlcHMubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHBhcnNlSW50KCgodmFsdWVOb3cgLyB2YWx1ZU1heCkgKiAxMDApLCAxMCkgKyAiJSI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVtYXgiLCB2YWx1ZU1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuYXR0cigiYXJpYS12YWx1ZW5vdyIsIHZhbHVlTm93KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5jc3MoIndpZHRoIiwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQlVUVE9OUwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQnV0dG9uRWwuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY2FzZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5zdGVwcy5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgYWxsIHN0ZXBzCiAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIilbY3VycmVudEluZGV4XSkuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgYXNzZXJ0VmFsaWRhdGlvbiA9IGZ1bmN0aW9uKGJ1dHRvbklkLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwucGVyZm9ybVZhbGlkYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBvZiB0aGUgZmllbGRzIG9uIHRoZSBjdXJyZW50IHN0ZXAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVwRWwgPSAkKCQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIilbY3VycmVudEluZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoY3VycmVudFN0ZXBFbCkuZmluZCgiLmFscGFjYS1maWVsZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRJZCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZElkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IHNlbGYuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBpbnRvIHZhbGlkYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZmllbGRzW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBhbGwgdmFsaWRhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgZmllbGRzW2ldLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbYnV0dG9uSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi52YWxpZGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnZhbGlkYXRlLmNhbGwoc2VsZiwgZnVuY3Rpb24oX3ZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgX3ZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh2YWxpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkKHByZXZpb3VzQnV0dG9uRWwpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Fzc2VydFZhbGlkYXRpb24oInByZXZpb3VzIiwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sicHJldmlvdXMiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4LS07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChuZXh0QnV0dG9uRWwpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIDEgPD0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbigibmV4dCIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sibmV4dCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb2N1cyB0byBzZXR0bGUgb24gaW52YWxpZCBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9jdXMoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHN1Ym1pdEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oInN1Ym1pdCIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sic3VibWl0Il07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIGluIGEgZm9ybT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5mb3JtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb2N1cyB0byBzZXR0bGUgb24gaW52YWxpZCBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9jdXMoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY3VzdG9tIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleV0iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICJzdWJtaXQiICYmIGtleSAhPSAibmV4dCIgJiYga2V5ICE9ICJwcmV2aW91cyIpIHsgLy8gc3RhbmRhcmQgYnV0dG9ucyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiBiLmNsaWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4XSIpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hdkluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdkluZGV4ID0gcGFyc2VJbnQobmF2SW5kZXgsIDEwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPT0gY3VycmVudEluZGV4IHx8IChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW25hdkluZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgZ29pbmcgYmFja3dhcmRzLCB0aGVuIHdlIGRvIG5vdCBydW4gdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXZJbmRleCA8IGN1cnJlbnRJbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5hdkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmF2SW5kZXggPiBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5hdkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBpdGVtIHNob3VsZCBub3QgYmUgY2xpY2thYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oIm1vdmVUb1N0ZXAiLCBmdW5jdGlvbihldmVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBza2lwVmFsaWRhdGlvbiA9IGV2ZW50LnNraXBWYWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YoaW5kZXgpICE9PSAidW5kZWZpbmVkIikgJiYgaW5kZXggPD0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBWYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gaW5kZXg7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJhZHZhbmNlT3JTdWJtaXQiLCBmdW5jdGlvbihldmVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuZXh0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwoKICAgICAgICAgICAgICAgIH0od2l6YXJkTmF2LCB3aXphcmRTdGVwcywgd2l6YXJkQnV0dG9ucywgbW9kZWwpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgYSBjb25maWd1cmF0aW9uLWJhc2VkIHdpemFyZCB3aXRob3V0IGEgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqLwogICAgICAgIGF1dG9XaXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwQmluZGluZ3MgPSB0aGlzLndpemFyZENvbmZpZ3MuYmluZGluZ3M7CiAgICAgICAgICAgIGlmICghc3RlcEJpbmRpbmdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGVwQmluZGluZ3MgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eUlkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGVwQmluZGluZ3NbcHJvcGVydHlJZF0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzaG91bGQgd2UgY3JlYXRlIHN0ZXBzPwogICAgICAgICAgICB2YXIgY3JlYXRlU3RlcHMgPSB0cnVlOwogICAgICAgICAgICBpZiAoJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgdGhlcmUKICAgICAgICAgICAgICAgIGNyZWF0ZVN0ZXBzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzdGVwID0gMTsKICAgICAgICAgICAgdmFyIHN0ZXBGaWVsZHMgPSBbXTsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBmaWVsZHMgaW4gdGhpcyBzdGVwCiAgICAgICAgICAgICAgICBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID09PSBzdGVwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWQgJiYgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2wucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEZpZWxkcy5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzdGVwRmllbGRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZVN0ZXBzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVsID0gJCgnPGRpdiBkYXRhLWFscGFjYS13aXphcmQtcm9sZT0ic3RlcCI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYXBwZW5kKHN0ZXBFbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW3N0ZXAtMV0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYW55IG9yZGVyIGluZm9ybWF0aW9uIGluIHRoZSBpdGVtcz8KICAgICAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBGaWVsZHNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcmRlckluZm9ybWF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3JkZXJJbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgYnkgb3JkZXI/CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMuc29ydChmdW5jdGlvbiAoYSwgYikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckEgPSBhLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyQiA9IGIub3B0aW9ucy5vcmRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgZWxlbWVudHMgaW4KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbCkuYXBwZW5kKHN0ZXBGaWVsZHNbaV0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHN0ZXArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gdGhlIG5vcm1hbCB3aXphcmQKICAgICAgICAgICAgdGhpcy53aXphcmQoKTsKCiAgICAgICAgICAgIC8vIGlmIHRoZSBjb250YWluZXIgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuIGxlZnQsIGhpZGUgaXQKICAgICAgICAgICAgaWYgKCQodGhpcy5jb250YWluZXIpLmNoaWxkcmVuKCkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZXMgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byB3aGljaCB0aGUgY2hpbGQgc2hvdWxkIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgbW92ZW1lbnQKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHN3YXAgd2l0aAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIik7CiAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddIik7CgogICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgIHZhciB0ZW1wU291cmNlTWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjEnPjwvZGl2PiIpOwogICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmJlZm9yZSh0ZW1wVGFyZ2V0TWFya2VyKTsKCiAgICAgICAgICAgIHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzd2FwIG9yZGVyIGluIGNoaWxkcmVuCiAgICAgICAgICAgICAgICB2YXIgdGVtcENoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHNvdXJjZUluZGV4KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkcmVuW2ldID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT09IHRhcmdldEluZGV4KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkcmVuW2ldID0gc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbiA9IHRlbXBDaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAvLyBzd2FwIG9yZGVyIGluIERPTQogICAgICAgICAgICAgICAgdGVtcFNvdXJjZU1hcmtlci5yZXBsYWNlV2l0aCh0YXJnZXRDb250YWluZXIpOwogICAgICAgICAgICAgICAgdGVtcFRhcmdldE1hcmtlci5yZXBsYWNlV2l0aChzb3VyY2VDb250YWluZXIpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhY3Rpb24gYmFyIGJpbmRpbmdzCiAgICAgICAgICAgICAgICAkKHNvdXJjZUNvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgc291cmNlSW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHRhcmdldEluZGV4KTsKICAgICAgICAgICAgICAgICQodGFyZ2V0Q29udGFpbmVyKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpLmF0dHIoImRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4Iiwgc291cmNlSW5kZXgpOwoKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChhbmltYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzd2FwIGRpdnMgdmlzdWFsbHkKICAgICAgICAgICAgICAgIEFscGFjYS5hbmltYXRlZFN3YXAoc291cmNlQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIDUwMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IGZpZWxkIGZvciBjb250YWluaW5nIG90aGVyIGZpZWxkcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBjaGlsZCBwcm9wZXJ0aWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHRoaXMgb2JqZWN0IGlzIGFsbG93ZWQgdG8gaGF2ZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBOdW1iZXIgb2YgUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWluaW11bSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHRoaXMgb2JqZWN0IGlzIHJlcXVpcmVkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGZpZWxkc1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnByb3BlcnRpZXMucHJvcGVydGllczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZTY2hlbWEoKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0udGl0bGUgPSBwcm9wZXJ0eUlkICsgIiA6OiAiICsgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZk9wdGlvbnMgPSBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJvcmRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcmRlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3Igb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW5kZXggb2YgdGhpcyBmaWVsZCBpbiB0aGUgcHJvcGVydGllcyBhcnJheS4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgT3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIG9wdGlvbnMgZm9yIGNoaWxkIGZpZWxkcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGZpZWxkc1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuZmllbGRzOwoKICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzID0ge307CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuW2ldLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdID0gdGhpcy5jaGlsZHJlbltpXS5nZXRTY2hlbWFPZk9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0udGl0bGUgPSBwcm9wZXJ0eUlkICsgIiA6OiAiICsgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHNjaGVtYU9mT3B0aW9ucywgcHJvcGVydGllcyk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAidG9vTWFueVByb3BlcnRpZXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgKHswfSkgaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAidG9vRmV3UHJvcGVydGllcyI6ICJUaGVyZSBhcmUgbm90IGVub3VnaCBwcm9wZXJ0aWVzICh7MH0gYXJlIHJlcXVpcmVkKSIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9iamVjdCIsIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygib2JqZWN0IiwgIm9iamVjdCIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQW55RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQW55RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2ZvY3VzCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5mb2N1cygpOwoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQW55IGZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhbnkiLCBBbHBhY2EuRmllbGRzLkFueUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFueSIsICJhbnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkhpZGRlbkZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiaGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2xFbCgpLnZhbCgiIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2xFbCgpLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJIaWRkZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBhIGhpZGRlbiBIVE1MIGlucHV0IjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJoaWRkZW4iLCBBbHBhY2EuRmllbGRzLkhpZGRlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFkZHJlc3NGaWVsZCA9IEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhZGRyZXNzIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmRhdGEuc3RyZWV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWV0OiBbJycsICcnXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiSG9tZSBBZGRyZXNzIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3RyZWV0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3RyZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IDMwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6IDMKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjaXR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbIkFMIiwgIkFLIiwgIkFTIiwgIkFaIiwgIkFSIiwgIkNBIiwgIkNPIiwgIkNUIiwgIkRFIiwgIkRDIiwgIkZNIiwgIkZMIiwgIkdBIiwgIkdVIiwgIkhJIiwgIklEIiwgIklMIiwgIklOIiwgIklBIiwgIktTIiwgIktZIiwgIkxBIiwgIk1FIiwgIk1IIiwgIk1EIiwgIk1BIiwgIk1JIiwgIk1OIiwgIk1TIiwgIk1PIiwgIk1UIiwgIk5FIiwgIk5WIiwgIk5IIiwgIk5KIiwgIk5NIiwgIk5ZIiwgIk5DIiwgIk5EIiwgIk1QIiwgIk9IIiwgIk9LIiwgIk9SIiwgIlBXIiwgIlBBIiwgIlBSIiwgIlJJIiwgIlNDIiwgIlNEIiwgIlROIiwgIlRYIiwgIlVUIiwgIlZUIiwgIlZJIiwgIlZBIiwgIldBIiwgIldWIiwgIldJIiwgIldZIl0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ6aXAiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJaaXAgQ29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogL14oXGR7NX0oLVxkezR9KT8pPyQvCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBBbHBhY2EubWVyZ2UodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ6aXAiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogIjk5OTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiBbIkFMQUJBTUEiLCAiQUxBU0tBIiwgIkFNRVJJQ0FOIFNBTU9BIiwgIkFSSVpPTkEiLCAiQVJLQU5TQVMiLCAiQ0FMSUZPUk5JQSIsICJDT0xPUkFETyIsICJDT05ORUNUSUNVVCIsICJERUxBV0FSRSIsICJESVNUUklDVCBPRiBDT0xVTUJJQSIsICJGRURFUkFURUQgU1RBVEVTIE9GIE1JQ1JPTkVTSUEiLCAiRkxPUklEQSIsICJHRU9SR0lBIiwgIkdVQU0iLCAiSEFXQUlJIiwgIklEQUhPIiwgIklMTElOT0lTIiwgIklORElBTkEiLCAiSU9XQSIsICJLQU5TQVMiLCAiS0VOVFVDS1kiLCAiTE9VSVNJQU5BIiwgIk1BSU5FIiwgIk1BUlNIQUxMIElTTEFORFMiLCAiTUFSWUxBTkQiLCAiTUFTU0FDSFVTRVRUUyIsICJNSUNISUdBTiIsICJNSU5ORVNPVEEiLCAiTUlTU0lTU0lQUEkiLCAiTUlTU09VUkkiLCAiTU9OVEFOQSIsICJORUJSQVNLQSIsICJORVZBREEiLCAiTkVXIEhBTVBTSElSRSIsICJORVcgSkVSU0VZIiwgIk5FVyBNRVhJQ08iLCAiTkVXIFlPUksiLCAiTk9SVEggQ0FST0xJTkEiLCAiTk9SVEggREFLT1RBIiwgIk5PUlRIRVJOIE1BUklBTkEgSVNMQU5EUyIsICJPSElPIiwgIk9LTEFIT01BIiwgIk9SRUdPTiIsICJQQUxBVSIsICJQRU5OU1lMVkFOSUEiLCAiUFVFUlRPIFJJQ08iLCAiUkhPREUgSVNMQU5EIiwgIlNPVVRIIENBUk9MSU5BIiwgIlNPVVRIIERBS09UQSIsICJURU5ORVNTRUUiLCAiVEVYQVMiLCAiVVRBSCIsICJWRVJNT05UIiwgIlZJUkdJTiBJU0xBTkRTIiwgIlZJUkdJTklBIiwgIldBU0hJTkdUT04iLCAiV0VTVCBWSVJHSU5JQSIsICJXSVNDT05TSU4iLCAiV1lPTUlORyJdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMuYWRkcmVzc1ZhbGlkYXRpb24pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWRkcmVzc1ZhbGlkYXRpb24gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaXNDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBpc0NvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYWRkcmVzcyBpbiBhIHNpbmdsZSBsaW5lIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEFkZHJlc3MgYXMgYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgZ2V0QWRkcmVzczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgPT09ICJ2aWV3IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiIjsKICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RyZWV0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWx1ZS5zdHJlZXQsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlICsgIiAiOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNpdHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZS5jaXR5ICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXRlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuc3RhdGUgKyAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuemlwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuemlwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNhZnRlclJlbmRlckNvbnRhaW5lcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGFkZGl0aW9uYWwgY3NzCiAgICAgICAgICAgICAgICAkKGNvbnRhaW5lcikuYWRkQ2xhc3MoImFscGFjYS1hZGRyZXNzZmllbGQiKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uICYmICFzZWxmLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFwQnV0dG9uID0gJCgnPGRpdiBjbGFzcz0iYWxwYWNhLWZvcm0tYnV0dG9uIj5TaG93IEdvb2dsZSBNYXA8L2Rpdj4nKS5hcHBlbmRUbyhjb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtYXBCdXR0b24uYnV0dG9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmJ1dHRvbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtYXBCdXR0b24uY2xpY2soZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ29vZ2xlICYmIGdvb2dsZS5tYXBzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRyZXNzID0gc2VsZi5nZXRBZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VvY29kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJzogYWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwQ2FudmFzSWQgPSBzZWxmLmdldElkKCkgKyAiLW1hcC1jYW52YXMiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyMnICsgbWFwQ2FudmFzSWQpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCI8ZGl2IGlkPSciICsgbWFwQ2FudmFzSWQgKyAiJyBjbGFzcz0nYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzJz48L2Rpdj4iKS5hcHBlbmRUbyhzZWxmLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIiksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiem9vbSI6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW50ZXIiOiByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXBUeXBlSWQiOiBnb29nbGUubWFwcy5NYXBUeXBlSWQuUk9BRE1BUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHZW9jb2RpbmcgZmFpbGVkOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGxheU1lc3NhZ2UoIkdvb2dsZSBNYXAgQVBJIGlzIG5vdCBpbnN0YWxsZWQuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KS53cmFwKCc8c21hbGwvPicpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dNYXBPbkxvYWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBCdXR0b24uY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBZGRyZXNzIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhbmRhcmQgVVMgQWRkcmVzcyB3aXRoIFN0cmVldCwgQ2l0eSwgU3RhdGUgYW5kIFppcC4gQWxzbyBjb21lcyB3aXRoIHN1cHBvcnQgZm9yIEdvb2dsZSBtYXAuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidmFsaWRhdGVBZGRyZXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWRkcmVzcyBWYWxpZGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuYWJsZSBhZGRyZXNzIHZhbGlkYXRpb24gaWYgdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWFwT25Mb2FkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IHRoZSBtYXAgd2hlbiBmaXJzdCBsb2FkZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJBZGRyZXNzIHZhbGlkYXRpb24gaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkVuYWJsZSBHb29nbGUgTWFwIGZvciBhZGRyZXNzIHZhbGlkYXRpb24/IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFkZHJlc3MiLCBBbHBhY2EuRmllbGRzLkFkZHJlc3NGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY2tlZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ja2VkaXRvcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ja2VkaXRvciA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gcmVuZGVyIENLIEVkaXRvcgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKENLRURJVE9SKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZyB3aXRoIENLRWRpdG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBDS0VESVRPUi5yZXBsYWNlKCQoc2VsZi5jb250cm9sKVswXSwgc2VsZi5vcHRpb25zLmNrZWRpdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRDS0VkaXRvckV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNrZWRpdG9yJ3MgZG9tIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQsIG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cCB0aGUgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbW92ZUFsbExpc3RlbmVycygpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBoZXJlIGJlY2F1c2UgQ0tFZGl0b3IgaGFzIGFuIGlzc3VlIGlmIERPTSBlbGVtZW50IGRlbGV0ZXMgYmVmb3JlIENLRWRpdG9yIGNsZWFucyB1cAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9sZW1vbmRlL2FuZ3VsYXItY2tlZGl0b3IvaXNzdWVzLzcKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgc2VsZi5lZGl0b3IuZGVzdHJveShmYWxzZSk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGluaXRDS0VkaXRvckV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gYmx1ciBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmb2N1cyBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImZvY3VzIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlwcmVzcyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTk9URTogdGhlc2UgZG8gbm90IHNlZW0gdG8gd29yayB3aXRoIENLRWRpdG9yPwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBrZXl1cCBldmVudAogICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXl1cCIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgIC8vIGtleWRvd24gZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5ZG93biIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXREYXRhKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldERhdGEoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNLIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgYSBDSyBFZGl0b3IgY29udHJvbCBmb3IgdXNlIGluIGVkaXRpbmcgSFRNTC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJja2VkaXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNLIEVkaXRvciBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVzZSB0aGlzIGVudHJ5IHRvIHByb3ZpZGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIENLRWRpdG9yIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY2tlZGl0b3IiLCBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBVc2VzIHRoZSBzcGVjdHJ1bSBwbHVnaW4gdG8gcHJvdmlkZSBhIGNvbG9yIHBpY2tlci4KICogVGhpcyB1c2VkIHRvIHJlbHkgb24gSFRNTDUgYnV0IG5vIGxvbmdlci4KICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ29sb3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ29sb3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5zcGVjdHJ1bUF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHR5cGVvZigkLmZuLnNwZWN0cnVtKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bSkgPT09ICJ1bmRlZmluZWQiICYmIHNlbGYuc3BlY3RydW1BdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIGlmIChzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKXsKICAgICAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd0lucHV0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93UGFsZXR0ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93UGFsZXR0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5wcmVmZXJyZWRGb3JtYXQpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0ID0gImhleDMiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5jbGlja291dEZpcmVzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb2xvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgc3BlY3RydW0gcGx1Z2luLi4uCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSAmJiBzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgoc2VsZi5jb250cm9sKVswXSkuc3BlY3RydW0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoeyBjb2xvcjogc2VsZi5kYXRhIH0sIHNlbGYub3B0aW9ucy5zcGVjdHJ1bSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oJ2NoYW5nZS5zcGVjdHJ1bScsIGZ1bmN0aW9uKGUsIHRpbnljb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5jb252ZXJ0VGlueUNvbG9yKHRpbnljb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VGlueUNvbG9yOiBmdW5jdGlvbih0aW55Y29sb3IpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGlueWNvbG9yLnRvSGV4U3RyaW5nKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ29sb3IgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQSBjb2xvciBwaWNrZXIgZm9yIHNlbGVjdGluZyBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY29sb3IiLCBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygiY29sb3IiLCAiY29sb3IiKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlczogaHR0cHM6Ly9tam9sbmljLmNvbS9ib290c3RyYXAtY29sb3JwaWNrZXIvCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yUGlja2VyRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yUGlja2VyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5jb2xvcnBpY2tlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlciA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIuY29sb3IgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3JwaWNrZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLmNvbG9ycGlja2VyKHNlbGYub3B0aW9ucy5jb2xvcnBpY2tlcik7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2VDb2xvci5jb2xvcnBpY2tlcicsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoZXZlbnQuY29sb3IudG9IZXgoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ29sb3IgUGlja2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9ycGlja2VyIiwgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCA9IEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvdW50cnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IFtdOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub3B0aW9uTGFiZWxzID0gW107CgogICAgICAgICAgICB2YXIgY291bnRyaWVzTWFwID0gdGhpcy5nZXRNZXNzYWdlKCJjb3VudHJpZXMiKTsKICAgICAgICAgICAgaWYgKGNvdW50cmllc01hcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY291bnRyeUtleSBpbiBjb3VudHJpZXNNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXS5wdXNoKGNvdW50cnlLZXkpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBjb3VudHJpZXNNYXBbY291bnRyeUtleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ291bnRyeSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGRyb3Bkb3duIHNlbGVjdG9yIG9mIGNvdW50cmllcyBrZXllZCBieSB0aGVpciBJU08zIGNvZGUuICBUaGUgbmFtZXMgb2YgdGhlIGNvdW50cmllcyBhcmUgcmVhZCBmcm9tIHRoZSBJMThOIGJ1bmRsZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNhcGl0YWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgdmFsdWVzIHNob3VsZCBiZSBjYXBpdGFsaXplZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJjYXBpdGFsaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY291bnRyeSIsIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImNvdW50cnkiLCAiY291bnRyeSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIHJvdW5kID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJhdGVnaWVzID0gewogICAgICAgICAgICB1cDogICAgICBNYXRoLmNlaWwsCiAgICAgICAgICAgIGRvd246ICAgIGZ1bmN0aW9uKGlucHV0KSB7IHJldHVybiB+fmlucHV0OyB9LAogICAgICAgICAgICBuZWFyZXN0OiBNYXRoLnJvdW5kCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyYXRlZ3kpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWdpZXNbc3RyYXRlZ3ldOwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkN1cnJlbmN5RmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkN1cnJlbmN5RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBhdWdtZW50cyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZAogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIEN1cnJlbmN5IENvbnRyb2wKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWluZXIgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIEZpZWxkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgIHZhciBwZk9wdGlvbnNTY2hlbWEgPSB0aGlzLmdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zKCkucHJvcGVydGllczsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwZk9wdGlvbnNTY2hlbWEpIHsKICAgICAgICAgICAgICAgIHZhciBvcHRpb24gPSBwZk9wdGlvbnNTY2hlbWFbaV07CiAgICAgICAgICAgICAgICBpZiAoIShpIGluIG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tpXSA9IG9wdGlvblsiZGVmYXVsdCJdIHx8IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihkYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEgPSAiIiArIHBhcnNlRmxvYXQoZGF0YSkudG9GaXhlZChvcHRpb25zLmNlbnRzTGltaXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImN1cnJlbmN5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgJChmaWVsZCkucHJpY2VGb3JtYXQoc2VsZi5vcHRpb25zKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgICAgIHZhciB2YWwgPSAkKGZpZWxkKS5pcygnaW5wdXQnKSA/IGZpZWxkLnZhbCgpIDogZmllbGQuaHRtbCgpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVubWFzayB8fCB0aGlzLm9wdGlvbnMucm91bmQgIT09ICJub25lIikgewogICAgICAgICAgICAgICAgdmFyIHVubWFza2VkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXIgPSB2YWxbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oY3VyKSB8fCBjdXIgPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGN1cjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXIgPT09IHRoaXMub3B0aW9ucy5jZW50c1NlcGFyYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcuJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChyZXN1bHQpOwogICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgICAgICB1bm1hc2tlZCA9IHJvdW5kKHRoaXMub3B0aW9ucy5yb3VuZCkodW5tYXNrZWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVubWFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZFN0cmluZyA9ICIiICsgdW5tYXNrZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB1ID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWxbaV0pIHx8IHZhbFtpXSA9PT0gIi0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5tYXNrZWRTdHJpbmdbdSsrXSB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDdXJyZW5jeSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBhdXRvbWF0aWNhbGx5IGZvcm1hdHRlZCBhbmQgY29uZmlndXJhYmxlIGlucHV0IGZvciBlbnRlcmluZyBjdXJyZW5jeSBhbW91bnRzLiI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2NoZW1hT2ZQcmljZUZvcm1hdE9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBOZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIG5lZ2F0aXZlIG51bWJlcnMgYXJlIGFsbG93ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c0xpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxpbWl0IG9mIGZyYWN0aW9uYWwgZGlnaXRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDZW50cyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHdob2xlIGFuZCBmcmFjdGlvbmFsIGFtb3VudHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIi4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJQcmVmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDbGVhciBQcmVmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiB0aGUgcHJlZml4IGlzIGNsZWFyZWQgb24gYmx1ci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyU3VmZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgU3VmZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHN1ZmZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnNlcnRQbHVzU2lnbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBsdXMgU2lnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIGEgcGx1cyBzaWduIHNob3VsZCBiZSBpbnNlcnRlZCBmb3IgcG9zaXRpdmUgdmFsdWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpbWl0IG9mIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwcmVmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcmVmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHByZWZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiJCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIGZpZWxkIGlzIHJvdW5kZWQuIChSb3VuZGluZyBpcyBkb25lIHdoZW4gZ2V0VmFsdWUgaXMgY2FsbGVkIGFuZCBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBVSSkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsgInVwIiwgImRvd24iLCAibmVhcmVzdCIsICJub25lIiBdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJub25lIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc3VmZml4IGlmIGFueSBmb3IgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidGhvdXNhbmRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGhvdXNhbmRzIFNlcGFyYXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc2VwYXJhdG9yIGJldHdlZW4gdGhvdXNhbmRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidW5tYXNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVW5tYXNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUgdGhlbiB0aGUgcmVzdWx0aW5nIHZhbHVlIGZvciB0aGlzIGZpZWxkIHdpbGwgYmUgdW5tYXNrZWQuICBUaGF0IGlzLCB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpbGwgYmUgYSBmbG9hdCBpbnN0ZWFkIG9mIGEgc3RyaW5nICh3aXRoIHRoZSBwcmVmaXgsIHN1ZmZpeCwgZXRjLiByZW1vdmVkKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB0aGlzLmdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dOZWdhdGl2ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJvdW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3VmZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImN1cnJlbmN5IiwgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIE5PVEU6IHRoaXMgcmVxdWlyZXMgYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLmpzCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIG1vbWVudC5qcwoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImRhdGUiOwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0OwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRFeHRyYUZvcm1hdHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZGF0ZSI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAiZGF0ZSI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlciA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5waWNrZXIudXNlQ3VycmVudCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGF0ZSBmb3JtYXQKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IHNlbGYuZ2V0RGVmYXVsdEZvcm1hdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0ID0gc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5sb2NhbGUpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlID0gQWxwYWNhLmRlZmF1bHRMb2NhbGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmRheVZpZXdIZWFkZXJGb3JtYXQgPSAiTU1NTSBZWVlZIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXh0cmEgZm9ybWF0cwogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKSB7CiAgICAgICAgICAgICAgICB2YXIgZXh0cmFGb3JtYXRzID0gc2VsZi5nZXREZWZhdWx0RXh0cmFGb3JtYXRzKCk7CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFGb3JtYXRzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5leHRyYUZvcm1hdHMgPSBleHRyYUZvcm1hdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1hbnVhbEVudHJ5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxFbnRyeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxFbnRyeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZmllbGQuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAhPT0gImRpc3BsYXkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLmRhdGV0aW1lcGlja2VyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRDb250cm9sRWwoKS5kYXRldGltZXBpY2tlcihzZWxmLm9wdGlvbnMucGlja2VyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlja2VyID0gc2VsZi5nZXRDb250cm9sRWwoKS5kYXRhKCJEYXRlVGltZVBpY2tlciIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIgJiYgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlja2VyLmZvcm1hdChzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IHNlbGYucGlja2VyLmZvcm1hdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGRhdGUtdGltZSBwaWNrZXIsIHRyaWdnZXIgY2hhbmdlIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5vbigiZHAuY2hhbmdlIiwgZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBpZiBwcm92aWRlZAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5kYXRlKHNlbGYuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFsbG93cyBtYW51YWwgZW50cnkgbW9kZSB0byBiZSB0b2dnbGVkIG9uIGFuZCBvZmYuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbWFudWFsRW50cnkKICAgICAgICAgKi8KICAgICAgICBzZXRNYW51YWxFbnRyeTogZnVuY3Rpb24obWFudWFsRW50cnkpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFudWFsRW50cnkgPSBtYW51YWxFbnRyeTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGdldERhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkYXRlID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRlID0gKHNlbGYucGlja2VyLmRhdGUoKSA/IHNlbGYucGlja2VyLmRhdGUoKS5fZDogbnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkYXRlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdmFsdWUgYXMgYSBKYXZhU2NyaXB0IERhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7RGF0ZX0gRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIGlzQXV0b0ZvY3VzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGF0ZUZvcm1hdCgpOwogICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkRGF0ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZERhdGUiKSwgW3RoaXMub3B0aW9ucy5kYXRlRm9ybWF0XSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkRGF0ZSJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGF0ZSBmb3JtYXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIGRhdGUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEYXRlRm9ybWF0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBzZWxmLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBmb3JtYXRzCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVGb3JtYXRzID0gW107CiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5waWNrZXIgJiYgc2VsZi5vcHRpb25zLnBpY2tlci5leHRyYUZvcm1hdHMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0cy5wdXNoKHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkIHx8IEFscGFjYS5tb21lbnQodmFsdWUsIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5tb21lbnQodmFsdWUsIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuZGF0ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMucGlja2VyID0gbnVsbDsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJEYXRlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImRhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSIgOiBbImRhdGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5Ijp0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGVGb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEYXRlIEZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRlIGZvcm1hdCAodXNpbmcgbW9tZW50LmpzIGZvcm1hdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicGlja2VyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZXRpbWVQaWNrZXIgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGEgaHJlZj0naHR0cDovL2VvbmFzZGFuLmdpdGh1Yi5pby9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvJz5Cb290c3RyYXAgRGF0ZVRpbWUgUGlja2VyPC9hPi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGVGb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicGlja2VyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZERhdGUiOiAiSW52YWxpZCBkYXRlIGZvciBmb3JtYXQgezB9IgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJkYXRlIiwgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZSIsICJkYXRlIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGV0aW1lRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImRhdGV0aW1lIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdCArICIgIiArIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldERlZmF1bHRFeHRyYUZvcm1hdHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIGhoOm1tOnNzIGEiLAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdCArICIgSEg6bW0iLAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGV0aW1lIjsKICAgICAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAiZGF0ZXRpbWUiOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiRGF0ZXRpbWUgRmllbGQiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiRGF0ZXRpbWUgRmllbGQgYmFzZWQgb24gPGEgaHJlZj0naHR0cDovL2VvbmFzZGFuLmdpdGh1Yi5pby9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvJz5Cb290c3RyYXAgRGF0ZVRpbWUgUGlja2VyPC9hPi4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZXRpbWUiLCBBbHBhY2EuRmllbGRzLkRhdGV0aW1lRmllbGQpOwoKICAgIC8vICJkYXRldGltZSIgaXMgbGVnYWN5IChwcmUgdjQgc2NoZW1hKQogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZXRpbWUiLCAiZGF0ZXRpbWUiKTsKCiAgICAvLyBvZmZpY2lhbCB2NCB1c2VzIGRhdGUtdGltZQogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZS10aW1lIiwgImRhdGV0aW1lIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5FZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5hY2VUaGVtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZVRoZW1lID0gImFjZS90aGVtZS9jaHJvbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5hY2VNb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYWNlTW9kZSA9ICJhY2UvbW9kZS9qc29uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYmVhdXRpZnkpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVhdXRpZnkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmJlYXV0aWZ5ICYmIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKHRoaXMuZGF0YSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIHN0cmluZyB0byBmb3JtYXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0aGlzLmRhdGEpLCBudWxsLCAiICAgICIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9odG1sIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGh0bWxfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGh0bWxfYmVhdXRpZnkodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvY3NzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGNzc19iZWF1dGlmeSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gY3NzX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2phdmFzY3JpcHQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoanNfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGpzX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qc29uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhID09PSAie30iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICJ7XG5cdFxufSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gQUNFIEhFSUdIVAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VIZWlnaHQgPSBzZWxmLm9wdGlvbnMuYWNlSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIGlmIChhY2VIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJoZWlnaHQiLCBhY2VIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQUNFIFdJRFRICiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVdpZHRoID0gc2VsZi5vcHRpb25zLmFjZVdpZHRoOwogICAgICAgICAgICAgICAgICAgIGlmICghYWNlV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWNlV2lkdGggPSAiMTAwJSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoIndpZHRoIiwgYWNlV2lkdGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGxvY2F0ZSB3aGVyZSB3ZSB3aWxsIGluc2VydCB0aGUgZWRpdG9yCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHNlbGYuY29udHJvbClbMF07CgogICAgICAgICAgICAgICAgLy8gYWNlIG11c3QgYmUgaW5jbHVkZWQgYWhlYWQgb2YgdGltZQogICAgICAgICAgICAgICAgaWYgKCFhY2UgJiYgd2luZG93LmFjZSkgewogICAgICAgICAgICAgICAgICAgIGFjZSA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFhY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFZGl0b3IgRmllbGQgaXMgbWlzc2luZyB0aGUgJ2FjZScgQ2xvdWQgOSBFZGl0b3IiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IGFjZS5lZGl0KGVsKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRPcHRpb25zKHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGluZXM6IEluZmluaXR5CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXcmFwTW9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbWUKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlVGhlbWUgPSBzZWxmLm9wdGlvbnMuYWNlVGhlbWU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VGhlbWUoYWNlVGhlbWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZU1vZGUgPSBzZWxmLm9wdGlvbnMuYWNlTW9kZTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShhY2VNb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGUoZmFsc2UpOyAvLyBub3QgaW1wbGVtZW50ZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBvbnRvIGVkaXRvcgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHVuZG8gc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEZJVC1DT05URU5UIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciB0byB0aGUgY29udGVudHMgY29udGFpbmVkIHdpdGhpbgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlRml0Q29udGVudEhlaWdodCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHRVcGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExNTg0MDYxLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0hlaWdodCA9IHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRTY3JlZW5MZW5ndGgoKSAqIHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgKyBzZWxmLmVkaXRvci5yZW5kZXJlci5zY3JvbGxCYXIuZ2V0V2lkdGgoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuaGVpZ2h0KG5ld0hlaWdodC50b1N0cmluZygpICsgInB4Iik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsIGlzIHJlcXVpcmVkIGZvciB0aGUgZWRpdG9yIHRvIGZpeCBhbGwgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbm5lciBzdHJ1Y3R1cmUgZm9yIGFkYXB0aW5nIHRvIGEgY2hhbmdlIGluIHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlc2l6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgc2l6ZSB0byBtYXRjaCBpbml0aWFsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0VXBkYXRlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW5ldmVyIGEgY2hhbmdlIGhhcHBlbnMgaW5zaWRlIHRoZSBBQ0UgZWRpdG9yLCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNpemUgYWdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLm9uKCdjaGFuZ2UnLCBoZWlnaHRVcGRhdGVGdW5jdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSRUFET05MWQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFJlYWRPbmx5KHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBleHBlY3QgQWxwYWNhIGZpZWxkcyB0byBiZSBkZXN0cm95ZWQgYnkgdGhlIGRlc3Ryb3koKSBtZXRob2QgYnV0IHRoZXkgbWF5IGFsc28gYmUKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmVkLXVwIHZpYSB0aGUgRE9NLCB0aHVzIHdlIGNoZWNrIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgJChlbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHRoZSBBQ0UgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICovCiAgICAgICAgZ2V0RWRpdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciB3b3JkQ291bnRTdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVXb3JkQ291bnQoKTsKICAgICAgICAgICAgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogd29yZENvdW50U3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoIndvcmRMaW1pdEV4Y2VlZGVkIiksIFt0aGlzLm9wdGlvbnMud29yZGxpbWl0XSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogd29yZENvdW50U3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZWRpdG9yQW5ub3RhdGlvbnNTdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVkaXRvckFubm90YXRpb25zKCk7CiAgICAgICAgICAgIHZhbEluZm9bImVkaXRvckFubm90YXRpb25zRXhpc3QiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZWRpdG9yQW5ub3RhdGlvbnNTdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIF92YWxpZGF0ZUVkaXRvckFubm90YXRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhbm5vdGF0aW9ucyA9IHRoaXMuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRBbm5vdGF0aW9ucygpOwogICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25zICYmIGFubm90YXRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBmb3Igd29yZCBsaW1pdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXIgb2Ygd29yZHMgaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIHRoZSB3b3JkIGxpbWl0LgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVdvcmRDb3VudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53b3JkbGltaXQgJiYgdGhpcy5vcHRpb25zLndvcmRsaW1pdCA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAodmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB3b3JkY291bnQgPSB2YWwuc3BsaXQoIiAiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRjb3VudCA+IHRoaXMub3B0aW9ucy53b3JkbGltaXQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb3JjZSBlZGl0b3IgdG8gcmVzaXplIHRvIGVuc3VyZSBpdCBnZXRzIGRyYXduIGNvcnJlY3RseS4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5yZXNpemUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIgJiYgQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAiICAgICIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgZXhwZWN0ZWQgdHlwZSBiYWNrIGlzICJvYmplY3QiLCB3ZSBkbyB0aGUgY29udmVyc2lvbgogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEudHlwZSA9PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgVGhlbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSB0aGVtZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL3RoZW1lL3R3aWxpZ2h0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZU1vZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIE1vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBtb2RlIHRvIHNldCBvbnRvIHRoZSBlZGl0b3IgaW5zdGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJhY2UvbW9kZS9qYXZhc2NyaXB0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZVdpZHRoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgd3JhcHBpbmcgZGl2IGFyb3VuZCB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiMTAwJSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIEhlaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgd3JhcHBpbmcgZGl2IGFyb3VuZCB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiMzAwcHgiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlRml0Q29udGVudEhlaWdodCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBGaXQgQ29udGVudCBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJlcyB0aGUgQUNFIEVkaXRvciB0byBhdXRvLWZpdCBpdHMgaGVpZ2h0IHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXb3JkIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpbWl0cyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFsbG93ZWQgaW4gdGhlIHRleHQgYXJlYS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFjZVRoZW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZU1vZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iLAogICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIlRoZSBlZGl0b3IgaGFzIGVycm9ycyBpbiBpdCB0aGF0IG11c3QgYmUgY29ycmVjdGVkIgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5FZGl0b3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVtYWlsIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJlbWFpbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImVtYWlsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZEVtYWlsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVtYWlsIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVtYWlsIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKSA/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5lbWFpbDsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJlbWFpbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbImVtYWlsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRFbWFpbCI6ICJJbnZhbGlkIEVtYWlsIGFkZHJlc3MgZS5nLiBpbmZvQGNsb3VkY21zLmNvbSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZW1haWwiLCBBbHBhY2EuRmllbGRzLkVtYWlsRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZW1haWwiLCAiZW1haWwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImdyaWQiOwogICAgICAgIH0sCgogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmdyaWQpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ3JpZCA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgZGF0YSBhcnJheSBpbnRvIHRoZSBncmlkJ3MgZXhwZWN0ZWQgZm9ybWF0CiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgaW4gaGVhZGVycwogICAgICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZERlZmluaXRpb24gPSBzZWxmLm9wdGlvbnMuZmllbGRzW2tleV07CgogICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGtleTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGREZWZpbml0aW9uLmxhYmVsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBmaWVsZERlZmluaXRpb24ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1c2gobGFiZWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChoZWFkZXJzKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5MiBpbiBzZWxmLmRhdGFbaV0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByb3cucHVzaChzZWxmLmRhdGFbaV1ba2V5Ml0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5wdXNoKHJvdyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgIHZhciBncmlkRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICBbIk1hc2VyYXRpIiwgIk1hemRhIiwgIk1lcmNlZGVzIiwgIk1pbmkiLCAiTWl0c3ViaXNoaSJdLAogICAgICAgICAgICAgICAgICAgIFsiMjAwOSIsIDAsIDI5NDEsIDQzMDMsIDM1NCwgNTgxNF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDEwIiwgNSwgMjkwNSwgMjg2NywgNDEyLCA1Mjg0XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTEiLCA0LCAyNTE3LCA0ODIyLCA1NTIsIDYxMjddLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMiIsIDIsIDI0MjIsIDUzOTksIDc3NiwgNDE1MV0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKHNlbGYuY29udGFpbmVyKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1ncmlkLWhvbGRlciIpOwoKICAgICAgICAgICAgICAgIHZhciBncmlkQ29uZmlnID0gc2VsZi5vcHRpb25zLmdyaWQ7CiAgICAgICAgICAgICAgICBncmlkQ29uZmlnLmRhdGEgPSBncmlkRGF0YTsKCiAgICAgICAgICAgICAgICAkKGhvbGRlcikuaGFuZHNvbnRhYmxlKGdyaWRDb25maWcpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiR3JpZCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgYXJyYXkgaXRlbXMgaW50byBhIGdyaWQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZ3JpZCIsIEFscGFjYS5GaWVsZHMuR3JpZEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW1hZ2UiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkltYWdlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkltYWdlIEZpZWxkLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpbWFnZSIsIEFscGFjYS5GaWVsZHMuSW1hZ2VGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbnRlZ2VyRmllbGQgPSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjb25DaGFuZ2UKICAgICAgICAgKi8KICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlci5zbGlkZXIoInZhbHVlIiwgdGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zbGlkZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhpbXVtKSAmJiAhQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluaW11bSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWZ0ZXIoJzxkaXYgaWQ9InNsaWRlciI+PC9kaXY+Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zbGlkZXIgPSAkKCcjc2xpZGVyJywgc2VsZi5jb250cm9sLnBhcmVudCgpKS5zbGlkZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxmLmdldFZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBzZWxmLnNjaGVtYS5taW5pbXVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogc2VsZi5zY2hlbWEubWF4aW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodWkudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlSW50ZWdlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBbkludGVnZXIiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhbiBpbnRlZ2VyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYW4gaW50ZWdlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUludGVnZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBhcyB0ZXh0CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGV4dFZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRleHRWYWx1ZSA9ICIiICsgdGV4dFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbGxvdyBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbGlkIGludGVnZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMuaW50ZWdlciwgdGV4dFZhbHVlKTsKICAgICAgICAgICAgaWYgKCF2YWxpZE51bWJlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBxdWljayBjaGVjayB0byBzZWUgaWYgd2hhdCB0aGV5IGVudGVyZWQgd2FzIGEgbnVtYmVyCiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAoaXNOYU4oZmxvYXRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJpbnRlZ2VyIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkludGVnZXIgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgaW50ZWdlcnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpdmlzaWJsZSBCeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNYXhpbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpdmlzaWJsZUJ5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIlByb3BlcnR5IHZhbHVlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHRoaXMgbnVtYmVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2xpZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2xpZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdlbmVyYXRlIGpRdWVyeSBVSSBzbGlkZXIgY29udHJvbCB3aXRoIHRoZSBmaWVsZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2xpZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJTbGlkZXIgY29udHJvbCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJHZW5lcmF0ZSBzbGlkZXIgY29udHJvbCBpZiBzZWxlY3RlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyLiIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW50ZWdlciIsIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImludGVnZXIiLCAiaW50ZWdlciIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaXB2NCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmlwdjQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZElQdjQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJUCBBZGRyZXNzIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IEFscGFjYS5yZWdleHBzLmlwdjQ7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJpcC1hZGRyZXNzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiaXAtYWRkcmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSx7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZElQdjQiOiAiSW52YWxpZCBJUHY0IGFkZHJlc3MsIGUuZy4gMTkyLjE2OC4wLjEiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImlwdjQiLCBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJpcC1hZGRyZXNzIiwgImlwdjQiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkpTT05GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkpTT05GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAianNvbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSB8fCB0eXBlb2YodmFsdWUpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IEpTT04ucGFyc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUpTT04oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QUpTT04iXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzLnN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBSlNPTiIpICsiICIrIHN0YXR1cy5tZXNzYWdlLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cy5zdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl1bInN0YXR1cyJdIDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIEpTT04gb2JqZWN0CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlSlNPTjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRleHRWYWx1ZSA9IHRoaXMuY29udHJvbC52YWwoKTsKCiAgICAgICAgICAgIC8vIGFsbG93IG51bGwKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIgOiB0cnVlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBwYXJzZSB0aGUgc3RyaW5nCiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZSh0ZXh0VmFsdWUpOwoKICAgICAgICAgICAgICAgIC8vIGZvcm1hdCB0aGUgc3RyaW5nIGFzIHdlbGwKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiIDogZS5tZXNzYWdlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgYXV0by1mb3JtYXR0aW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5iaW5kKCdrZXlwcmVzcycsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlIHx8IGUud2ljaDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAzNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMTIzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuaW5zZXJ0QXRDYXJldCgnfScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSA5MSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCAnQ3RybCtsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNsYXNzIGZyb20gc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5hdHRyKCd0aXRsZScsJ1R5cGUgQ3RybCtMIHRvIGZvcm1hdCBhbmQgdmFsaWRhdGUgdGhlIEpTT04gc3RyaW5nLicpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkpTT04gRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IgZm9yIEpTT04gb2JqZWN0cyB3aXRoIGJhc2ljIHZhbGlkYXRpb24gYW5kIGZvcm1hdHRpbmcuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBSlNPTiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIHZhbGlkIEpTT04gc3RyaW5nLiIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImpzb24iLCBBbHBhY2EuRmllbGRzLkpTT05GaWVsZCk7CgogICAgJC5mbi5pbnNlcnRBdENhcmV0ID0gZnVuY3Rpb24gKG15VmFsdWUpIHsKCiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vSUUgc3VwcG9ydAogICAgICAgICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7CgogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgc2VsID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICBzZWwudGV4dCA9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CgogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgfHwgdGhpcy5zZWxlY3Rpb25TdGFydCA9PSAnMCcpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCgogICAgICAgICAgICAgICAgLy9NT1pJTExBIC8gTkVUU0NBUEUgc3VwcG9ydAogICAgICAgICAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zZWxlY3Rpb25TdGFydDsKICAgICAgICAgICAgICAgIHZhciBlbmRQb3MgPSB0aGlzLnNlbGVjdGlvbkVuZDsKICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydFBvcykgKyBteVZhbHVlICsgdGhpcy52YWx1ZS5zdWJzdHJpbmcoZW5kUG9zLCB0aGlzLnZhbHVlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnRQb3MgLyorIG15VmFsdWUubGVuZ3RoKi87CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gbXlWYWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICAvKgogICAgICogalF1ZXJ5IEhvdGtleXMgUGx1Z2luCiAgICAgKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogICAgICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAgICAgKgogICAgICogQmFzZWQgdXBvbiB0aGUgcGx1Z2luIGJ5IFR6dXJ5IEJhciBZb2NoYXk6CiAgICAgKiBodHRwOi8vZ2l0aHViLmNvbS90enVyeWJ5L2hvdGtleXMKICAgICAqCiAgICAgKiBPcmlnaW5hbCBpZGVhIGJ5OgogICAgICogQmlubnkgViBBLCBodHRwOi8vd3d3Lm9wZW5qcy5jb20vc2NyaXB0cy9ldmVudHMva2V5Ym9hcmRfc2hvcnRjdXRzLwogICAgKi8KICAgIGpRdWVyeS5ob3RrZXlzID0gewogICAgICAgIHZlcnNpb246ICIwLjgiLAoKICAgICAgICBzcGVjaWFsS2V5czogewogICAgICAgICAgICA4OiAiYmFja3NwYWNlIiwgOTogInRhYiIsIDEzOiAicmV0dXJuIiwgMTY6ICJzaGlmdCIsIDE3OiAiY3RybCIsIDE4OiAiYWx0IiwgMTk6ICJwYXVzZSIsCiAgICAgICAgICAgIDIwOiAiY2Fwc2xvY2siLCAyNzogImVzYyIsIDMyOiAic3BhY2UiLCAzMzogInBhZ2V1cCIsIDM0OiAicGFnZWRvd24iLCAzNTogImVuZCIsIDM2OiAiaG9tZSIsCiAgICAgICAgICAgIDM3OiAibGVmdCIsIDM4OiAidXAiLCAzOTogInJpZ2h0IiwgNDA6ICJkb3duIiwgNDU6ICJpbnNlcnQiLCA0NjogImRlbCIsCiAgICAgICAgICAgIDk2OiAiMCIsIDk3OiAiMSIsIDk4OiAiMiIsIDk5OiAiMyIsIDEwMDogIjQiLCAxMDE6ICI1IiwgMTAyOiAiNiIsIDEwMzogIjciLAogICAgICAgICAgICAxMDQ6ICI4IiwgMTA1OiAiOSIsIDEwNjogIioiLCAxMDc6ICIrIiwgMTA5OiAiLSIsIDExMDogIi4iLCAxMTEgOiAiLyIsCiAgICAgICAgICAgIDExMjogImYxIiwgMTEzOiAiZjIiLCAxMTQ6ICJmMyIsIDExNTogImY0IiwgMTE2OiAiZjUiLCAxMTc6ICJmNiIsIDExODogImY3IiwgMTE5OiAiZjgiLAogICAgICAgICAgICAxMjA6ICJmOSIsIDEyMTogImYxMCIsIDEyMjogImYxMSIsIDEyMzogImYxMiIsIDE0NDogIm51bWxvY2siLCAxNDU6ICJzY3JvbGwiLCAxOTE6ICIvIiwgMjI0OiAibWV0YSIKICAgICAgICB9LAoKICAgICAgICBzaGlmdE51bXM6IHsKICAgICAgICAgICAgImAiOiAifiIsICIxIjogIiEiLCAiMiI6ICJAIiwgIjMiOiAiIyIsICI0IjogIiQiLCAiNSI6ICIlIiwgIjYiOiAiXiIsICI3IjogIiYiLAogICAgICAgICAgICAiOCI6ICIqIiwgIjkiOiAiKCIsICIwIjogIikiLCAiLSI6ICJfIiwgIj0iOiAiKyIsICI7IjogIjogIiwgIiciOiAiXCIiLCAiLCI6ICI8IiwKICAgICAgICAgICAgIi4iOiAiPiIsICAiLyI6ICI/IiwgICJcXCI6ICJ8IgogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24ga2V5SGFuZGxlciggaGFuZGxlT2JqICkgewogICAgICAgIC8vIE9ubHkgY2FyZSB3aGVuIGEgcG9zc2libGUgaW5wdXQgaGFzIGJlZW4gc3BlY2lmaWVkCiAgICAgICAgaWYgKCB0eXBlb2YgaGFuZGxlT2JqLmRhdGEgIT09ICJzdHJpbmciICkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgb3JpZ0hhbmRsZXIgPSBoYW5kbGVPYmouaGFuZGxlciwKICAgICAgICAgICAga2V5cyA9IGhhbmRsZU9iai5kYXRhLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKTsKCiAgICAgICAgaGFuZGxlT2JqLmhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CiAgICAgICAgICAgIC8vIERvbid0IGZpcmUgaW4gdGV4dC1hY2NlcHRpbmcgaW5wdXRzIHRoYXQgd2UgZGlkbid0IGRpcmVjdGx5IGJpbmQgdG8KICAgICAgICAgICAgaWYgKCB0aGlzICE9PSBldmVudC50YXJnZXQgJiYgKC90ZXh0YXJlYXxzZWxlY3QvaS50ZXN0KCBldmVudC50YXJnZXQubm9kZU5hbWUgKSB8fAogICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC50eXBlID09PSAidGV4dCIpICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBLZXlwcmVzcyByZXByZXNlbnRzIGNoYXJhY3RlcnMsIG5vdCBzcGVjaWFsIGtleXMKICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBldmVudC50eXBlICE9PSAia2V5cHJlc3MiICYmIGpRdWVyeS5ob3RrZXlzLnNwZWNpYWxLZXlzWyBldmVudC53aGljaCBdLAogICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQud2hpY2ggKS50b0xvd2VyQ2FzZSgpLAogICAgICAgICAgICAgICAga2V5LCBtb2RpZiA9ICIiLCBwb3NzaWJsZSA9IHt9OwoKICAgICAgICAgICAgLy8gY2hlY2sgY29tYmluYXRpb25zIChhbHR8Y3RybHxzaGlmdCthbnl0aGluZykKICAgICAgICAgICAgaWYgKCBldmVudC5hbHRLZXkgJiYgc3BlY2lhbCAhPT0gImFsdCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAiYWx0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZXZlbnQuY3RybEtleSAmJiBzcGVjaWFsICE9PSAiY3RybCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAiY3RybCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHdvcmtzIGNvbnNpc3RlbnRseSBhY3Jvc3MgcGxhdGZvcm1zCiAgICAgICAgICAgIGlmICggZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuY3RybEtleSAmJiBzcGVjaWFsICE9PSAibWV0YSIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAibWV0YSsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LnNoaWZ0S2V5ICYmIHNwZWNpYWwgIT09ICJzaGlmdCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAic2hpZnQrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBzcGVjaWFsICkgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgc3BlY2lhbCBdID0gdHJ1ZTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwb3NzaWJsZVsgbW9kaWYgKyBjaGFyYWN0ZXIgXSA9IHRydWU7CiAgICAgICAgICAgICAgICBwb3NzaWJsZVsgbW9kaWYgKyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVlOwoKICAgICAgICAgICAgICAgIC8vICIkIiBjYW4gYmUgdHJpZ2dlcmVkIGFzICJTaGlmdCs0IiBvciAiU2hpZnQrJCIgb3IganVzdCAiJCIKICAgICAgICAgICAgICAgIGlmICggbW9kaWYgPT09ICJzaGlmdCsiICkgewogICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKICAgICAgICAgICAgICAgIGlmICggcG9zc2libGVbIGtleXNbaV0gXSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0hhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBqUXVlcnkuZWFjaChbICJrZXlkb3duIiwgImtleXVwIiwgImtleXByZXNzIiBdLCBmdW5jdGlvbigpIHsKICAgICAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdGhpcyBdID0geyBhZGQ6IGtleUhhbmRsZXIgfTsKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImxvd2VyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbG93ZXJWYWx1ZSA9IHZhbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgaWYgKGxvd2VyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGxvd2VyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTG93ZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgbG93ZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImxvd2VyY2FzZSIsIEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygibG93ZXJjYXNlIiwgImxvd2VyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTWFwRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5NYXBGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibWFwIjsKICAgICAgICB9LAoKICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCIKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIC0gZGF0YSBjYW4gY29tZSBpbiBhcyBhbiBvYmplY3QsIHdlIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiBBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kYXRhLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gQWxwYWNhLmNvcHlPZih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVbIl9rZXkiXSA9IGtleTsKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhLnB1c2gobmV3VmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3RGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAiZm9yY2VSZXZhbGlkYXRpb24iIDogdHJ1ZQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRDb250YWluZXJWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRhaW5lclZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiBhbmQgd2UncmUgbm90IHJlcXVpcmVkLCBoYW5kIGJhY2sgdW5kZWZpbmVkCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZywgY29udmVydCBiYWNrIHRvIG9iamVjdAogICAgICAgICAgICB2YXIgbyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZbIl9rZXkiXTsKICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5ID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzTm90RW1wdHkoKTsKICAgICAgICAgICAgdmFsSW5mb1sia2V5TWlzc2luZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5ID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImtleU1pc3NpbmciKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNVbmlxdWUgPSB0aGlzLl92YWxpZGF0ZU1hcEtleXNVbmlxdWUoKTsKICAgICAgICAgICAgdmFsSW5mb1sia2V5Tm90VW5pcXVlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGlzVmFsaWRNYXBLZXlzVW5pcXVlID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImtleU5vdFVuaXF1ZSIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IGlzVmFsaWRNYXBLZXlzVW5pcXVlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJrZXlNaXNzaW5nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgdGhhdCBrZXkgZmllbGRzIGFyZSBub3QgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSBub3QgZW1wdHkKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzTm90RW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gdlsiX2tleSJdOwoKICAgICAgICAgICAgICAgIGlmICgha2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGtleSBmaWVsZHMgYXJlIHVuaXF1ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGtleXMgYXJlIHVuaXF1ZQogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1hcEtleXNVbmlxdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgIHZhciBrZXlzID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gdlsiX2tleSJdOwoKICAgICAgICAgICAgICAgIGlmIChrZXlzW2tleV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IGtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk1hcCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIG9iamVjdHMgd2l0aCBrZXkvdmFsdWUgcGFpcnMgdGhhdCBzaGFyZSB0aGUgc2FtZSBzY2hlbWEgZm9yIHZhbHVlcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibWFwIiwgQWxwYWNhLkZpZWxkcy5NYXBGaWVsZCk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImtleU5vdFVuaXF1ZSI6ICJLZXlzIG9mIG1hcCBmaWVsZCBhcmUgbm90IHVuaXF1ZS4iLAogICAgICAgICJrZXlNaXNzaW5nIjogIk1hcCBjb250YWlucyBhbiBlbXB0eSBrZXkuIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWUucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvcHRpb250cmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5vcmRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUub3JkZXIgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIGFsbCBvcHRpb25zIGhhdmUgc2NoZW1hCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5zY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk9wdGlvblRyZWUgc2VsZWN0b3IgZm9yOiAiICsgayArICIgaXMgbWlzc2luZyBzY2hlbWEiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIGRhdGEKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMudHJlZS5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMub3B0aW9ucy50cmVlLmRhdGFbaV07CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGl0ZW0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5vcHRpb25zLm5vbmVMYWJlbCA9ICJDaG9vc2UuLi4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgb3JkZXIgZnJvbSB0aGUgb3B0aW9ucyBpZiBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyID0gW107CgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIucHVzaChzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGxvb2t1cCBsaXN0IGZvciBvcHRpb24gbGlzdCBrZXkvdmFsdWUgYmFzZWQgb24gbG9jYXRpb24KICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlcyA9IHt9OwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlc1trXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzW2xvY2F0aW9uXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzW2xvY2F0aW9uXSA9IGFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJyYXkubGVuZ3RoOyB4KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVt4XS52YWx1ZSA9PT0gdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlc1tsb2NhdGlvbl0gPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSB7fTsKICAgICAgICB9LAoKICAgICAgICB0b0xvY2F0aW9uOiBmdW5jdGlvbihhdHRycykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gYXR0cnNba107CgogICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gayArICI9IiArIHY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjsKICAgICAgICB9LAoKICAgICAgICBleGlzdHNMb2NhdGlvbldpdGhQcmVmaXg6IGZ1bmN0aW9uKHByZWZpeCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGZhbHNlOwoKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZihwcmVmaXgpID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250cm9sCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYub3B0aW9uVHJlZUhvbGRlciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLm9wdGlvbnRyZWUiKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmFkZENsYXNzKCJvcHRpb250cmVlLWhvcml6b250YWwiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHMoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaE9wdGlvblRyZWVDb250cm9sczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBoaWRlIGFsbCBvZiB0aGUgY29udHJvbHMKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLmNvbnRyb2xzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW2tdLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb3B0aW9uIGZvciB3aGljaCB3ZSBhcmUgbWlzc2luZyBhIHZhbHVlCiAgICAgICAgICAgIHZhciBkaXNwbGF5VXBUb0luZGV4ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSBzZWxmLm9wdGlvbnMudHJlZS5vcmRlcltpXTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0pICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdICE9PSBudWxsICAmJiBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdICE9PSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VXBUb0luZGV4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBvcmRlciBhbmQgY29uc3RydWN0IHJlbmRlciBmdW5jdGlvbnMKICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gInJvb3QiOwogICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgIHZhciBkaXNwbGF5Q291bnQgPSAwOwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBoYXNNYXRjaGVzID0gKGkgPT0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoIC0gMSkgfHwgKHNlbGYuZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4KGxvY2F0aW9uICsgIn4iICsgc2VsZWN0b3JJZCArICI9IikpOwogICAgICAgICAgICAgICAgICAgIGlmIChoYXNNYXRjaGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlDb3VudCA8PSBkaXNwbGF5VXBUb0luZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9ICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIgKyBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IHNlbGYub3B0aW9ucy50cmVlLnNlbGVjdG9yc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IChpICsgMSA9PT0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oaW5kZXgsIHNlbGVjdG9ySWQsIHNlbGVjdG9yLCBjb250cm9scywgb3B0aW9uVHJlZUhvbGRlciwgbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FTY2hlbWEgPSBzZWxlY3Rvci5zY2hlbWE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYU9wdGlvbnMgPSBzZWxlY3Rvci5vcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHBhY2FPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHBhY2FPcHRpb25zLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FPcHRpb25zLnR5cGUgPSAic2VsZWN0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhT3B0aW9ucy50eXBlID09PSAic2VsZWN0IikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FPcHRpb25zLmRhdGFTb3VyY2UgPSBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRMb2NhdGlvbiA9IHNlbGYudG9Mb2NhdGlvbihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZUxpc3QgPSBzZWxmLmxvY2F0aW9uVmFsdWVMaXN0c1tjdXJyZW50TG9jYXRpb25dOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY3VycmVudFZhbHVlTGlzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHZpYSBhbHBhY2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21FbCA9ICQoIjxkaXYgY2xhc3M9J29wdGlvbnRyZWUtc2VsZWN0b3InPjwvZGl2PiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9tRWwpLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaGVtYSI6IGFscGFjYVNjaGVtYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGFscGFjYU9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiBmdW5jdGlvbihjb250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sc1tzZWxlY3RvcklkXSA9IGNvbnRyb2w7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgdG8gdGhlIGhvbGRlciBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQob3B0aW9uVHJlZUhvbGRlcikuYXBwZW5kKGRvbUVsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0b3JJZCA9IHNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnRyb2wgY2hhbmdlcywgd2UgcmVjb3JkIGl0IGludG8gb3VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYXR0cmlidXRlIHNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHRoaXMuc2VsZWN0b3JJZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb3VyIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgZXZlcnl0aGluZyBwYXN0IG91ciBpbmRleCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSBzZWxmLm9wdGlvbnMudHJlZS5vcmRlcltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jdXJyZW50QXR0cmlidXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2tdICE9PSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW2tdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpLCBzZWxlY3RvcklkLCBzZWxlY3Rvciwgc2VsZi5jb250cm9scywgc2VsZi5vcHRpb25UcmVlSG9sZGVyLCBsYXN0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5zLnB1c2goZm4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICBBbHBhY2Euc2VyaWVzKGZucywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPcHRpb24gVHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRyZWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvcml6b250YWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygib3B0aW9udHJlZSIsIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlBhc3N3b3JkRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlBhc3N3b3JkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGFzc3dvcmQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5wYXNzd29yZDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGFzc3dvcmQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGFzc3dvcmQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGFzc3dvcmQgRmllbGQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnBhdHRlcm4pPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogL15bMC05YS16QS1aXHgyMC1ceDdFXSokLzsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0aGlzLnNjaGVtYS5wYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKCQkJCQkiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKCQkJCQkJImRlZmF1bHQiOiJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbInBhc3N3b3JkIl0sCgkJCQkJCSJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KCQlnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSx7CgkJCQkiZmllbGRzIjogewoJCQkJCSJmb3JtYXQiOiB7CgkJCQkJCSJ0eXBlIjogInRleHQiCgkJCQkJfQoJCQkJfQoJCQl9KTsKICAgICAgICB9CgoJCS8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIkludmFsaWQgUGFzc3dvcmQiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBhc3N3b3JkIiwgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBhc3N3b3JkIiwgInBhc3N3b3JkIik7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlBlcnNvbmFsTmFtZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJwZXJzb25hbG5hbWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29udmVydCB0byB1cHBlci1jYXNlCiAgICAgICAgICAgIHZhciB1cHBlclZhbHVlID0gIiI7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWwuY2hhckF0KGkgLSAxKSA9PT0gJyAnIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAnLScgfHwgdmFsLmNoYXJBdChpIC0gMSkgPT09ICInIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1cHBlclZhbHVlICs9IHZhbC5jaGFyQXQoaSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1cHBlclZhbHVlICs9IHZhbC5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh1cHBlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh1cHBlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQZXJzb25hbCBOYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgRmllbGQgZm9yIHBlcnNvbmFsIG5hbWUgd2l0aCBjYXB0aWNhbCBsZXR0ZXIgZm9yIGZpcnN0IGxldHRlciAmIGFmdGVyIGh5cGhlbiwgc3BhY2Ugb3IgYXBvc3Ryb3BoZS4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGVyc29uYWxuYW1lIiwgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidGVsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidGVsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubWFza1N0cmluZykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tYXNrU3RyaW5nID0gIig5OTkpIDk5OS05OTk5IjsKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRQaG9uZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGhvbmUiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBob25lIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBob25lIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKSA/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5waG9uZTsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJwaG9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbInBob25lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgTWFzayBTdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwcmVzc2lvbiBmb3IgZmllbGQgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIig5OTkpIDk5OS05OTk5IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQaG9uZSI6ICJJbnZhbGlkIFBob25lIE51bWJlciwgZS5nLiAoMTIzKSA0NTYtOTk5OSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGhvbmUiLCBBbHBhY2EuRmllbGRzLlBob25lRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygicGhvbmUiLCAicGhvbmUiKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlczogaHR0cHM6Ly9naXRodWIuY29tL2JpbGx5YXJhdWpvL3BpY2stYS1jb2xvcgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5waWNrQUNvbG9yKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvcikgPT09ICJ1bmRlZmluZWQiICYmICFzZWxmLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBpY2thY29sb3IgPSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1NwZWN0cnVtICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93U2F2ZWRDb2xvcnMgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNhdmVDb2xvcnNQZXJFbGVtZW50ICA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGZhZGVNZW51VG9nZ2xlICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0FkdmFuY2VkICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93QmFzaWNDb2xvcnMgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dIZXhJbnB1dCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgYWxsb3dCbGFuayAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBpbmxpbmVEcm9wZG93biAgICAgICAgOiBmYWxzZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgY29sb3JzIG5vdCBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0IGNvbG9ycwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9ycyA9IHsKICAgICAgICAgICAgICAgICAgICB3aGl0ZTogIiNmZmZmZmYiLAogICAgICAgICAgICAgICAgICAgIGNsb3VkczogIiNlY2YwZjEiLAogICAgICAgICAgICAgICAgICAgIHJlZDogIiNjMDM5MmIiLAogICAgICAgICAgICAgICAgICAgIG9yYW5nZTogIiNlNjdlMjIiLAogICAgICAgICAgICAgICAgICAgIHllbGxvdzogIiNmMWM0MGYiLAogICAgICAgICAgICAgICAgICAgIGdyZWVuOiAiIzI3YWU2MCIsCiAgICAgICAgICAgICAgICAgICAgYmx1ZTogIiMyOTgwYjkiLAogICAgICAgICAgICAgICAgICAgIHB1cnBsZTogIiM4ZTQ0YWQiLAogICAgICAgICAgICAgICAgICAgIGRhcms6ICIjMzQ0OTVlIiwKICAgICAgICAgICAgICAgICAgICBibGFjazogIiMwMDAwMDAiLAogICAgICAgICAgICAgICAgICAgIGJyb3duOiAiI2JiOTk3NyIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGlja2Fjb2xvciAmJiB0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IuYmFzaWNDb2xvcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBpY2thY29sb3IuYmFzaWNDb2xvcnMgPSB0aGlzLm9wdGlvbnMuY29sb3JzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmlubGluZURyb3Bkb3duKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmlubGluZURyb3Bkb3duID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGlja2Fjb2xvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUgJiYgc2VsZi5vcHRpb25zLnBpY2thY29sb3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYXR0cigidmFsdWUiLCBzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWRkQ2xhc3MoInBpY2stYS1jb2xvciIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkucGlja0FDb2xvcihzZWxmLm9wdGlvbnMucGlja2Fjb2xvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oImNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaWNrLUEtQ29sb3IgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQSBjb2xvciBwaWNrZXIgZm9yIHNlbGVjdGluZyBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGlja2Fjb2xvciIsIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlYXJjaEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInNlYXJjaCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInNlYXJjaCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzLnJlc3VsdHMgPSA1OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzZWFyY2giOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VhcmNoIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgc2VhcmNoIGJveCBmaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWFyY2giLCBBbHBhY2EuRmllbGRzLlNlYXJjaEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInNlYXJjaCIsICJzZWFyY2giKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncyA9IHt9OwoKICAgIEFscGFjYS51c0hvbGRpbmdzLnRlcnJpdG9yaWVzID0gewogICAgICAgICJBbWVyaWNhbiBTYW1vYSIgICAgICAgICAgICAgICAgIDogIkFTIiwKICAgICAgICAiRGlzdHJpY3QgT2YgQ29sdW1iaWEiICAgICAgICAgICA6ICJEQyIsCiAgICAgICAgIkZlZGVyYXRlZCBTdGF0ZXMgT2YgTWljcm9uZXNpYSIgOiAiRk0iLAogICAgICAgICJHdWFtIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkdVIiwKICAgICAgICAiTWFyc2hhbGwgSXNsYW5kcyIgICAgICAgICAgICAgICA6ICJNSCIsCiAgICAgICAgIk5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIgICAgICAgOiAiTVAiLAogICAgICAgICJQYWxhdSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlBXIiwKICAgICAgICAiUHVlcnRvIFJpY28iICAgICAgICAgICAgICAgICAgICA6ICJQUiIsCiAgICAgICAgIlZpcmdpbiBJc2xhbmRzIiAgICAgICAgICAgICAgICAgOiAiVkkiCiAgICB9OwoKICAgIEFscGFjYS51c0hvbGRpbmdzLnN0YXRlcyA9ICB7CiAgICAgICAgIkFsYWJhbWEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQUwiLAogICAgICAgICJBbGFza2EiICAgICAgICAgICAgICAgICAgICAgICAgIDogIkFLIiwKICAgICAgICAiQXJpem9uYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJBWiIsCiAgICAgICAgIkFya2Fuc2FzIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQVIiLAogICAgICAgICJDYWxpZm9ybmlhIiAgICAgICAgICAgICAgICAgICAgIDogIkNBIiwKICAgICAgICAiQ29sb3JhZG8iICAgICAgICAgICAgICAgICAgICAgICA6ICJDTyIsCiAgICAgICAgIkNvbm5lY3RpY3V0IiAgICAgICAgICAgICAgICAgICAgOiAiQ1QiLAogICAgICAgICJEZWxhd2FyZSIgICAgICAgICAgICAgICAgICAgICAgIDogIkRFIiwKICAgICAgICAiRmxvcmlkYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJGTCIsCiAgICAgICAgIkdlb3JnaWEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiR0EiLAogICAgICAgICJIYXdhaWkiICAgICAgICAgICAgICAgICAgICAgICAgIDogIkhJIiwKICAgICAgICAiSWRhaG8iICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJRCIsCiAgICAgICAgIklsbGlub2lzIiAgICAgICAgICAgICAgICAgICAgICAgOiAiSUwiLAogICAgICAgICJJbmRpYW5hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIklOIiwKICAgICAgICAiSW93YSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJQSIsCiAgICAgICAgIkthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiS1MiLAogICAgICAgICJLZW50dWNreSIgICAgICAgICAgICAgICAgICAgICAgIDogIktZIiwKICAgICAgICAiTG91aXNpYW5hIiAgICAgICAgICAgICAgICAgICAgICA6ICJMQSIsCiAgICAgICAgIk1haW5lIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTUUiLAogICAgICAgICJNYXJ5bGFuZCIgICAgICAgICAgICAgICAgICAgICAgIDogIk1EIiwKICAgICAgICAiTWFzc2FjaHVzZXR0cyIgICAgICAgICAgICAgICAgICA6ICJNQSIsCiAgICAgICAgIk1pY2hpZ2FuIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTUkiLAogICAgICAgICJNaW5uZXNvdGEiICAgICAgICAgICAgICAgICAgICAgIDogIk1OIiwKICAgICAgICAiTWlzc2lzc2lwcGkiICAgICAgICAgICAgICAgICAgICA6ICJNUyIsCiAgICAgICAgIk1pc3NvdXJpIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTU8iLAogICAgICAgICJNb250YW5hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIk1UIiwKICAgICAgICAiTmVicmFza2EiICAgICAgICAgICAgICAgICAgICAgICA6ICJORSIsCiAgICAgICAgIk5ldmFkYSIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTlYiLAogICAgICAgICJOZXcgSGFtcHNoaXJlIiAgICAgICAgICAgICAgICAgIDogIk5IIiwKICAgICAgICAiTmV3IEplcnNleSIgICAgICAgICAgICAgICAgICAgICA6ICJOSiIsCiAgICAgICAgIk5ldyBNZXhpY28iICAgICAgICAgICAgICAgICAgICAgOiAiTk0iLAogICAgICAgICJOZXcgWW9yayIgICAgICAgICAgICAgICAgICAgICAgIDogIk5ZIiwKICAgICAgICAiTm9ydGggQ2Fyb2xpbmEiICAgICAgICAgICAgICAgICA6ICJOQyIsCiAgICAgICAgIk5vcnRoIERha290YSIgICAgICAgICAgICAgICAgICAgOiAiTkQiLAogICAgICAgICJPaGlvIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9IIiwKICAgICAgICAiT2tsYWhvbWEiICAgICAgICAgICAgICAgICAgICAgICA6ICJPSyIsCiAgICAgICAgIk9yZWdvbiIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiT1IiLAogICAgICAgICJQZW5uc3lsdmFuaWEiICAgICAgICAgICAgICAgICAgIDogIlBBIiwKICAgICAgICAiUmhvZGUgSXNsYW5kIiAgICAgICAgICAgICAgICAgICA6ICJSSSIsCiAgICAgICAgIlNvdXRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiU0MiLAogICAgICAgICJTb3V0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIlNEIiwKICAgICAgICAiVGVubmVzc2VlIiAgICAgICAgICAgICAgICAgICAgICA6ICJUTiIsCiAgICAgICAgIlRleGFzIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVFgiLAogICAgICAgICJVdGFoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlVUIiwKICAgICAgICAiVmVybW9udCIgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVCIsCiAgICAgICAgIlZpcmdpbmlhIiAgICAgICAgICAgICAgICAgICAgICAgOiAiVkEiLAogICAgICAgICJXYXNoaW5ndG9uIiAgICAgICAgICAgICAgICAgICAgIDogIldBIiwKICAgICAgICAiV2VzdCBWaXJnaW5pYSIgICAgICAgICAgICAgICAgICA6ICJXViIsCiAgICAgICAgIldpc2NvbnNpbiIgICAgICAgICAgICAgICAgICAgICAgOiAiV0kiLAogICAgICAgICJXeW9taW5nIiAgICAgICAgICAgICAgICAgICAgICAgIDogIldZIgogICAgfTsKCiAgICBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU3RhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdGF0ZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVTdGF0ZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmZvcm1hdCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHZhbGlkYXRlIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmFtZSIgfHwgdGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImNvZGUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2YWxpZCBmb3JtYXRzCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlRoZSBjb25maWd1cmVkIHN0YXRlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtuYW1lLCBjb2RlXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmFtZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbmZpZ3VyZQogICAgICAgICAgICB2YXIgaG9sZGluZ3MgPSBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzKAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVTdGF0ZXMsCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzLAogICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIiksCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSk7CgogICAgICAgICAgICB0aGlzLnNjaGVtYVsiZW51bSJdID0gaG9sZGluZ3Mua2V5czsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IGhvbGRpbmdzLnZhbHVlczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTdGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGRyb3Bkb3duIHNlbGVjdG9yIG9mIHN0YXRlcyBhbmQvb3IgdGVycml0b3JpZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGtleWVkIGJ5IHRoZWlyIHR3by1jaGFyYWN0ZXIgY29kZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIb3cgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbIm5hbWUiLCAiY29kZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNhcGl0YWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgdmFsdWVzIHNob3VsZCBiZSBjYXBpdGFsaXplZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkluY2x1ZGUgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgc3RhdGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVUZXJyaXRvcmllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkluY2x1ZGUgVGVycml0b3JpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBpbmNsdWRlIHRoZSB0ZXJyaXRvcmllcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjYXBpdGFsaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlU3RhdGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzdGF0ZSIsIEFscGFjYS5GaWVsZHMuU3RhdGVGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJzdGF0ZSIsICJzdGF0ZSIpOwoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBob2xkaW5ncyBvZiBVUyBzdGF0ZXMgYW5kIHRlcnJpdG9yaWVzLgogICAgICoKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5jbHVkZVN0YXRlcyB3aGV0aGVyIHRvIGluY2x1ZGUgVVMgc3RhdGVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVUZXJyaXRvcmllcyB3aGV0aGVyIHRvIGluY2x1ZGUgVVMgdGVycml0b3JpZXMKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29kZVZhbHVlIHdoZXRoZXIgdG8gaGFuZCBiYWNrIFVTIGhvbGRpbmcgY29kZXMgKGluc3RlYWQgb2YgbmFtZXMpCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNhcGl0YWxpemUgd2hldGhlciB0byBjYXBpdGFsaXplIHRoZSB2YWx1ZXMgaGFuZGVkIGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBhbiBvYmplY3QgY29udGFpbmluZyAia2V5cyIgYW5kICJ2YWx1ZXMiLCBib3RoIG9mIHdoaWNoIGFyZSBhcnJheXMuCiAgICAgKi8KICAgIEFscGFjYS5yZXRyaWV2ZVVTSG9sZGluZ3MgPSAoZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbihpbmNsdWRlU3RhdGVzLCBpbmNsdWRlVGVycml0b3JpZXMsIGNvZGVWYWx1ZSwgY2FwaXRhbGl6ZSkgewogICAgICAgICAgICB2YXIgcmVzICA9IHsKICAgICAgICAgICAgICAgIGtleXM6ICAgW10sCiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoCiAgICAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgICAgIGluY2x1ZGVTdGF0ZXMgICAgICA/IEFscGFjYS51c0hvbGRpbmdzLnN0YXRlcyAgICAgIDoge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlVGVycml0b3JpZXMgPyBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA6IHt9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciBzb3J0ZWQgPSBPYmplY3Qua2V5cyhvcHRzKTsKICAgICAgICAgICAgc29ydGVkLnNvcnQoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3J0ZWQpIHsKICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHNvcnRlZFtpXTsKICAgICAgICAgICAgICAgIHZhciBrZXkgICA9IG9wdHNbc3RhdGVdOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29kZVZhbHVlID8ga2V5IDogc3RhdGU7CiAgICAgICAgICAgICAgICBpZiAoY2FwaXRhbGl6ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5rZXlzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgIHJlcy52YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgfSkoKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlN1bW1lcm5vdGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN1bW1lcm5vdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3VtbWVybm90ZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnN1bW1lcm5vdGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3VtbWVybm90ZSA9IHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBmb2N1czogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBTdW1tZXJub3RlIEVkaXRvcgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgJC5mbi5zdW1tZXJub3RlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKHNlbGYub3B0aW9ucy5zdW1tZXJub3RlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBzdW1tZXJub3RlJ3MgZG9tIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQsIG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cCB0aGUgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgJChzZWxmLmNvbnRyb2wpLnN1bW1lcm5vdGUoJ2Rlc3Ryb3knKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgICwKICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3VtbWVybm90ZSBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgU3VtbWVybm90ZSBFZGl0b3IgY29udHJvbCBmb3IgdXNlIGluIGVkaXRpbmcgSFRNTC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzdW1tZXJub3RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VtbWVybm90ZSBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBTdW1tZXJub3RlIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzdW1tZXJub3RlIiwgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogVGhlIHRhYmxlIGZpZWxkIGlzIHVzZWQgZm9yIGRhdGEgcmVwcmVzZW50YXRpb25zIHRoYXQgY29uc2lzdCBvZiBhbiBhcnJheSB3aXRoIG9iamVjdHMgaW5zaWRlIG9mIGl0LiAgVGhlIG9iamVjdHMKICAgICAqIG11c3QgaGF2ZSBhIHVuaWZvcm0gc3RydWN0dXJlLiAgVGhlIHRhYmxlIGZpZWxkIHJlbmRlcnMgYSBzdGFuZGFyZCBIVE1MIHRhYmxlIHVzaW5nIHRoZSB0YWJsZS4gIFRoZSBpbmRpdmlkdWFsCiAgICAgKiBjb2x1bW5zIGFyZSBlaXRoZXIgZWRpdGFibGUgKGluIGVkaXQgbW9kZSkgb3Igc2ltcGx5IGRpc3BsYXllZCBpbiByZWFkLW9ubHkgbW9kZS4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcy5UYWJsZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmFuaW1hdGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFuaW1hdGUgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHRvb2xiYXIgc3RpY2t5IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcy50eXBlID0gInRhYmxlcm93IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgZWl0aGVyICJkYXRhdGFibGUiIG9yICJkYXRhdGFibGVzIgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMgPSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBlbXB0eSBvcHRpb25zIGZvciBkYXRhdGFibGVzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRhdGF0YWJsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgInBhZ2luZyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJsZW5ndGhDaGFuZ2UiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaW5mbyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzZWFyY2hpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAib3JkZXJpbmciOiB0cnVlCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGRyYWdnYWJsZSByZW9yZGVyIG9mIHJvd3MKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRyYWdSb3dzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kcmFnUm93cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIGFjdGlvbnMgY29sdW1uIHRvIGJlIHNob3duCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHRydWU7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGEgdGFibGVzIGNvbHVtbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucyA9IFtdOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlcyB0byBkZXRlY3QgYWxwYWNhIGZpZWxkIHR5cGVzIGFuZCBwZXJmb3JtIGFscGFjYSBmaWVsZCBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcKICAgICAgICAgICAgaWYgKCQuZm4uZGF0YVRhYmxlRXh0ICYmICEkLmZuLkRhdGFUYWJsZS5leHQudHlwZS5zZWFyY2hbImFscGFjYSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmZuLkRhdGFUYWJsZS5leHQub3JkZXJbImFscGFjYSJdID0gZnVuY3Rpb24gKHNldHRpbmdzLCBjb2wpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZGF0YSBwcm9wZXJ0eSBoYXMgbGF0ZXN0IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVydHkgYnkgaW5kZXgKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBjb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHNlbGYuZGF0YVtpXVtwcm9wZXJ0eU5hbWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuc29ydCgpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEga2luZCBvZiBoYWNreSBmdW5jdGlvbiBhdCB0aGUgbW9tZW50LCB0cnlpbmcgdG8gZG8gZmlsdGVyaW5nIHRoYXQgdGFrZXMgaW50byBhY2NvdW50CiAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIGRhdGEgdGFibGVzIGF1dGhvcnMsIG5lZWQgdG8gd2FpdCBmb3IgbmV4dCByZWxlYXNlIGZvciByZWZhY3RvcmluZyBvZiBmaWx0ZXJpbmcKICAgICAgICAgICAgICAgIC8vIGxvZ2ljIGluIGRhdGEgdGFibGVzIHRvIHJlYWxseSB0YWtlIGNvbnRyb2wgb2YgdGhpcyBhbmQgZG8gaXQgcmlnaHQKICAgICAgICAgICAgICAgIC8vIHRoaXMgInNvcnQgb2YiIHdvcmtzIGZvciBub3cKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAkLmZuLmRhdGFUYWJsZUV4dC5hZm5GaWx0ZXJpbmcucHVzaChmdW5jdGlvbihzZXR0aW5ncywgZmllbGRzLCBmaWVsZEluZGV4LCBkYXRhLCBkYXRhSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gJChzZXR0aW5ncy5uVGFibGVXcmFwcGVyKS5maW5kKCIuZGF0YVRhYmxlc19maWx0ZXIgaW5wdXRbdHlwZT0nc2VhcmNoJ10iKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIiICsgdGV4dDsKCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICQudHJpbSh0ZXh0KTsKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFWYWx1ZSA9IGRhdGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6ID0gZGF0YVZhbHVlLmluZGV4T2YoImRhdGEtYWxwYWNhLWZpZWxkLWlkPSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHogPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhSWQgPSAkKGRhdGFWYWx1ZSkuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYVZhbHVlID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUlkXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gIiIgKyBhbHBhY2FWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhVmFsdWUgPSBhbHBhY2FWYWx1ZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYVZhbHVlLmluZGV4T2YodGV4dCkgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGUiOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBhIHNlcGFyYXRlICJpdGVtcyIgYXJyYXkgdGhhdCB3ZSdsbCB1c2UgdG8gYnVpbGQgb3V0IHRoZSB0YWJsZSBoZWFkZXIKICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmlkID0gazsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllc1trXS50aXRsZTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLml0ZW1zICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHMgJiYgc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXS5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXS50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaGVhZGVycy5wdXNoKGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VGFibGVFbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoJChzZWxmLmNvbnRhaW5lcikuZmluZCgidGFibGUiKVswXSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRhYmxlIGZpZWxkIHVzZXMgdGhlICJhcnJheSIgY29udGFpbmVyIGNvbnZlbnRpb24gdG8gcmVuZGVyIHRoZSBET00uICBBcyBzdWNoLCBuZXN0ZWQgb2JqZWN0cyBhcmUgd3JhcHBlZAogICAgICAgICAqIGluICJmaWVsZCIgZWxlbWVudHMgdGhhdCByZXN1bHQgaW4gc2xpZ2h0bHkgaW5jb3JyZWN0IHRhYmxlIHN0cnVjdHVyZXMuICBQYXJ0IG9mIHRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdAogICAgICAgICAqIGJyb3dzZXJzIGFyZSB2ZXJ5IGZ1c3N5IHdoZW4gaXQgY29tZXMgdG8gaW5qZWN0aW9uIG9mIG5lc3RlZCBUUiBvciBURCBwYXJ0aWFscy4gIEhlcmUsIHdlIGdlbmVyYXRlIG1vc3QKICAgICAgICAgKiB0aGluZ3MgYXMgRElWcyBhbmQgdGhlbiBkbyBzb21lIGNsZWFudXAgaW4gdGhpcyBtZXRob2QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGlzIHB1dCB0b2dlaHRlciBpbiB0aGUKICAgICAgICAgKiByaWdodCB3YXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFudXBEb21JbmplY3Rpb25zKCk7CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgc3R5bGVzIG9mIHVuZGVybHlpbmcgInRhYmxlIgogICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gc2VsZi5nZXRUYWJsZUVsKCk7CiAgICAgICAgICAgICAgICBzZWxmLmFwcGx5U3R5bGUoInRhYmxlIiwgdGFibGUpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBEYXRhVGFibGVzIHBsdWdpbiBpcyBhdmFpbGFibGUsIHVzZSBpdAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhdGFibGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLkRhdGFUYWJsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHNldHRpbmcgdXAgZm9yIGRyYWdnaW5nIHJvd3MsIHRoZW4gYWRkIHRoYXQgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImRyYWdSb3dzSW5kZXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0RyYWdnYWJsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXggaW4gZmllbGRzIGZyb20gdGhlIGl0ZW1zCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbENvbmZpZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJEYXRhVHlwZSI6ICJhbHBhY2EiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaChjb2xDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGFjdGlvbnMgY29sdW1uIGVuYWJsZWQsIHRoZW4gdHVybiBvZmYgc29ydGluZyBmb3IgdGhlIGFjdGlvbnMgY29sdW1uIChhc3N1bWVkIHRvIGJlIGxhc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kcmFnUm93cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXNbInJvd1Jlb3JkZXIiXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0b3IiOiAidHIgdGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU3JjIjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic25hcFgiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGUiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFVkVOVCBIQU5ETEVSUwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgInJlYWR5IiBldmVudCBhbmQgd2hlbiBpdCBmaXJlcywgaW5pdCBkYXRhIHRhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgRE9NIGFuZCBhbnl0aGluZyB3cmFwcGluZyBvdXIgdGFibGUgZmllbGQgaW5zdGFuY2UgaXMgcmVhZHkgdG8gcm9jawogICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgd2UgcHJvY2VlZAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZigicmVhZHkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyIGRvd24gb2xkIGRhdGEgdGFibGVzIGRhdGEgaWYgaXQgaXMgc3RpbGwgYXJvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGUgZG9tIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgdGFibGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdCA9ICQodGFibGUpLkRhdGFUYWJsZShzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgInJvdy1yZW9yZGVyIiBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oInJvdy1yZW9yZGVyIiwgZnVuY3Rpb24oZSwgZGlmZiwgZWRpdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIGRhdGEgc3RydWN0dXJlIHRvIHJlZmxlY3QgdGhlIHNoaWZ0IGluIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZlswXS5vbGRQb3NpdGlvbiAhPT0gZGlmZlswXS5uZXdQb3NpdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmVJdGVtKGRpZmZbMF0ub2xkUG9zaXRpb24sIGRpZmZbMF0ubmV3UG9zaXRpb24sIGZhbHNlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSB1bmRlcmx5aW5nIHRhYmxlIERPTSBlbGVtZW50IGJlaW5nIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGF0IGhhcHBlbnMsIHRlYXIgZG93biB0aGUgZGF0YXRhYmxlcyBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5iaW5kKCdkZXN0cm95ZWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSBzb3J0aW5nIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIG9yZGVyIG9mIGNoaWxkcmVuIGFuZCByZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5vbignb3JkZXInLCBmdW5jdGlvbiAoIGUsIGN0eCwgc29ydGluZywgY29sdW1ucyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBvcmlnaW5hbCBjb3B5IG9mIHRoZSBjaGlsZHJlbiwgbWFrZSBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBhYm91dCB0byByZS1vcmRlciB0aGUgY2hpbGRyZW4gYW5kIGRhdGF0YWJsZSBhc3N1bWVzIHdlIGtub3cgdGhlIG9yaWdpbmFsIG9yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9vcmlnaW5hbENoaWxkcmVuLnB1c2goc2VsZi5jaGlsZHJlbltrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9yZGVyIGJhc2VkIG9uIHRoZSBvcmRlciB0aGF0IGRhdGF0YWJsZXMgYmVsaWV2ZXMgaXMgcmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGN0eC5haURpc3BsYXkubGVuZ3RoOyB6KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBjdHguYWlEaXNwbGF5W3pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHNlbGYuX2R0Ll9vcmlnaW5hbENoaWxkcmVuW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGhlYWRlcnMgYW5kIGFsbG93IGZvciBjYWxsYmFjay1iYXNlZCBjb25maWcKICAgICAgICAgICAgICAgICQodGFibGUpLmNoaWxkcmVuKCJ0aGVhZCA+IHRyID4gdGhbZGF0YS1oZWFkZXItaWRdIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1oZWFkZXItaWQiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHMgJiYgc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tleV07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInRhYmxlSGVhZGVyUmVxdWlyZWQiIG9yICJ0YWJsZUhlYWRlck9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQgfHwgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInRhYmxlSGVhZGVyUmVxdWlyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJ0YWJsZUhlYWRlclJlcXVpcmVkIiwgc2NoZW1hLCBvcHRpb25zLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlck9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJPcHRpb25hbCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsvLy5iaW5kKHNlbGYpKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhbnVwRG9tSW5qZWN0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRha2VzIGEgRE9NIGVsZW1lbnQgYW5kIG1lcmdlcyBpdCAidXAiIHRvIHRoZSBwYXJlbnQgZWxlbWVudC4gIERhdGEgYXR0cmlidXRlcyBhbmQgc29tZSBjbGFzc2VzIGFyZQogICAgICAgICAgICAgKiBjb3BpZWQgZnJvbSBET00gZWxlbWVudCBpbnRvIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBjaGlsZHJlbiBvZiB0aGUgRE9NIGVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZQogICAgICAgICAgICAgKiBwYXJlbnQgYW5kIHRoZSBET00gZWxlbWVudCBpcyByZW1vdmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbWVyZ2VFbGVtZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50VXAgPSBmdW5jdGlvbihtZXJnZUVsZW1lbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBtZXJnZUVsZW1lbnRQYXJlbnQgPSAkKG1lcmdlRWxlbWVudCkucGFyZW50KCk7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50Q2hpbGRyZW4gPSAkKG1lcmdlRWxlbWVudCkuY2hpbGRyZW4oKTsKCiAgICAgICAgICAgICAgICAvLyBjb3B5IG1lcmdlIGVsZW1lbnQgY2xhc3NlcyB0byBwYXJlbnQKICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gJChtZXJnZUVsZW1lbnQpLmF0dHIoJ2NsYXNzJykuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAgICAgJC5lYWNoKCBjbGFzc05hbWVzLCBmdW5jdGlvbihpbmRleCwgY2xhc3NOYW1lKXsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAiYWxwYWNhLW1lcmdlLXVwIikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmFkZENsYXNzKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY29weSBhdHRyaWJ1dGVzIHRvIFRSCiAgICAgICAgICAgICAgICAkLmVhY2goJChtZXJnZUVsZW1lbnQpWzBdLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lLmluZGV4T2YoImRhdGEtIikgPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKG1lcmdlRWxlbWVudFBhcmVudCkuYXR0cih0aGlzLm5hbWUsIHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgZmllbGQgd2l0aCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKG1lcmdlRWxlbWVudENoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlcGxhY2VXaXRoKG1lcmdlRWxlbWVudENoaWxkcmVuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKG1lcmdlRWxlbWVudCkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgdHJFbGVtZW50cyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1maWVsZCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgJCh0ckVsZW1lbnRzKS5jaGlsZHJlbigiLmFscGFjYS1maWVsZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBmaW5kIGVhY2ggVFIncyAuYWxwYWNhLWNvbnRhaW5lciBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgJCh0ckVsZW1lbnRzKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXIiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWN0aW9uIGJhcnMgZm9yIG91ciBmaWVsZCBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FBcnJheUFjdGlvbmJhciA9IHNlbGYuZ2V0RmllbGRFbCgpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoYWxwYWNhQXJyYXlBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhQXJyYXlBY3Rpb25iYXIuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FjdGlvbmJhcicgbm93cmFwPSdub3dyYXAnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCh0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVyRHJhZ2dhYmxlQ2VsbHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCc+PC90ZD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmJlZm9yZSh0ZCk7CiAgICAgICAgICAgICAgICAgICAgJCh0ZCkuYXBwZW5kKCQodGhpcykuY2hpbGRyZW4oKSk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsIGVsZW1lbnRzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzLmVhY2goZnVuY3Rpb24oaSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCc+IiArIGkgKyAiPC90ZD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmJlZm9yZSh0ZCk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueXRoaW5nIGVsc2Ugd2l0aCAuYWxwYWNhLW1lcmdlLXVwIGFuZCBtZXJnZSB1cAogICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLW1lcmdlLXVwIFtkYXRhLW1lcmdlLXVwLWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb1Jlc29sdmVJdGVtQ29udGFpbmVyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5Iik7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgZHJhZ1Jvd3Mgc3VwcG9ydCwgd2UgaGF2ZSBubyBjaG9pY2UgaGVyZSBleGNlcHQgdG8gY29tcGxldGVseSByZWJvb3QgdGhlIHRhYmxlIGluIG9yZGVyCiAgICAgICAgICAgIC8vIHRvIGdldCBEYXRhVGFibGVzIHRvIGJpbmQgdGhpbmdzIGNvcnJlY3RseSBmb3IgZHJhZy1kcm9wIHN1cHBvcnQKICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIGRyYWdSb3dzIHRvIHVzZSBvdXIgb3duIGRyYWcvZHJvcCB0b29saW5nIGFuZCBnZXQgcmlkIG9mIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luCiAgICAgICAgICAgIC8vIHdlIGFsc28gaGF2ZSBkbyB0aGlzIGlmIHdlJ3ZlIGFkZGVkIHRoZSBmaXJzdCByb3cgdG8gZ2V0IERhdGFUYWJsZXMgdG8gcmVkcmF3CiAgICAgICAgICAgIHZhciB1c2luZ0RhdGFUYWJsZXMgPSBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcyAmJiAkLmZuLkRhdGFUYWJsZTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kcmFnUm93cyB8fCAodXNpbmdEYXRhVGFibGVzICYmIHNlbGYuZGF0YS5sZW5ndGggPT09IDEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZWZyZXNoCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgYWRkZWQgYSByb3cKICAgICAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYnkgZmluZGluZyB0aGUgVFIgYW5kIHRoZW4gYWRkaW5nIHRoYXQgd2F5CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgICAgIHZhciB0ciA9IHNlbGYuZmllbGQuZmluZCgiW2RhdGEtYWxwYWNhLWZpZWxkLXBhdGg9JyIgKyBpdGVtLnBhdGggKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5yb3cuYWRkKHRyKTsvLy5kcmF3KGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgLy8gVE9ETzogc2VlIGFib3ZlCgogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbmZvcm0gZGF0YSB0YWJsZXMgdGhhdCB3ZSd2ZSByZW1vdmVkIGEgcm93CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93cyhjaGlsZEluZGV4KS5yZW1vdmUoKTsvLy5kcmF3KGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFibGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSB0YWJsZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRhdGFibGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0YVRhYmxlcyBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gYmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIERhdGFUYWJsZXMgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNob3cgQWN0aW9ucyBDb2x1bW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgYWN0aW9ucyBjb2x1bW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkcmFnUm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRyYWcgUm93cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZHJhZ2dpbmcgb2Ygcm93cyB2aWEgYSBkcmFnZ2FibGUgY29sdW1uLiAgVGhpcyByZXF1aXJlcyBEYXRhVGFibGVzIGFuZCB0aGUgRGF0YVRhYmxlcyBSb3cgUmVvcmRlciBQbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dBY3Rpb25zQ29sdW1uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkcmFnUm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRhYmxlIiwgQWxwYWNhLkZpZWxkcy5UYWJsZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFibGVSb3dGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gc2VsZi5wYXJlbnQub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbjsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMuZHJhZ1Jvd3MgPSBzZWxmLnBhcmVudC5vcHRpb25zLmRyYWdSb3dzOwoKICAgICAgICAgICAgICAgIC8vIHdhbGsgYWxsIGl0ZW1zIGFuZCBtYXJrIGhpZGRlbnMgc28gdGhhdCB0aGUgdGVtcGxhdGUgY2FuIGVhc2lseSBwaWNrIHRoaXMgdXAKICAgICAgICAgICAgICAgIC8vIGhpZGRlbnMgYXJlIGFwcGxpZWQgdGhlICJhbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbiIgY3NzIGNsYXNzIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtc1tpXS5vcHRpb25zLnR5cGUgPT09ICJoaWRkZW4iKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaXRlbXNbaV0uaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWJsZXJvdyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFibGUgUm93IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBvYmplY3QgaXRlbXMgaW50byBhIHRhYmxlIHJvdyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZXJvdyIsIEFscGFjYS5GaWVsZHMuVGFibGVSb3dGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCA9IEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zZXBhcmF0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXBhcmF0b3IgPSAiLCI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsID09PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsLnNwbGl0KHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UoIiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsLmpvaW4odGhpcy5vcHRpb25zLnNlcGFyYXRvcikpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQmx1cgogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciB2YWxzID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSBbXTsKCiAgICAgICAgICAgICQuZWFjaCh2YWxzLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgaWYgKHYudHJpbSgpICE9PSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnB1c2godi50cmltKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJpbW1lZCk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUYWcgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgZW50ZXJpbmcgbGlzdCBvZiB0YWdzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNlcGFyYXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZXBhcmF0b3IgdXNlZCB0byBzcGxpdCB0YWdzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiLCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWciLCBBbHBhY2EuRmllbGRzLlRhZ0ZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRpbWUiOwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlZmF1bHRUaW1lRm9ybWF0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRpbWUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gInRpbWUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUaW1lIEZpZWxkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFRpbWUiOiAiSW52YWxpZCB0aW1lIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0aW1lIiwgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidGltZSIsICJ0aW1lIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW55TUNFRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLnRpbnlNQ0VGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRpbnltY2UiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudG9vbGJhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudG9vbGJhciA9ICJpbnNlcnRmaWxlIHVuZG8gcmVkbyB8IHN0eWxlc2VsZWN0IHwgYm9sZCBpdGFsaWMgfCBhbGlnbmxlZnQgYWxpZ25jZW50ZXIgYWxpZ25yaWdodCBhbGlnbmp1c3RpZnkgfCBidWxsaXN0IG51bWxpc3Qgb3V0ZGVudCBpbmRlbnQgfCBsaW5rIGltYWdlIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRDb250ZW50KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0Q29udHJvbFZhbHVlOmZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lZGl0b3IuZ2V0Q29udGVudCgpCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW5pdFRpbnlNQ0VFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbignYmx1cicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb2N1cyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXByZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXByZXNzIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKHRpbnlNQ0UpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ0ZUZpZWxkSUQgPSAkKHNlbGYuY29udHJvbClbMF0uaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnlNQ0UuaW5pdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfaW5zdGFuY2VfY2FsbGJhY2s6IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBlZGl0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0VGlueU1DRUV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogIiMiICsgcnRlRmllbGRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhcjogc2VsZi5vcHRpb25zLnRvb2xiYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIHBsdWdpbiBpbnN0YW5jZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfSwKCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJUaW55TUNFIEVkaXRvciI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgYSBUaW55TUNFIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidG9vbGJhciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaW55TUNFIHRvb2xiYXIgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9vbGJhciBvcHRpb25zIGZvciBUaW55TUNFIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0aW55bWNlIiwgQWxwYWNhLkZpZWxkcy5UaW55TUNFRmllbGQpOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0b2tlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b2tlbmZpZWxkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZC5zaG93QXV0b2NvbXBsZXRlT25Gb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9rZW5maWVsZC5zaG93QXV0b2NvbXBsZXRlT25Gb2N1cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25CbHVyOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZigkLmZuLnRva2VuZmllbGQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbihzZWxmLCB0b2tlbmZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS50b2tlbmZpZWxkKHRva2VuZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgc2VsZi5vcHRpb25zLnRva2VuZmllbGQpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUb2tlbiBmaWVsZCBmb3IgZW50ZXJpbmcgbGlzdCBvZiB0b2tlbnMgc2VwYXJhdGVkIGJ5IGRlbGltaXRlci4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdG9rZW5zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiLCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b2tlbmZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9rZW4gRmllbGQgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZXR0aW5ncyB0byBwYXNzIGludG8gdGhlIHVuZGVybHlpbmcgYm9vdHN0cmFwLXRva2VuZmllbGQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidG9rZW4iLCBBbHBhY2EuRmllbGRzLlRva2VuRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBhdWdtZW50cyBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZAogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIEZpbGUgdXBsb2FkIGNvbnRyb2wgdGhhdCBjYW4gYmUgbW91bnRlZCBvbiB0b3Agb2YgIm9iamVjdCIgb3IgImFycmF5IiB0eXBlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWluZXIgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIEZpZWxkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3Rvcik7CgogICAgICAgICAgICB0aGlzLmlzQXJyYXlUeXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuaXNPYmplY3RUeXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zY2hlbWEudHlwZSA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyB3cmFwcyBhbiBleGlzdGluZyB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGludG8gYSBtZXRob2QgdGhhdCBsb29rcyBsaWtlIGZuKG1vZGVsKQogICAgICAgICAgICAvLyB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIGZpbGVpbnB1dAogICAgICAgICAgICAvLyBjb25maWcgbG9va3MgbGlrZQogICAgICAgICAgICAvLyAgICB7CiAgICAgICAgICAgIC8vICAgICAgICJmaWxlcyI6IFtdLAogICAgICAgICAgICAvLyAgICAgICAiZm9ybWF0RmlsZVNpemUiOiBmbiwKICAgICAgICAgICAgLy8gICAgICAgIm9wdGlvbnMiOiB7fQogICAgICAgICAgICAvLyAgICB9CiAgICAgICAgICAgIC8vCgogICAgICAgICAgICB0aGlzLndyYXBUZW1wbGF0ZSA9IGZ1bmN0aW9uKHRlbXBsYXRlSWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb25maWcpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVzID0gY29uZmlnLmZpbGVzOwogICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXRGaWxlU2l6ZSA9IGNvbmZpZy5mb3JtYXRGaWxlU2l6ZTsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHNlbGYub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZSA9IEFscGFjYS5jbG9uZU9iamVjdChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNpemUgPSBmb3JtYXRGaWxlU2l6ZShtb2RlbC5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuYnV0dG9ucyA9IHNlbGYub3B0aW9ucy5idXR0b25zOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlSW5kZXggPSBpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IEFscGFjYS50bXBsKHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGVtcGxhdGVJZCksIG1vZGVsLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHVzaChyb3dbMF0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcm93cyA9ICQocm93cyk7CiAgICAgICAgICAgICAgICAgICAgJChyb3dzKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXVwbG9hZCAmJiBvcHRpb25zLmZpbGV1cGxvYWQuYXV0b1VwbG9hZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBzdGFydCBidXR0b24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgiYnV0dG9uLnN0YXJ0IikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVXcmFwUm93KHRoaXMsIG9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBldmVudCBnZXRzIGZpcmVkIHdoZW4gZmlsZWltcGwgaGFzIGNsZWFuZWQgdXAgdGhlIERPTSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhbmRsZSBBamF4IHJlbGF0ZWQgc3R1ZmYgb24gb3VyIG93biBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImRlc3Ryb3llZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5kZWxldGUiKS5vbigiY2xpY2siLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gJChyb3cpLmZpbmQoImJ1dHRvbi5kZWxldGUiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUluZGV4ID0gJChidXR0b24pLmF0dHIoImRhdGEtZmlsZS1pbmRleCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tmaWxlSW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25GaWxlRGVsZXRlLmNhbGwoc2VsZiwgcm93LCBidXR0b24sIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGZpbGVJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoYXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VsZi5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVUlTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkKHJvd3MpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ1cGxvYWQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGJvdHRvbSBjb250cm9sIGJ1dHRvbnMgKHdlIGhhdmUgYSBjb25mbGljdCBvdmVyIHRoZSAnYnV0dG9ucycgbmFtZXNwYWNlKQogICAgICAgICAgICBzZWxmLm9wdGlvbnMucmVuZGVyQnV0dG9ucyA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJ1dHRvbnMgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuaGlkZURlbGV0ZUJ1dHRvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJ1dHRvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgImtleSI6ICJkZWxldGUiLAogICAgICAgICAgICAgICAgICAgICJpc0RlbGV0ZSI6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5zaG93VXBsb2FkUHJldmlldykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5zaG93SGVhZGVycykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYXJyYXkgaWYgbm90IGFycmF5IGFscmVhZHkKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi5kYXRhKSkgewogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW3NlbGYuZGF0YV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHVwbG9hZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBjb3B5aW5nIGJhY2sgdGhlIG1heE51bWJlck9mRmlsZXMgZnJvbSB0aGUgdXBsb2FkIHBsdWdpbidzIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlndXJlIG91dCByZWFzb25hYmxlIG1heE51bWJlck9mRmlsZXMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNhZmUgZ3VhcmQKICAgICAgICAgICAgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9PT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID4gMSB8fCBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZCBwbHVnaW4gY29uZmlnCiAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlcyA9IDk5OTk7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBtYXggZmlsZSBzaXplCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IHNlbGYub3B0aW9ucy51cGxvYWQubWF4RmlsZVNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heEZpbGVTaXplID0gLTE7IC8vIG5vIGxpbWl0CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29weSBzZXR0aW5nIGludG8gdXBsb2FkCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbGUgdHlwZXMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXBsb2FkLmFjY2VwdEZpbGVUeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IG51bGw7IC8vIG5vIHJlc3RyaWN0aW9ucwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlcnJvciBoYW5kbGVyCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlciA9IGZ1bmN0aW9uKG1lc3NhZ2VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KG1lc3NhZ2VzLmpvaW4oIlxuIikpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgQWxwYWNhIGlzIGNvbmZpZ3VyZWQgZm9yIENTUkYgc3VwcG9ydCBhbmQgYSBDU1JGIGNvb2tpZSBvciB0b2tlbiBpcyBhdmFpbGFibGUsCiAgICAgICAgICAgIC8vIHRoZW4gYXBwbHkgaXQgdG8gdGhlIGhlYWRlcnMgdGhhdCBhcmUgc2VudCBvdmVyIHRoZSB3aXJlIHZpYSB0aGUgdW5kZXJseWluZyBhamF4CiAgICAgICAgICAgIC8vIGZvciB0aGUgZmlsZSB1cGxvYWQgY29udHJvbAoKICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIENTUkYgdG9rZW4sIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy51cGxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnRodW1ibmFpbExhYmVsID0gc2VsZi5vcHRpb25zLnRodW1ibmFpbExhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC50aHVtYm5haWxMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgidGh1bWJuYWlsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVuYW1lTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZW5hbWVMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZW5hbWVMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlbmFtZSIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlU2l6ZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVTaXplTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVTaXplTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVNpemUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlVXBsb2FkQWN0aW9uc0xhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVVcGxvYWRBY3Rpb25zTGFiZWwiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuY2hvb3NlQnV0dG9uTGFiZWwgPSBzZWxmLm9wdGlvbnMuY2hvb3NlQnV0dG9uTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmNob29zZUJ1dHRvbkxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJjaG9vc2VGaWxlcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJjaG9vc2VGaWxlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5kcm9wWm9uZU1lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmRyb3Bab25lTWVzc2FnZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoImRyb3Bab25lTXVsdGlwbGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZVNpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlID0gc2VsZi5vcHRpb25zLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgic2VsZWN0RnJvbUV4aXN0aW5nTXVsdGlwbGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgic2VsZWN0RnJvbUV4aXN0aW5nU2luZ2xlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUG9zdFJlbmRlcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gZGlzcGxheS1vbmx5IG1vZGUsIHdlIGhpZGUgYSBidW5jaCBvZiB0aGluZ3MKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiYnV0dG9uIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0biIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3ciKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZHJvcHpvbmUtbWVzc2FnZSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHVwbG9hZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRVcGxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC11cGxvYWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREb3dubG9hZFRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcFRlbXBsYXRlKCJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLWRvd25sb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50IGZvciBtb2RpZnlpbmcgdGhlIGRhdGEgYWhlYWQgb2YgYW4gdXBsb2FkIHN1Ym1pdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlQmVmb3JlRmlsZVVwbG9hZFN1Ym1pdDogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5jb250cm9sOwoKICAgICAgICAgICAgLy8gZmlsZSB1cGxvYWQgY29uZmlnCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkQ29uZmlnID0ge307CgogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkYXRhVHlwZSJdID0gImpzb24iOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cGxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cGxvYWRUZW1wbGF0ZSJdID0gdGhpcy5nZXRVcGxvYWRUZW1wbGF0ZSgpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlSWQiXSA9IG51bGw7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImRvd25sb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0RG93bmxvYWRUZW1wbGF0ZSgpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJmaWxlc0NvbnRhaW5lciJdID0gJChlbCkuZmluZCgiLmZpbGVzIik7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImRyb3Bab25lIl0gPSAkKGVsKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cmwiXSA9ICIvIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sibWV0aG9kIl0gPSAicG9zdCI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbInNob3dVcGxvYWRQcmV2aWV3Il0gPSBzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXc7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdba10gPSBzZWxmLm9wdGlvbnMudXBsb2FkW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQiKS5hdHRyKCJtdWx0aXBsZSIsIHRydWUpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQiKS5hdHRyKCJuYW1lIiwgc2VsZi5uYW1lICsgIl9maWxlc1tdIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYub3B0aW9ucy5uYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgcHJvZ3Jlc3MgYmFyIGF0IGZpcnN0CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSWYgYSBmaWxlIGlzIGJlaW5nIHVwbG9hZGVkLCBzaG93IHRoZSBwcm9ncmVzcyBiYXIuICBPdGhlcndpc2UsIGhpZGUgaXQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJwcm9ncmVzc2FsbCJdID0gZnVuY3Rpb24gKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sb2FkZWQgPCBkYXRhLnRvdGFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzc0JhciA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzQmFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHBhcnNlSW50KGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApOwogICAgICAgICAgICAgICAgICAgICQoJyNwcm9ncmVzcyAucHJvZ3Jlc3MtYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyArICclJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLnByb2dyZXNzIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNvbWUgbGltaXQgY2hlY2tzCiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImFkZCJdID0gZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIHZhciB1cGxvYWRFcnJvcnMgPSBbXTsKCiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBiYWQgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IHNlbGYub3B0aW9ucy5maWxlVHlwZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZSA9IG5ldyBSZWdFeHAoc2VsZi5vcHRpb25zLmZpbGVUeXBlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRhdGEuZmlsZXNbaV1bInR5cGUiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRXJyb3JzLnB1c2goJ05vdCBhbiBhY2NlcHRlZCBmaWxlIHR5cGU6ICcgKyBkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlc1tpXS5zaXplID4gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRXJyb3JzLnB1c2goc2VsZi5nZXRNZXNzYWdlKCJmaWxlVG9vQmlnIikgKyBkYXRhLmZpbGVzW2ldLnNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChiYWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGRhdGEuZmlsZXMubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICBpZiAodXBsb2FkRXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcih1cGxvYWRFcnJvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgZXh0ZW5zaW9uCiAgICAgICAgICAgIHNlbGYuYXBwbHlDb25maWd1cmF0aW9uKGZpbGVVcGxvYWRDb25maWcpOwoKICAgICAgICAgICAgLy8gaW5zdGFudGlhdGUgdGhlIGNvbnRyb2wKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLmZpbGVVcGxvYWQgPSAkKGVsKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKS5maWxldXBsb2FkKGZpbGVVcGxvYWRDb25maWcpOwoKICAgICAgICAgICAgLy8gV2hlbiBmaWxlIHVwbG9hZCBvZiBhIGZpbGUgY29tcGxldGVzLCB3ZSBvZmZlciB0aGUgY2hhbmNlIHRvIGFkanVzdCB0aGUgZGF0YSBhaGVhZCBvZiBGaWxlVXBsb2FkCiAgICAgICAgICAgIC8vIGdldHRpbmcgaXQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgeW91IGNhbid0IGNoYW5nZSB0aGUgc2VydmVyIHNpZGUgSlNPTiBidXQgY291bGQgZG8KICAgICAgICAgICAgLy8gYSBsaXR0bGUgYml0IG9mIG1hZ2ljIGluIHRoZSBjbGllbnQuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2FkZG9uZSIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgZW5oYW5jZUZpbGVzID0gc2VsZi5vcHRpb25zLmVuaGFuY2VGaWxlczsKICAgICAgICAgICAgICAgIGlmIChlbmhhbmNlRmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW5oYW5jZUZpbGVzKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5oYW5jZUZpbGVzKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYmFjayBkb3duIGludG8gZGF0YS5maWxlcwogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGRhdGEucmVzdWx0LmZpbGVzOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0sIDI1MCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZXMgYXJlIHN1Ym1pdHRlZCwgdGhlICJwcm9wZXJ0aWVzIiBhbmQgInBhcmFtZXRlcnMiIG9wdGlvbnMgbWFwIGFyZSBlc3BlY2lhbGx5IHRyZWF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFyZSB3cml0dGVuIGludG8gcHJvcGVydHk8aW5kZXg+X188a2V5PiBhbmQgcGFyYW08aW5kZXg+X19rZXkgZW50cmllcyBpbiB0aGUgZm9ybSBkYXRhLgogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBmb3IgbXVsdGktcGFydCByZWNlaXZlcnMgdG8gZ2V0IHZhbHVlcyBvbiBhIHBlci1maWxlIGJhc2lzLgogICAgICAgICAgICAvLyBQbGFucyBhcmUgdG8gYWxsb3cgdG9rZW4gc3Vic3RpdHV0aW9uIGFuZCBvdGhlciBjbGllbnQtc2lkZSB0cmVhdG1lbnQgYWhlYWQgb2YgcG9zdGluZy4KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kRmlyc3QoImZpbGV1cGxvYWRzdWJtaXQiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gInByb3BlcnR5IiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVZhbHVlID0gc2VsZi5vcHRpb25zWyJwcm9wZXJ0aWVzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwcm9wZXJ0eVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRhdGEuZmlsZXMsIGZ1bmN0aW9uKGluZGV4LCBmaWxlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbU5hbWUgPSAicGFyYW0iICsgaW5kZXggKyAiX18iICsga2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtVmFsdWUgPSBzZWxmLm9wdGlvbnNbInBhcmFtZXRlcnMiXVtrZXldOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIHN1YnN0aXR1dGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBzZWxmLmFwcGx5VG9rZW5TdWJzdGl0dXRpb25zKHBhcmFtVmFsdWUsIGluZGV4LCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZm9ybURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YVtwYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQmVmb3JlRmlsZVVwbG9hZFN1Ym1pdChkYXRhKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmJlZm9yZUZpbGVVcGxvYWRTdWJtaXRIYW5kbGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlci5jYWxsKHNlbGYsIGRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hlbiBmaWxlcyBhcmUgdXBsb2FkZWQsIHdlIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZG9uZSIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICAvLyBleGlzdGluZwogICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gc2VsZi5nZXRWYWx1ZUFzQXJyYXkoKTsKCiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKGkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGRhdGEuZmlsZXMubGVuZ3RoKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0RmlsZVRvRGVzY3JpcHRvcihkYXRhLmZpbGVzW2ldLCBmdW5jdGlvbiAoZXJyLCBkZXNjcmlwdG9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChkZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZihpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYoMCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZSB1cGxvYWRzIGZhaWwsIGFsZXJ0Li4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRmYWlsIiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yVGhyb3duKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25VcGxvYWRGYWlsKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBzdWNjZXNzIG9yIGZhaWwsIHdlIGhhbmRsZSB0aGUgcmVzdWx0cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGFsd2F5cyIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgZXh0ZW5zaW9uCiAgICAgICAgICAgIHNlbGYuYXBwbHlCaW5kaW5ncyhmaWxlVXBsb2FkLCBlbCk7CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgcHJlbG9hZGluZyBvZiBkb2N1bWVudHMKICAgICAgICAgICAgc2VsZi5wcmVsb2FkKGZpbGVVcGxvYWQsIGVsLCBmdW5jdGlvbihmaWxlcykgewoKICAgICAgICAgICAgICAgIGlmIChmaWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9ICQoc2VsZi5jb250cm9sKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKTsKICAgICAgICAgICAgICAgICAgICAkKGZvcm0pLmZpbGV1cGxvYWQoJ29wdGlvbicsICdkb25lJykuY2FsbChmb3JtLCAkLkV2ZW50KCdkb25lJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyUHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZmlsZXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihkb2N1bWVudCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5iaW5kKCdkcm9wIGRyYWdvdmVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVdyYXBSb3c6IGZ1bmN0aW9uKHJvdywgb3B0aW9ucykKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIGFwcGx5VG9rZW5TdWJzdGl0dXRpb25zOiBmdW5jdGlvbih0ZXh0LCBpbmRleCwgZmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0b2tlbnMgPSB7CiAgICAgICAgICAgICAgICAiaW5kZXgiOiBpbmRleCwKICAgICAgICAgICAgICAgICJuYW1lIjogZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZmlsZS51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjogZmlsZS50aHVtYm5haWxVcmwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHN1YnN0aXR1dGUgYW55IHRva2VucwogICAgICAgICAgICB2YXIgeCA9IC0xOwogICAgICAgICAgICB2YXIgYiA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSB0ZXh0LmluZGV4T2YoInsiLCBiKTsKICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSB0ZXh0LmluZGV4T2YoIn0iLCB4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdGV4dC5zdWJzdHJpbmcoeCArIGNhci5sZW5ndGgsIHkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gdG9rZW5zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyByZXBsYWNlbWVudCArIHRleHQuc3Vic3RyaW5nKHkrMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB5ICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUoeCA+IC0xKTsKCiAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgYWRkaW5nIHByb3BlcnRpZXMgYW5kIGNhbGxiYWNrcyB0byB0aGUgZmlsZSB1cGxvYWQgY29uZmlnLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGZpbGVVcGxvYWRjb25maWcKICAgICAgICAgKi8KICAgICAgICBhcHBseUNvbmZpZ3VyYXRpb246IGZ1bmN0aW9uKGZpbGVVcGxvYWRjb25maWcpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgYmluZGluZyBldmVudCBoYW5kbGVycyB0byBmaWxlIHVwbG9hZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkCiAgICAgICAgICovCiAgICAgICAgYXBwbHlCaW5kaW5nczogZnVuY3Rpb24oZmlsZVVwbG9hZCkKICAgICAgICB7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgZnJvbSBhIGZpbGUgdG8gYSBzdG9yYWdlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBBIGRlc2NyaXB0b3IgbG9va3MgbGlrZToKICAgICAgICAgKgogICAgICAgICAqICAgICAgewogICAgICAgICAqICAgICAgICAgICJpZCI6ICIiCiAgICAgICAgICogICAgICAgICAgLi4uCiAgICAgICAgICogICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBBIGRlc2NyaXB0b3IgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFzIG5lZWRlZCBieSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICogc28gYXMgdG8gcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgdGhlIGRlc2NyaWJlZCBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG1lY2hhbmlzbSBtYXkgbmVlZCB0byBiZSBjb25zdWx0ZWQuICBUaHVzLCB0aGlzIGlzIGFzeW5jLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGZpbGUKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBkZXNjcmlwdG9yKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnRGaWxlVG9EZXNjcmlwdG9yOiBmdW5jdGlvbihmaWxlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gewogICAgICAgICAgICAgICAgImlkIjogZmlsZS5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZmlsZS51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpmaWxlLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBmaWxlLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZmlsZS5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkZXNjcmlwdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHN0b3JhZ2UgZGVzY3JpcHRvciB0byBhIGZpbGUuCiAgICAgICAgICoKICAgICAgICAgKiBBIGZpbGUgbG9va3MgbGlrZToKICAgICAgICAgKgogICAgICAgICAqICAgICAgewogICAgICAgICAqICAgICAgICAgICJpZCI6ICIiLAogICAgICAgICAqICAgICAgICAgICJuYW1lIjogInBpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgInNpemUiOiA5MDI2MDQsCiAgICAgICAgICogICAgICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgInRodW1ibmFpbFVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3RodW1ibmFpbFwvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICAgICAiZGVsZXRlVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiCiAgICAgICAgICogICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBTaW5jZSBhbiB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIG1heSBiZSBjb25zdWx0ZWQsIGFuIGFzeW5jIGNhbGxiYWNrIGhvb2sgaXMgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZGVzY3JpcHRvciBtaW1pY3MgdGhlIGZpbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihlcnIsIGZpbGUpCiAgICAgICAgICovCiAgICAgICAgY29udmVydERlc2NyaXB0b3JUb0ZpbGU6IGZ1bmN0aW9uKGRlc2NyaXB0b3IsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZpbGUgPSB7CiAgICAgICAgICAgICAgICAiaWQiOiBkZXNjcmlwdG9yLmlkLAogICAgICAgICAgICAgICAgIm5hbWUiOiBkZXNjcmlwdG9yLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGRlc2NyaXB0b3Iuc2l6ZSwKICAgICAgICAgICAgICAgICJ1cmwiOiBkZXNjcmlwdG9yLnVybCwKICAgICAgICAgICAgICAgICJ0aHVtYm5haWxVcmwiOmRlc2NyaXB0b3IudGh1bWJuYWlsVXJsLAogICAgICAgICAgICAgICAgImRlbGV0ZVVybCI6IGRlc2NyaXB0b3IuZGVsZXRlVXJsLAogICAgICAgICAgICAgICAgImRlbGV0ZVR5cGUiOiBkZXNjcmlwdG9yLmRlbGV0ZVR5cGUKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpbGUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgImVuaGFuY2luZyIgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgc2VydmVyIGFmdGVyIHVwbG9hZHMgaGF2ZSBiZWVuIHN1Ym1pdHRlZC4KICAgICAgICAgKiBUaGlzIHByb3ZpZGVzIGEgcGxhY2UgdG8gY29udmVydCB0aGUgZGF0YS5yb3dzIGJhY2sgaW50byB0aGUgZm9ybWF0IHdoaWNoIHRoZSB1cGxvYWQgY29udHJvbCBleHBlY3RzLgogICAgICAgICAqCiAgICAgICAgICogRXhwZWN0ZWQgZm9ybWF0OgogICAgICAgICAqCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQucm93cyA9IFt7Li4ufV0KICAgICAgICAgKiAgICBkYXRhLnJlc3VsdC5maWxlcyA9IFt7CiAgICAgICAgICogICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICJwYXRoIjogIiIsCiAgICAgICAgICogICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgInNpemUiOiA5MDI2MDQsCiAgICAgICAgICogICAgICAidXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJkZWxldGVUeXBlIjogIkRFTEVURSIqCiAgICAgICAgICogICAgfV0KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkQ29uZmlnCiAgICAgICAgICogQHBhcmFtIGRhdGEKICAgICAgICAgKi8KICAgICAgICBlbmhhbmNlRmlsZXM6IGZ1bmN0aW9uKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByZWxvYWRzIGRhdGEgZGVzY3JpcHRvcnMgaW50byBmaWxlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVzID0gW107CgogICAgICAgICAgICAvLyBub3cgcHJlbG9hZCB3aXRoIGZpbGVzIGJhc2VkIG9uIHByb3BlcnR5IHZhbHVlCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKGkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZmlsZXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJQcmVsb2FkOiBmdW5jdGlvbihmaWxlVXBsb2FkLCBlbCwgZmlsZXMsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZWZyZXNoVUlTdGF0ZSgpOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kcyBiYWNrIHRoZSB2YWx1ZSBhcyBlaXRoZXIgYW4gb2JqZWN0IG9yIGFycmF5LCBkZXBlbmRpbmcgb24gdGhlIHNjaGVtYSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsdWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbdmFsdWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gdGhlIHZhbHVlIGFzIGFuIGFycmF5CiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWVBc0FycmF5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhIHx8IFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWVBc0FycmF5OiBmdW5jdGlvbihhcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmlzQXJyYXlUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoYXJyYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcnJheVswXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWxvYWQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3JzID0gdGhpcy5nZXRWYWx1ZUFzQXJyYXkoKTsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZGVzY3JpcHRvcnMubGVuZ3RoKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZG9uZQoKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9ICQoc2VsZi5jb250cm9sKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKTsKICAgICAgICAgICAgICAgICAgICAkKGZvcm0pLmZpbGV1cGxvYWQoJ29wdGlvbicsICdkb25lJykuY2FsbChmb3JtLCAkLkV2ZW50KCdkb25lJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0RGVzY3JpcHRvclRvRmlsZShkZXNjcmlwdG9yc1tpXSwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmKGkrMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZigwKTsKICAgICAgICB9LAoKICAgICAgICBwbHVnaW46IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZGF0YSgpLmJsdWVpbXBGaWxldXBsb2FkOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hVSVN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZCA9IHNlbGYucGx1Z2luKCk7CiAgICAgICAgICAgIGlmIChmaWxlVXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzOwoKICAgICAgICAgICAgICAgIGlmIChtYXhOdW1iZXJPZkZpbGVzID09PSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hCdXR0b25zKHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlVXBsb2FkLm9wdGlvbnMuZ2V0TnVtYmVyT2ZGaWxlcyAmJiBmaWxlVXBsb2FkLm9wdGlvbnMuZ2V0TnVtYmVyT2ZGaWxlcygpID49IG1heE51bWJlck9mRmlsZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hCdXR0b25zKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWZyZXNoQnV0dG9uczogZnVuY3Rpb24oZW5hYmxlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGZpbGVzIGJ1dHRvbgogICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5maWxldXBsb2FkLWFjdGl2ZS16b25lIHAuZHJvcHpvbmUtbWVzc2FnZSIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICBpZiAoZW5hYmxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZW5hYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsIG51bGwpOwoKICAgICAgICAgICAgICAgIC8vIHNob3cgZHJvcHpvbmUgbWVzc2FnZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5maWxldXBsb2FkLWFjdGl2ZS16b25lIHAuZHJvcHpvbmUtbWVzc2FnZSIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25GaWxlRGVsZXRlOiBmdW5jdGlvbihyb3dFbCwgYnV0dG9uRWwsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGVsZXRlVXJsID0gZmlsZS5kZWxldGVVcmw7CiAgICAgICAgICAgIHZhciBkZWxldGVNZXRob2QgPSBmaWxlLmRlbGV0ZVR5cGU7CgogICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICJtZXRob2QiOiBkZWxldGVNZXRob2QsCiAgICAgICAgICAgICAgICAidXJsIjogZGVsZXRlVXJsLAogICAgICAgICAgICAgICAgImhlYWRlcnMiOiB7fQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNzcmZUb2tlbiA9IHNlbGYuZGV0ZXJtaW5lQ3NyZlRva2VuKCk7CiAgICAgICAgICAgIGlmIChjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGMuaGVhZGVyc1tBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRV0gPSBjc3JmVG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQuYWpheChjKTsKICAgICAgICB9LAoKICAgICAgICBvblVwbG9hZEZhaWw6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlci5jYWxsKHNlbGYsIFtkYXRhLmVycm9yVGhyb3duXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YS5maWxlc1tpXS5lcnJvciA9IGRhdGEuZXJyb3JUaHJvd247CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGlzYWJsZSBzZWxlY3QgYnV0dG9uCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmZpbGVpbnB1dC1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmZpbGVpbnB1dC1idXR0b24iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gc2hvdyB0aGUgdXBsb2FkIHdlbGwKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtd2VsbCIpLmNzcygidmlzaWJpbGl0eSIsICJ2aXNpYmxlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVcGxvYWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiB1cGxvYWQgZmllbGQgd2l0aCBzdXBwb3J0IGZvciB0aHVtYm5haWwgcHJldmlldyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1heE51bWJlck9mRmlsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIE51bWJlciBvZiBGaWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdG8gYWxsb3cgdG8gYmUgdXBsb2FkZWQuICBJZiBncmVhdGVyIHRoYW4gemVybywgdGhlIG1heGltdW0gbnVtYmVyIHdpbGwgYmUgY29uc3RyYWluZWQuICBJZiAtMSwgdGhlbiBubyBsaW1pdCBpcyBpbXBvc2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEZpbGVTaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBGaWxlIFNpemUgKGluIGJ5dGVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBmaWxlIHNpemUgYWxsb3dlZCBwZXIgdXBsb2FkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSB3aWxsIGJlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIHNpemUgaW4gYnl0ZXMuICBJZiAtMSwgdGhlbiBubyBsaW1pdCBpcyBpbXBvc2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogLTEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWxlVHlwZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWxlIFR5cGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcmVndWxhciBleHByZXNzaW9uIGxpbWl0aW5nIHRoZSBmaWxlIHR5cGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIGJhc2VkIG9uIGZpbGVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBhbGxvdyBtdWx0aXBsZSBmaWxlIHVwbG9hZHMuICBJZiBtYXhOdW1iZXJPZkZpbGVzIGlzIG5vdCBzcGVjaWZpZWQsIG11bHRpcGxlIHdpbGwgdG9nZ2xlIGJldHdlZW4gMSBhbmQgdW5saW1pdGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd1VwbG9hZFByZXZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IFVwbG9hZCBQcmV2aWV3IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gc2hvdyB0aHVtYm5haWxzIGZvciB1cGxvYWRlZCBhc3NldHMgKHJlcXVpcmVzIHByZXZpZXcgc3VwcG9ydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3JIYW5kbGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXJyb3IgSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBmdW5jdGlvbiBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIG9uZSBvciBtb3JlIGZpbGVzIGZhaWxzIHRvIHVwbG9hZC4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgdGhlIHVuZGVybHlpbmcgeEhSIHJlcXVlc3QgYW5kIHBvcHVsYXRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugc3RhdGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwbG9hZCIsIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQpOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKCSJmaWxlVG9vQmlnIjogIkZpbGUgaXMgdG9vIGJpZzogIiwKCSJ0aHVtYm5haWwiOiAiVGh1bWJuYWlsIiwKCSJmaWxlbmFtZSI6ICJOYW1lIiwKCSJmaWxlU2l6ZSI6ICJTaXplIiwKCSJmaWxlVXBsb2FkQWN0aW9ucyI6ICJBY3Rpb25zIiwKICAgICAgICAiY2hvb3NlRmlsZSI6ICJDaG9vc2UgRmlsZS4uLiIsCiAgICAgICAgImNob29zZUZpbGVzIjogIkNob29zZSBGaWxlcy4uLiIsCiAgICAgICAgImRyb3Bab25lU2luZ2xlIjogIkNsaWNrIHRoZSBDaG9vc2UgYnV0dG9uIG9yIERyYWcgYW5kIERyb3AgYSBmaWxlIGhlcmUgdG8gdXBsb2FkLi4uIiwKICAgICAgICAiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkLi4uIgogICAgfSk7CgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ByaXZhdGUtZmFjZS9qcXVlcnkuYmluZC1maXJzdC9ibG9iL21hc3Rlci9kZXYvanF1ZXJ5LmJpbmQtZmlyc3QuanMKICAgIC8vIGpxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAoZnVuY3Rpb24oJCkgewogICAgICAgIHZhciBzcGxpdFZlcnNpb24gPSAkLmZuLmpxdWVyeS5zcGxpdCgiLiIpOwogICAgICAgIHZhciBtYWpvciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblswXSk7CiAgICAgICAgdmFyIG1pbm9yID0gcGFyc2VJbnQoc3BsaXRWZXJzaW9uWzFdKTsKCiAgICAgICAgdmFyIEpRX0xUXzE3ID0gKG1ham9yIDwgMSkgfHwgKG1ham9yID09PSAxICYmIG1pbm9yIDwgNyk7CgogICAgICAgIGZ1bmN0aW9uIGV2ZW50c0RhdGEoJGVsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpRX0xUXzE3ID8gJGVsLmRhdGEoJ2V2ZW50cycpIDogJC5fZGF0YSgkZWxbMF0pLmV2ZW50czsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVIYW5kbGVyVG9Ub3AoJGVsLCBldmVudE5hbWUsIGlzRGVsZWdhdGVkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBldmVudHNEYXRhKCRlbCk7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBkYXRhW2V2ZW50TmFtZV07CgogICAgICAgICAgICBpZiAoIUpRX0xUXzE3KSB7CiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGlzRGVsZWdhdGVkID8gZXZlbnRzLnNwbGljZShldmVudHMuZGVsZWdhdGVDb3VudCAtIDEsIDEpWzBdIDogZXZlbnRzLnBvcCgpOwogICAgICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpc0RlbGVnYXRlZCA/IDAgOiAoZXZlbnRzLmRlbGVnYXRlQ291bnQgfHwgMCksIDAsIGhhbmRsZXIpOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzRGVsZWdhdGVkKSB7CiAgICAgICAgICAgICAgICBkYXRhLmxpdmUudW5zaGlmdChkYXRhLmxpdmUucG9wKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXZlbnRzLnVuc2hpZnQoZXZlbnRzLnBvcCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW92ZUV2ZW50SGFuZGxlcnMoJGVsZW1zLCBldmVudHNTdHJpbmcsIGlzRGVsZWdhdGUpIHsKICAgICAgICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50c1N0cmluZy5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgICRlbGVtcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHVyZUV2ZW50TmFtZSA9ICQudHJpbShldmVudHNbaV0pLm1hdGNoKC9bXlwuXSsvaSlbMF07CiAgICAgICAgICAgICAgICAgICAgbW92ZUhhbmRsZXJUb1RvcCgkKHRoaXMpLCBwdXJlRXZlbnROYW1lLCBpc0RlbGVnYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAkLmZuLmJpbmRGaXJzdCA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gJC5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgdmFyIGV2ZW50c1N0cmluZyA9IGFyZ3Muc2hpZnQoKTsKCiAgICAgICAgICAgIGlmIChldmVudHNTdHJpbmcpIHsKICAgICAgICAgICAgICAgICQuZm4uYmluZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgbW92ZUV2ZW50SGFuZGxlcnModGhpcywgZXZlbnRzU3RyaW5nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICB9KSgkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwcGVyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBwZXJjYXNlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB1cHBlclZhbHVlID0gbnVsbDsKICAgICAgICAgICAgaWYgKHZhbCAmJiBBbHBhY2EuaXNTdHJpbmcodmFsKSkgewogICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSA9IHZhbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVcHBlcmNhc2UgVGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IGZpZWxkIGZvciB1cHBlcmNhc2UgdGV4dC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidXBwZXJjYXNlIiwgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJ1cHBlcmNhc2UiLCAidXBwZXJjYXNlIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VUkxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVVJMRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXJsIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ1cmwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ1cmwiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hbGxvd0ludHJhbmV0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0ludHJhbmV0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzWyJpbnRyYW5ldC11cmwiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy51cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zY2hlbWEuZm9ybWF0ID0gInVyaSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewoKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFVSTEZvcm1hdCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dJbnRyYW5ldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFsbG93IGludHJhbmV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBVUkxzIHdpdGggdW5xdWFsaWZpZWQgaG9zdG5hbWVzIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dJbnRyYW5ldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlVSTCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIHRleHQgY29udHJvbCB3aXRoIHZhbGlkYXRpb24gZm9yIGFuIGludGVybmV0IHdlYiBhZGRyZXNzLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRVUkxGb3JtYXQiOiAiVGhlIFVSTCBwcm92aWRlZCBpcyBub3QgYSB2YWxpZCB3ZWIgYWRkcmVzcy4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVybCIsIEFscGFjYS5GaWVsZHMuVVJMRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXJsIiwgInVybCIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiemlwY29kZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAodGhpcy5vcHRpb25zLmZvcm1hdCA/IHRoaXMub3B0aW9ucy5mb3JtYXQgOiAibmluZSIpOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzWyJ6aXBjb2RlLW5pbmUiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1maXZlIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlRoZSBjb25maWd1cmVkIHppcGNvZGUgZm9ybWF0OiAiICsgdGhpcy5vcHRpb25zLmZvcm1hdCArICIgaXMgbm90IGEgbGVnYWwgdmFsdWUgW2ZpdmUsIG5pbmVdIik7CgogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBuaW5lIGZvcm1hdAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvcm1hdCA9ICJuaW5lIjsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCBtYXNrIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OS05OTk5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1sibWFza1N0cmluZyJdID0gIjk5OTk5IjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJmaXZlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgemlwY29kZSBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImZpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJmaXZlIiwgIm5pbmUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJaaXBjb2RlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGEgZml2ZSBvciBuaW5lLWRpZ2l0YWwgVVMgemlwY29kZSBjb250cm9sIHdpdGggdmFsaWRhdGlvbi4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiOiAiSW52YWxpZCBGaXZlLURpZ2l0IFppcGNvZGUgKCMjIyMjKSIsCiAgICAgICAgImludmFsaWRaaXBjb2RlRm9ybWF0TmluZSI6ICJJbnZhbGlkIE5pbmUtRGlnaXQgWmlwY29kZSAoIyMjIyMtIyMjIykiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInppcGNvZGUiLCBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJ6aXBjb2RlIiwgInppcGNvZGUiKTsKCn0pKGpRdWVyeSk7CgovKioKICogRGVmaW5lcyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBmb3Igdmlld3MuICBBbGwgdmlld3MgaW4gQWxwYWNhIHVsdGltYXRlbHkgZXh0ZW5kIHRoaXMgZm9ybS4KICogVGhpcyBwcm92aWRlcyB0aGUgaWRlYWwgcGxhY2UgZm9yIGFueSBnbG9iYWwgb3ZlcnJpZGVzIG9mIHZpZXcgdGVtcGxhdGVzLCBtZXNzYWdlIGJ1bmRsZXMgb3Igb3RoZXIgc2V0dGluZ3MuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgInRpdGxlIjogIkFic3RyYWN0IGJhc2UgdmlldyIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiY291bnRyaWVzIjogewogICAgICAgICAgICAgICAgImFmZyI6IkFmZ2hhbmlzdGFuIiwKICAgICAgICAgICAgICAgICJhbGEiOiJBbGFuZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJhbGIiOiJBbGJhbmlhIiwKICAgICAgICAgICAgICAgICJkemEiOiJBbGdlcmlhIiwKICAgICAgICAgICAgICAgICJhc20iOiJBbWVyaWNhbiBTYW1vYSIsCiAgICAgICAgICAgICAgICAiYW5kIjoiQW5kb3JyYSIsCiAgICAgICAgICAgICAgICAiYWdvIjoiQW5nb2xhIiwKICAgICAgICAgICAgICAgICJhaWEiOiJBbmd1aWxsYSIsCiAgICAgICAgICAgICAgICAiYXRhIjoiQW50YXJjdGljYSIsCiAgICAgICAgICAgICAgICAiYXRnIjoiQW50aWd1YSBhbmQgQmFyYnVkYSIsCiAgICAgICAgICAgICAgICAiYXJnIjoiQXJnZW50aW5hIiwKICAgICAgICAgICAgICAgICJhcm0iOiJBcm1lbmlhIiwKICAgICAgICAgICAgICAgICJhYnciOiJBcnViYSIsCiAgICAgICAgICAgICAgICAiYXVzIjoiQXVzdHJhbGlhIiwKICAgICAgICAgICAgICAgICJhdXQiOiJBdXN0cmlhIiwKICAgICAgICAgICAgICAgICJhemUiOiJBemVyYmFpamFuIiwKICAgICAgICAgICAgICAgICJiaHMiOiJCYWhhbWFzIiwKICAgICAgICAgICAgICAgICJiaHIiOiJCYWhyYWluIiwKICAgICAgICAgICAgICAgICJiZ2QiOiJCYW5nbGFkZXNoIiwKICAgICAgICAgICAgICAgICJicmIiOiJCYXJiYWRvcyIsCiAgICAgICAgICAgICAgICAiYmxyIjoiQmVsYXJ1cyIsCiAgICAgICAgICAgICAgICAiYmVsIjoiQmVsZ2l1bSIsCiAgICAgICAgICAgICAgICAiYmx6IjoiQmVsaXplIiwKICAgICAgICAgICAgICAgICJiZW4iOiJCZW5pbiIsCiAgICAgICAgICAgICAgICAiYm11IjoiQmVybXVkYSIsCiAgICAgICAgICAgICAgICAiYnRuIjoiQmh1dGFuIiwKICAgICAgICAgICAgICAgICJib2wiOiJCb2xpdmlhIiwKICAgICAgICAgICAgICAgICJiaWgiOiJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwKICAgICAgICAgICAgICAgICJid2EiOiJCb3Rzd2FuYSIsCiAgICAgICAgICAgICAgICAiYnZ0IjoiQm91dmV0IElzbGFuZCIsCiAgICAgICAgICAgICAgICAiYnJhIjoiQnJhemlsIiwKICAgICAgICAgICAgICAgICJpb3QiOiJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLAogICAgICAgICAgICAgICAgImJybiI6IkJydW5laSBEYXJ1c3NhbGFtIiwKICAgICAgICAgICAgICAgICJiZ3IiOiJCdWxnYXJpYSIsCiAgICAgICAgICAgICAgICAiYmZhIjoiQnVya2luYSBGYXNvIiwKICAgICAgICAgICAgICAgICJiZGkiOiJCdXJ1bmRpIiwKICAgICAgICAgICAgICAgICJraG0iOiJDYW1ib2RpYSIsCiAgICAgICAgICAgICAgICAiY21yIjoiQ2FtZXJvb24iLAogICAgICAgICAgICAgICAgImNhbiI6IkNhbmFkYSIsCiAgICAgICAgICAgICAgICAiY3B2IjoiQ2FwZSBWZXJkZSIsCiAgICAgICAgICAgICAgICAiY3ltIjoiQ2F5bWFuIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImNhZiI6IkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAidGNkIjoiQ2hhZCIsCiAgICAgICAgICAgICAgICAiY2hsIjoiQ2hpbGUiLAogICAgICAgICAgICAgICAgImNobiI6IkNoaW5hIiwKICAgICAgICAgICAgICAgICJjeHIiOiJDaHJpc3RtYXMgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJjY2siOiJDb2NvcyAoS2VlbGluZyksIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImNvbCI6IkNvbG9tYmlhIiwKICAgICAgICAgICAgICAgICJjb20iOiJDb21vcm9zIiwKICAgICAgICAgICAgICAgICJjb2ciOiJDb25nbyIsCiAgICAgICAgICAgICAgICAiY29kIjoiQ29uZ28sIHRoZSBEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSIsCiAgICAgICAgICAgICAgICAiY29rIjoiQ29vayBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjcmkiOiJDb3N0YSBSaWNhIiwKICAgICAgICAgICAgICAgICJocnYiOiJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICJjdWIiOiJDdWJhIiwKICAgICAgICAgICAgICAgICJjeXAiOiJDeXBydXMiLAogICAgICAgICAgICAgICAgImN6ZSI6IkN6ZWNoIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICJjaXYiOiJDb3RlIGQnSXZvaXJlIiwKICAgICAgICAgICAgICAgICJkbmsiOiJEZW5tYXJrIiwKICAgICAgICAgICAgICAgICJkamkiOiJEamlib3V0aSIsCiAgICAgICAgICAgICAgICAiZG1hIjoiRG9taW5pY2EiLAogICAgICAgICAgICAgICAgImRvbSI6IkRvbWluaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiZWN1IjoiRWN1YWRvciIsCiAgICAgICAgICAgICAgICAiZWd5IjoiRWd5cHQiLAogICAgICAgICAgICAgICAgInNsdiI6IkVsIFNhbHZhZG9yIiwKICAgICAgICAgICAgICAgICJnbnEiOiJFcXVhdG9yaWFsIEd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZXJpIjoiRXJpdHJlYSIsCiAgICAgICAgICAgICAgICAiZXN0IjoiRXN0b25pYSIsCiAgICAgICAgICAgICAgICAiZXRoIjoiRXRoaW9waWEiLAogICAgICAgICAgICAgICAgImZsayI6IkZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKSwiLAogICAgICAgICAgICAgICAgImZybyI6IkZhcm9lIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImZqaSI6IkZpamkiLAogICAgICAgICAgICAgICAgImZpbiI6IkZpbmxhbmQiLAogICAgICAgICAgICAgICAgImZyYSI6IkZyYW5jZSIsCiAgICAgICAgICAgICAgICAiZ3VmIjoiRnJlbmNoIEd1aWFuYSIsCiAgICAgICAgICAgICAgICAicHlmIjoiRnJlbmNoIFBvbHluZXNpYSIsCiAgICAgICAgICAgICAgICAiYXRmIjoiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICJnYWIiOiJHYWJvbiIsCiAgICAgICAgICAgICAgICAiZ21iIjoiR2FtYmlhIiwKICAgICAgICAgICAgICAgICJnZW8iOiJHZW9yZ2lhIiwKICAgICAgICAgICAgICAgICJkZXUiOiJHZXJtYW55IiwKICAgICAgICAgICAgICAgICJnaGEiOiJHaGFuYSIsCiAgICAgICAgICAgICAgICAiZ2liIjoiR2licmFsdGFyIiwKICAgICAgICAgICAgICAgICJncmMiOiJHcmVlY2UiLAogICAgICAgICAgICAgICAgImdybCI6IkdyZWVubGFuZCIsCiAgICAgICAgICAgICAgICAiZ3JkIjoiR3JlbmFkYSIsCiAgICAgICAgICAgICAgICAiZ2xwIjoiR3VhZGVsb3VwZSIsCiAgICAgICAgICAgICAgICAiZ3VtIjoiR3VhbSIsCiAgICAgICAgICAgICAgICAiZ3RtIjoiR3VhdGVtYWxhIiwKICAgICAgICAgICAgICAgICJnZ3kiOiJHdWVybnNleSIsCiAgICAgICAgICAgICAgICAiZ2luIjoiR3VpbmVhIiwKICAgICAgICAgICAgICAgICJnbmIiOiJHdWluZWEtQmlzc2F1IiwKICAgICAgICAgICAgICAgICJndXkiOiJHdXlhbmEiLAogICAgICAgICAgICAgICAgImh0aSI6IkhhaXRpIiwKICAgICAgICAgICAgICAgICJobWQiOiJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInZhdCI6IkhvbHkgU2VlIChWYXRpY2FuIENpdHkgU3RhdGUpLCIsCiAgICAgICAgICAgICAgICAiaG5kIjoiSG9uZHVyYXMiLAogICAgICAgICAgICAgICAgImhrZyI6IkhvbmcgS29uZyIsCiAgICAgICAgICAgICAgICAiaHVuIjoiSHVuZ2FyeSIsCiAgICAgICAgICAgICAgICAiaXNsIjoiSWNlbGFuZCIsCiAgICAgICAgICAgICAgICAiaW5kIjoiSW5kaWEiLAogICAgICAgICAgICAgICAgImlkbiI6IkluZG9uZXNpYSIsCiAgICAgICAgICAgICAgICAiaXJuIjoiSXJhbiwgSXNsYW1pYyBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAiaXJxIjoiSXJhcSIsCiAgICAgICAgICAgICAgICAiaXJsIjoiSXJlbGFuZCIsCiAgICAgICAgICAgICAgICAiaW1uIjoiSXNsZSBvZiBNYW4iLAogICAgICAgICAgICAgICAgImlzciI6IklzcmFlbCIsCiAgICAgICAgICAgICAgICAiaXRhIjoiSXRhbHkiLAogICAgICAgICAgICAgICAgImphbSI6IkphbWFpY2EiLAogICAgICAgICAgICAgICAgImpwbiI6IkphcGFuIiwKICAgICAgICAgICAgICAgICJqZXkiOiJKZXJzZXkiLAogICAgICAgICAgICAgICAgImpvciI6IkpvcmRhbiIsCiAgICAgICAgICAgICAgICAia2F6IjoiS2F6YWtoc3RhbiIsCiAgICAgICAgICAgICAgICAia2VuIjoiS2VueWEiLAogICAgICAgICAgICAgICAgImtpciI6IktpcmliYXRpIiwKICAgICAgICAgICAgICAgICJwcmsiOiJLb3JlYSwgRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia29yIjoiS29yZWEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJrd3QiOiJLdXdhaXQiLAogICAgICAgICAgICAgICAgImtneiI6Ikt5cmd5enN0YW4iLAogICAgICAgICAgICAgICAgImxhbyI6IkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICJsdmEiOiJMYXR2aWEiLAogICAgICAgICAgICAgICAgImxibiI6IkxlYmFub24iLAogICAgICAgICAgICAgICAgImxzbyI6Ikxlc290aG8iLAogICAgICAgICAgICAgICAgImxiciI6IkxpYmVyaWEiLAogICAgICAgICAgICAgICAgImxieSI6IkxpYnlhbiBBcmFiIEphbWFoaXJpeWEiLAogICAgICAgICAgICAgICAgImxpZSI6IkxpZWNodGVuc3RlaW4iLAogICAgICAgICAgICAgICAgImx0dSI6IkxpdGh1YW5pYSIsCiAgICAgICAgICAgICAgICAibHV4IjoiTHV4ZW1ib3VyZyIsCiAgICAgICAgICAgICAgICAibWFjIjoiTWFjYW8iLAogICAgICAgICAgICAgICAgIm1rZCI6Ik1hY2Vkb25pYSwgdGhlIGZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAibWRnIjoiTWFkYWdhc2NhciIsCiAgICAgICAgICAgICAgICAibXdpIjoiTWFsYXdpIiwKICAgICAgICAgICAgICAgICJteXMiOiJNYWxheXNpYSIsCiAgICAgICAgICAgICAgICAibWR2IjoiTWFsZGl2ZXMiLAogICAgICAgICAgICAgICAgIm1saSI6Ik1hbGkiLAogICAgICAgICAgICAgICAgIm1sdCI6Ik1hbHRhIiwKICAgICAgICAgICAgICAgICJtaGwiOiJNYXJzaGFsbCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJtdHEiOiJNYXJ0aW5pcXVlIiwKICAgICAgICAgICAgICAgICJtcnQiOiJNYXVyaXRhbmlhIiwKICAgICAgICAgICAgICAgICJtdXMiOiJNYXVyaXRpdXMiLAogICAgICAgICAgICAgICAgIm15dCI6Ik1heW90dGUiLAogICAgICAgICAgICAgICAgIm1leCI6Ik1leGljbyIsCiAgICAgICAgICAgICAgICAiZnNtIjoiTWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZiIsCiAgICAgICAgICAgICAgICAibWRhIjoiTW9sZG92YSwgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1jbyI6Ik1vbmFjbyIsCiAgICAgICAgICAgICAgICAibW5nIjoiTW9uZ29saWEiLAogICAgICAgICAgICAgICAgIm1uZSI6Ik1vbnRlbmVncm8iLAogICAgICAgICAgICAgICAgIm1zciI6Ik1vbnRzZXJyYXQiLAogICAgICAgICAgICAgICAgIm1hciI6Ik1vcm9jY28iLAogICAgICAgICAgICAgICAgIm1veiI6Ik1vemFtYmlxdWUiLAogICAgICAgICAgICAgICAgIm1tciI6Ik15YW5tYXIiLAogICAgICAgICAgICAgICAgIm5hbSI6Ik5hbWliaWEiLAogICAgICAgICAgICAgICAgIm5ydSI6Ik5hdXJ1IiwKICAgICAgICAgICAgICAgICJucGwiOiJOZXBhbCIsCiAgICAgICAgICAgICAgICAibmxkIjoiTmV0aGVybGFuZHMiLAogICAgICAgICAgICAgICAgImFudCI6Ik5ldGhlcmxhbmRzIEFudGlsbGVzIiwKICAgICAgICAgICAgICAgICJuY2wiOiJOZXcgQ2FsZWRvbmlhIiwKICAgICAgICAgICAgICAgICJuemwiOiJOZXcgWmVhbGFuZCIsCiAgICAgICAgICAgICAgICAibmljIjoiTmljYXJhZ3VhIiwKICAgICAgICAgICAgICAgICJuZXIiOiJOaWdlciIsCiAgICAgICAgICAgICAgICAibmdhIjoiTmlnZXJpYSIsCiAgICAgICAgICAgICAgICAibml1IjoiTml1ZSIsCiAgICAgICAgICAgICAgICAibmZrIjoiTm9yZm9sayBJc2xhbmQiLAogICAgICAgICAgICAgICAgIm1ucCI6Ik5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibm9yIjoiTm9yd2F5IiwKICAgICAgICAgICAgICAgICJvbW4iOiJPbWFuIiwKICAgICAgICAgICAgICAgICJwYWsiOiJQYWtpc3RhbiIsCiAgICAgICAgICAgICAgICAicGx3IjoiUGFsYXUiLAogICAgICAgICAgICAgICAgInBzZSI6IlBhbGVzdGluaWFuIFRlcnJpdG9yeSwgT2NjdXBpZWQiLAogICAgICAgICAgICAgICAgInBhbiI6IlBhbmFtYSIsCiAgICAgICAgICAgICAgICAicG5nIjoiUGFwdWEgTmV3IEd1aW5lYSIsCiAgICAgICAgICAgICAgICAicHJ5IjoiUGFyYWd1YXkiLAogICAgICAgICAgICAgICAgInBlciI6IlBlcnUiLAogICAgICAgICAgICAgICAgInBobCI6IlBoaWxpcHBpbmVzIiwKICAgICAgICAgICAgICAgICJwY24iOiJQaXRjYWlybiIsCiAgICAgICAgICAgICAgICAicG9sIjoiUG9sYW5kIiwKICAgICAgICAgICAgICAgICJwcnQiOiJQb3J0dWdhbCIsCiAgICAgICAgICAgICAgICAicHJpIjoiUHVlcnRvIFJpY28iLAogICAgICAgICAgICAgICAgInFhdCI6IlFhdGFyIiwKICAgICAgICAgICAgICAgICJyb3UiOiJSb21hbmlhIiwKICAgICAgICAgICAgICAgICJydXMiOiJSdXNzaWFuIEZlZGVyYXRpb24iLAogICAgICAgICAgICAgICAgInJ3YSI6IlJ3YW5kYSIsCiAgICAgICAgICAgICAgICAicmV1IjoiUmV1bmlvbiIsCiAgICAgICAgICAgICAgICAiYmxtIjoiU2FpbnQgQmFydGhlbGVteSIsCiAgICAgICAgICAgICAgICAic2huIjoiU2FpbnQgSGVsZW5hIiwKICAgICAgICAgICAgICAgICJrbmEiOiJTYWludCBLaXR0cyBhbmQgTmV2aXMiLAogICAgICAgICAgICAgICAgImxjYSI6IlNhaW50IEx1Y2lhIiwKICAgICAgICAgICAgICAgICJtYWYiOiJTYWludCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KSIsCiAgICAgICAgICAgICAgICAic3BtIjoiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCiAgICAgICAgICAgICAgICAidmN0IjoiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLAogICAgICAgICAgICAgICAgIndzbSI6IlNhbW9hIiwKICAgICAgICAgICAgICAgICJzbXIiOiJTYW4gTWFyaW5vIiwKICAgICAgICAgICAgICAgICJzdHAiOiJTYW8gVG9tZSBhbmQgUHJpbmNpcGUiLAogICAgICAgICAgICAgICAgInNhdSI6IlNhdWRpIEFyYWJpYSIsCiAgICAgICAgICAgICAgICAic2VuIjoiU2VuZWdhbCIsCiAgICAgICAgICAgICAgICAic3JiIjoiU2VyYmlhIiwKICAgICAgICAgICAgICAgICJzeWMiOiJTZXljaGVsbGVzIiwKICAgICAgICAgICAgICAgICJzbGUiOiJTaWVycmEgTGVvbmUiLAogICAgICAgICAgICAgICAgInNncCI6IlNpbmdhcG9yZSIsCiAgICAgICAgICAgICAgICAic3ZrIjoiU2xvdmFraWEiLAogICAgICAgICAgICAgICAgInN2biI6IlNsb3ZlbmlhIiwKICAgICAgICAgICAgICAgICJzbGIiOiJTb2xvbW9uIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInNvbSI6IlNvbWFsaWEiLAogICAgICAgICAgICAgICAgInphZiI6IlNvdXRoIEFmcmljYSIsCiAgICAgICAgICAgICAgICAic2dzIjoiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImVzcCI6IlNwYWluIiwKICAgICAgICAgICAgICAgICJsa2EiOiJTcmkgTGFua2EiLAogICAgICAgICAgICAgICAgInNkbiI6IlN1ZGFuIiwKICAgICAgICAgICAgICAgICJzdXIiOiJTdXJpbmFtZSIsCiAgICAgICAgICAgICAgICAic2ptIjoiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsCiAgICAgICAgICAgICAgICAic3d6IjoiU3dhemlsYW5kIiwKICAgICAgICAgICAgICAgICJzd2UiOiJTd2VkZW4iLAogICAgICAgICAgICAgICAgImNoZSI6IlN3aXR6ZXJsYW5kIiwKICAgICAgICAgICAgICAgICJzeXIiOiJTeXJpYW4gQXJhYiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAidHduIjoiVGFpd2FuLCBQcm92aW5jZSBvZiBDaGluYSIsCiAgICAgICAgICAgICAgICAidGprIjoiVGFqaWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidHphIjoiVGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAidGhhIjoiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgInRscyI6IlRpbW9yLUxlc3RlIiwKICAgICAgICAgICAgICAgICJ0Z28iOiJUb2dvIiwKICAgICAgICAgICAgICAgICJ0a2wiOiJUb2tlbGF1IiwKICAgICAgICAgICAgICAgICJ0b24iOiJUb25nYSIsCiAgICAgICAgICAgICAgICAidHRvIjoiVHJpbmlkYWQgYW5kIFRvYmFnbyIsCiAgICAgICAgICAgICAgICAidHVuIjoiVHVuaXNpYSIsCiAgICAgICAgICAgICAgICAidHVyIjoiVHVya2V5IiwKICAgICAgICAgICAgICAgICJ0a20iOiJUdXJrbWVuaXN0YW4iLAogICAgICAgICAgICAgICAgInRjYSI6IlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidHV2IjoiVHV2YWx1IiwKICAgICAgICAgICAgICAgICJ1Z2EiOiJVZ2FuZGEiLAogICAgICAgICAgICAgICAgInVrciI6IlVrcmFpbmUiLAogICAgICAgICAgICAgICAgImFyZSI6IlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwKICAgICAgICAgICAgICAgICJnYnIiOiJVbml0ZWQgS2luZ2RvbSIsCiAgICAgICAgICAgICAgICAidXNhIjoiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAidW1pIjoiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ1cnkiOiJVcnVndWF5IiwKICAgICAgICAgICAgICAgICJ1emIiOiJVemJla2lzdGFuIiwKICAgICAgICAgICAgICAgICJ2dXQiOiJWYW51YXR1IiwKICAgICAgICAgICAgICAgICJ2ZW4iOiJWZW5lenVlbGEiLAogICAgICAgICAgICAgICAgInZubSI6IlZpZXQgTmFtIiwKICAgICAgICAgICAgICAgICJ2Z2IiOiJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCIsCiAgICAgICAgICAgICAgICAidmlyIjoiVmlyZ2luIElzbGFuZHMsIFUuUy4iLAogICAgICAgICAgICAgICAgIndsZiI6IldhbGxpcyBhbmQgRnV0dW5hIiwKICAgICAgICAgICAgICAgICJlc2giOiJXZXN0ZXJuIFNhaGFyYSIsCiAgICAgICAgICAgICAgICAieWVtIjoiWWVtZW4iLAogICAgICAgICAgICAgICAgInptYiI6IlphbWJpYSIsCiAgICAgICAgICAgICAgICAiendlIjoiWmltYmFid2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXB0eSI6ICIiLAogICAgICAgICAgICAicmVxdWlyZWQiOiAiVGhpcyBmaWVsZCBpcyByZXF1aXJlZCIsCiAgICAgICAgICAgICJ2YWxpZCI6ICIiLAogICAgICAgICAgICAiaW52YWxpZCI6ICJUaGlzIGZpZWxkIGlzIGludmFsaWQiLAogICAgICAgICAgICAibW9udGhzIjogWyJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl0sCiAgICAgICAgICAgICJ0aW1lVW5pdHMiOiB7IFNFQ09ORDogInNlY29uZHMiLCBNSU5VVEU6ICJtaW51dGVzIiwgSE9VUjogImhvdXJzIiwgREFZOiAiZGF5cyIsIE1PTlRIOiAibW9udGhzIiwgWUVBUjogInllYXJzIiB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKCS8vIGN6ZWNoIC0gY3plY2ggcmVwdWJsaWMKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJjc19DWiI6IHsKCQkJCXJlcXVpcmVkOiAiVG90byBwb2xlIGplIHZ5xb5hZG92w6FubyIsCgkJCQlpbnZhbGlkOiAiVG90byBwb2xlIGplIG5lcGxhdG7DqSIsCgkJCQltb250aHM6IFsiTGVkZW4iLCAiw5pub3IiLCAiQsWZZXplbiIsICJEdWJlbiIsICJLdsSbdGVuIiwgIsSMZXJ2ZW4iLCAixIxlcnZlbmVjIiwgIlNycGVuIiwgIlrDocWZw60iLCAixZjDrWplbiIsICJMaXN0b3BhZCIsICJQcm9zaW5lYyJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VrdW5keSIsCgkJCQkJTUlOVVRFOiAibWludXR5IiwKCQkJCQlIT1VSOiAiaG9kaW55IiwKCQkJCQlEQVk6ICJkbnkiLAoJCQkJCU1PTlRIOiAibcSbc8OtY2UiLAoJCQkJCVlFQVI6ICJyb2t5IgoJCQkJfSwKCQkJCS8vIENvbnRyb2xGaWVsZC5qcwoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IGplZG51IGhvZG5vdHUgeiB7MH0uIEFrdHXDoWxuw60gaG9kbm90YSBqZTogezF9IiwKCgkJCQkvLyBGaWVsZC5qcwoJCQkJIm5vdE9wdGlvbmFsIjogIlRvdG8gcG9sZSBuZW7DrSB2b2xpdGVsbsOpIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBqc291IHpha8OhemFuw6kgaG9kbm90eS4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9BcnJheUZpZWxkLmpzCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiTWluaW3DoWxuw60gcG/EjWV0IHBvbG/FvmVrIGplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk1heGltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkhvZG5vdHkgbmVqc291IHVuaWvDoXRuw60iLAoJCQkJIm5vdEFuQXJyYXkiOiAiVGF0byBob2Rub3RhIG5lbsOtIHBvbGUiLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJQxZlpZGF0IG5vdm91IHBvbG/Fvmt1IiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJQxZlpZGF0IiwKCQkJCSJyZW1vdmVCdXR0b25MYWJlbCI6ICJPZGVicmF0IiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIk5haG9ydSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkRvbMWvIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvTGlzdEZpZWxkLmpzCgkJCQkibm9uZUxhYmVsIjogIsW9w6FkbsO9IiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvTnVtYmVyRmllbGQuanMKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltw6FsbsOtIGhvZG5vdGEgdG9ob3RvIHBvbGUgamUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1heGltw6FsbsOtIGhvZG5vdGEgdG9ob3RvIHBvbGUgamUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkhvZG5vdGEgdG9ob3RvIHBvbGUgbXVzw60gYsO9dCB2xJt0xaHDrSBuZcW+IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgbWVuxaHDrSBuZcW+IHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiSG9kbm90YSBtdXPDrSBiw710IGTEm2xpdGVsbsOhIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJIb2Rub3RhIG5lbsOtIMSNw61zbG8uIiwKCQkJCSJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAixIzDrXNsbyBuZW7DrSBuw6Fzb2JrZW0gezB9IiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvT2JqZWN0RmllbGQuanMKCQkJCSJ0b29NYW55UHJvcGVydGllcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgdmxhc3Rub3N0w60gKHswfSkgYnlsIHDFmWVrcm/EjWVuLiIsCgkJCQkidG9vRmV3UHJvcGVydGllcyI6ICJOZW7DrSBkb3N0YXRlayB2bGFzdG5vc3TDrSAoamUgcG/FvmFkb3bDoW5vIHswfSkiLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0QXJlYUZpZWxkLmpzCgkJCQkid29yZExpbWl0RXhjZWVkZWQiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHNsb3YgKHswfSkgYnlsIHDFmWVrcm/EjWVuLiIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL1RleHRGaWVsZC5qcwoJCQkJImludmFsaWRQYXR0ZXJuIjogIlRvdG8gcG9sZSBtw6EgbcOtdCB2em9yIHswfSIsCgkJCQkic3RyaW5nVG9vU2hvcnQiOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBuZWptZW7EmyB7MH0gem5ha8WvIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbWF4aW3DoWxuxJsgezB9IHpuYWvFryIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0RhdGVGaWVsZC5qcwoJCQkJImludmFsaWREYXRlIjogIk5lc3Byw6F2bsOpIGRhdHVtIHBybyBmb3Jtw6F0IHswfSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuZWQvRWRpdG9yRmllbGQuanMKCQkJCSJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIkVkaXRvciBtw6EgdiBzb2LEmyBjaHlieSwga3RlcsOpIG11c8OtIGLDvXQgb3ByYXZlbnkiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9FbWFpbEZpZWxkLmpzCgkJCQkiaW52YWxpZEVtYWlsIjogIkNoeWJuw6EgZS1tYWlsb3bDoSBhZHJlc2EsIHDFmS46IGluZm9AY2xvdWRjbXMuY29tIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQuSW50ZWdlckZpZWxkLmpzCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlRhdG8gaG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0lQdjRGaWVsZC5qcwoJCQkJImludmFsaWRJUHY0IjogIkNoeWJuw6EgSVB2NCBhZHJlc2EsIGV4OiAxOTIuMTY4LjAuMSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0pTT05GaWVsZC5qcwoJCQkJInN0cmluZ05vdEFKU09OIjogIlRhdG8gaG9kbm90YSBuZW7DrSBwbGF0bsO9IEpTT04gdGV4dC4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9NYXBGaWVsZC5qcwoJCQkJImtleU1pc3NpbmciOiAiTWFwYSBvYnNhaHVqZSBwcsOhemRuw70ga2zDrcSNLiIsCgkJCQkia2V5Tm90VW5pcXVlIjogIktsw63EjWUgbmVqc291IGplZGluZcSNbsOpLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1Bhc3N3b3JkRmllbGQuanMKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAixaBwYXRuw6kgaGVzbG8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBob25lIjogIsWgcGF0bsOpIHRlbGVmb25uw60gxI3DrXNsbywgcMWZLjogKDEyMykgNDU2LTk5OTkiLCAvLyBUT0RPOiBpbnZhbGlkIHBhdHRlcm4gZm9yIGN6ZWNoIGxvY2FsZQoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9VcGxvYWRGaWVsZC5qcwoJCQkJImNob29zZUZpbGUiOiAiVnliZXJ0ZSBzb3Vib3IuLi4iLAoJCQkJImNob29zZUZpbGVzIjogIlZ5YmVydGUgc291Ym9yeS4uLiIsCgkJCQkiZHJvcFpvbmVTaW5nbGUiOiAiVnliZXJ0ZSBzb3Vib3IgbmVibyBqZWogcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgkJCQkiZHJvcFpvbmVNdWx0aXBsZSI6ICJWeWJlcnRlIHNvdWJvcnkgbmVibyBqZSBwxZlldMOhaG7Em3RlIHNlbSBwcm8gbmFocsOhbsOtLi4uIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVVJMRmllbGQuanMKCQkJCSJpbnZhbGlkVVJMRm9ybWF0IjogIlV2ZWRlbsOhIFVSTCBuZW7DrSBwbGF0bmEgd2Vib3bDoSBhZHJlc2EuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvQ2lwY29kZUZpZWxkLmpzCgkJCQkiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkNoeWJuw6kgcG/FoXRvdm7DrSBzbcSbcm92YWPDrSDEjcOtc2xvICgjIyMjIykiLAoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0TmluZSI6ICJDaHlibsOpIGRldsOtdGktbcOtc3Ruw6kgcG/FoXRvdm7DrSBzbcSbcm92YWPDrSDEjcOtc2xvICgjIyMjIy0jIyMjKSIKCQkJfQogICAgICAgIH0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gYXVzdHJpYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0FUIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSBpbnZhbGlkIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKw6RubmVyIiwgIkZlYnJ1YXIiLCAiTcOkcnoiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGV6ZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVuIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dGVuIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiU3R1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiVGFnZSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNb25hdGUiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJKYWhyZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGllc2VzIEZlbGQgaXN0IG5pY2h0IG9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZXJsYXVidDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGllc2UgRmVsZCBzb2xsdGUgZWluZW4gZGVyIGZvbGdlbmRlbiBXZXJ0ZSBlbnRoYWx0ZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRpZSBNaW5kZXN0YW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiRGllc2UgV2VydGUgc2luZCBuaWNodCBlaW5kZXV0aWciLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiS2VpbmUgTGlzdGUgdm9uIFdlcnRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmFsc2NoZXMgRGF0dW1zZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVbmfDvGx0aWdlIGUtTWFpbCBBZHJlc3NlLCB6LkIuOiBpbmZvQGNsb3VkY21zLmNvbSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIkVpbmdhYmUgaXN0IGtlaW5lIEdhbnogWmFobC4iLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlVuZ8O8bHRpZ2UgSVB2NCBBZHJlc3NlLCB6LkIuOiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBaZWljaGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGdyw7bDn2VyIHNlaW4gYWxzIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEaWUgQW56YWhsIGRlciBaZWljaGVuIG11c3Mga2xlaW5lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkRlciBXZXJ0IG11c3MgZHVyY2ggezB9IGRpdmlkaWVyYmFyIHNlaW4iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiRGllIEVpbmdhYmUgaXN0IGtlaW5lIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJVbmfDvGx0aWdlcyBQYXNzd29ydC4iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIsIHouQi46ICgxMjMpIDQ1Ni05OTk5IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJEaWVzZSBGZWxkIHN0aW1tdCBuaWNodCBtaXQgZm9sZ2VuZGVyIFZvcmdhYmUgw7xiZXJlaW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGllc2VzIEZlbGQgc29sbHRlIGjDtmNoc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBnZXJtYW4gLSBnZXJtYW55CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZGVfREUiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkVpbmdhYmUgZXJmb3JkZXJsaWNoIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJFaW5nYWJlIHVuZ8O8bHRpZyIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyIiwgIkZlYnJ1YXIiLCAiTcOkcnoiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGV6ZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVuIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dGVuIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiU3R1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiVGFnZSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNb25hdGUiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJKYWhyZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGllc2VzIEZlbGQgaXN0IG5pY2h0IG9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZXJsYXVidDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGllc2UgRmVsZCBzb2xsdGUgZWluZW4gZGVyIGZvbGdlbmRlbiBXZXJ0ZSBlbnRoYWx0ZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRpZSBNaW5kZXN0YW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiRGllc2UgV2VydGUgc2luZCBuaWNodCBlaW5kZXV0aWciLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiS2VpbmUgTGlzdGUgdm9uIFdlcnRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmFsc2NoZXMgRGF0dW1zZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJLZWluZSBnw7xsdGlnZSBFLU1haWwgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIktlaW5lIEdhbnplIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlVuZ8O8bHRpZ2UgSVB2NCBBZHJlc3NlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgZ3LDtnNzdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGllIGtsZWluc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGdyw7bDn2VyIHNlaW4gYWxzIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEaWUgZ3LDtnNzdG3DtmdsaWNoZSBaYWhsIG11c3Mga2xlaW5lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkRlciBXZXJ0IG11c3MgZHVyY2ggezB9IGRpdmlkaWVyYmFyIHNlaW4iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiRGllIEVpbmdhYmUgaXN0IGtlaW5lIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJVbmfDvGx0aWdlcyBQYXNzd29ydCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVuZ8O8bHRpZ2UgVGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ3JlZWsgLSBncmVlY2UKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJlbF9HUiI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAizqXPgM6/z4fPgc61z4nPhM65zrrPjCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAizpvOrM64zr/PgiIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsizpnOsc69zr/Phc6sz4HOuc6/z4IiLCAizqbOtc6yz4HOv8+FzqzPgc65zr/PgiIsICLOnM6sz4HPhM65zr/PgiIsICLOkc+Az4HOr867zrnOv8+CIiwgIs6czqzOuc6/z4IiLCAizpnOv8+Nzr3Ouc6/z4IiLCAizpnOv8+NzrvOuc6/z4IiLCAizpHPjc6zzr/Phc+Dz4TOv8+CIiwgIs6jzrXPgM+Ezq3OvM6yz4HOuc6/z4IiLCAizp/Ous+Ez47Oss+BzrnOv8+CIiwgIs6dzr/Orc68zrLPgc65zr/PgiIsICLOlM61zrrOrc68zrLPgc65zr/PgiJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAizpTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLOm861z4DPhM6sIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAizo/Pgc61z4IiLAogICAgICAgICAgICAgICAgICAgIERBWTogIs6czq3Pgc61z4IiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAizpzOrs69zrXPgiIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIs6nz4HPjM69zrnOsSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAizpHPhc+Ez4wgz4TOvyDPgM61zrTOr86/IM60zrXOvSDOtc6vzr3Osc65IM+Az4HOv86xzrnPgc61z4TOuc66z4wiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAizpzOtyDOtc+AzrnPhM+BzrXPgM+Ezq4gz4TOuc68zq46IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDPgM61z4HOuc6tz4fOtc65IM68zq/OsSDOsc+Az4wgz4TOuc+CIM6xzrrPjM67zr/Phc64zrXPgiDPhM65zrzOrc+COiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICLOnyDOtc67zqzPh865z4PPhM6/z4IgzrHPgc65zrjOvM+Mz4IgzrXOs86zz4HOsc+Gz47OvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIs6fIM68zq3Os865z4PPhM6/z4IgzrHPgc65zrjOvM+Mz4IgzrXOs86zz4HOsc+Gz47OvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAizp/OuSDPhM65zrzOrc+CIM60zrXOvSDOtc6vzr3Osc65IM68zr/Ovc6xzrTOuc66zq3PgiIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICLOlM61zr0gz4XPgM6sz4HPh86/z4XOvSDOtc6zzrPPgc6xz4bOrc+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICLOm86szrjOv8+CIM68zr/Pgc+Gzq4gzrfOvM61z4HOv868zrfOvc6vzrHPgjogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAizpzOtyDOrc6zzrrPhc+Bzr8gZW1haWwiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLOlM61zr0gzrXOr869zrHOuSDOsc66zq3Pgc6xzrnOv8+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICLOnM63IM6tzrPOus+Fz4HOtyBJUHY0IM60zrnOtc+NzrjPhc69z4POtyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLOpM6/IM61zrvOrM+HzrnPg8+Ezr8gz4DOu86uzrjOv8+CIM+HzrHPgc6xzrrPhM6uz4HPic69IM61zq/Ovc6xzrkgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIs6kzr8gzrzOrc6zzrnPg8+Ezr8gz4DOu86uzrjOv8+CIM+HzrHPgc6xzrrPhM6uz4HPic69IM61zq/Ovc6xzrkgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIs6Rz4DOsc65z4TOv8+Nzr3PhM6xzrkgz4DOtc+BzrnPg8+Dz4zPhM61z4HOv865IM+HzrHPgc6xzrrPhM6uzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIs6Rz4DOsc65z4TOv8+Nzr3PhM6xzrkgzrvOuc6zz4zPhM61z4HOv865IM+HzrHPgc6xzrrPhM6uz4HOtc+CIM6xz4DPjCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgz4DOv867zrvOsc+AzrvOrM+DzrnOvyDPhM6/z4UgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIs6XIM+EzrnOvM6uIM60zrXOvSDOtc6vzr3Osc65IM6xz4HOuc64zrzPjM+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAizpzOtyDOrc6zzrrPhc+Bzr8gcGFzc3dvcmQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLOnM63IM6tzrPOus+Fz4HOv8+CIM6xz4HOuc64zrzPjM+CIM+EzrfOu861z4bPjs69zr/PhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAizpHPhc+Ez4wgz4TOvyDPgM61zrTOr86/IM60zrXOvSDOrc+HzrXOuSDPhM63zr0gzrHPgM6xzrnPhM6/z43OvM61zr3OtyDOvM6/z4HPhs6uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAizqTOvyDPgM61zrTOr86/IM+Az4HOrc+AzrXOuSDOvc6xIM6tz4fOtc65IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+HzrHPgc6xzrrPhM6uz4HOtc+CIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIs6kzr8gz4DOtc60zq/OvyDOvM+Azr/Pgc61zq8gzr3OsSDOrc+HzrXOuSDPhM6/IM+Azr/Ou8+NIHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gc3BhbmlzaCAtIHNwYWluCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZXNfRVMiOiB7CgkJCQlyZXF1aXJlZDogIkVzdGUgY2FtcG8gZXMgb2JsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIkVzdGUgY2FtcG8gZXMgaW52w6FsaWRvIiwKCQkJCW1vbnRoczogWyJFbmVybyIsICJGZWJyZXJvIiwgIk1hcnpvIiwgIkFicmlsIiwgIk1heW8iLCAiSnVuaW8iLCAiSnVsaW8iLCAiQWdvc3RvIiwgIlNlcHRpZW1icmUiLCAiT2N0dWJyZSIsICJOb3ZpZW1icmUiLCAiRGljaWVtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWd1bmRvcyIsCgkJCQkJTUlOVVRFOiAibWludXRvcyIsCgkJCQkJSE9VUjogImhvcmFzIiwKCQkJCQlEQVk6ICJkw61hcyIsCgkJCQkJTU9OVEg6ICJtZXNlcyIsCgkJCQkJWUVBUjogImHDsW9zIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJFc3RlIGNhbXBvIG5vIGVzIG9wY2lvbmFsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gc29uIGxvcyB2YWxvcmVzIHJlY2hhemFkb3MuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZWJlIHRlbmVyIHVubyBkZSBsb3MgdmFsb3JlcyBhZGVudHJvIHswfS4gW3sxfV0iLAoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIkVsIG7Dum1lcm8gbcOtbmltbyBkZSBhcnTDrWN1bG9zIGVzIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkVsIG7Dum1lcm8gbcOheGltbyBkZSBhcnTDrWN1bG9zIGVzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiTG9zIHZhbG9yZXMgbm8gc29uIMO6bmljb3MiLAoJCQkJIm5vdEFuQXJyYXkiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBhcnNlbmFsIiwKCQkJCSJpbnZhbGlkRGF0ZSI6ICJGZWNoYSBpbnbDoWxpZGEgcGFyYSBlbCBmb3JtYXRvIHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkVtYWlsIGFkZHJlc3MgaW52w6FsaWRvLCBleDogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG5vIGVzIHVuIG7Dum1lcm8gZW50ZXJvLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiRGlyZWNjacOzbiBpbnbDoWxpZGEgSVB2NCwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkVsIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIGVzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJFbCB2YWxvciBtw6F4aW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRWwgdmFsb3IgZGUgZXN0ZSBjYW1wbyBkZWJlIHNlciBtYXlvciBxdWUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWVub3MgcXVlIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRWwgdmFsb3IgZGViZSBzZXIgZGl2aXNpYmxlIGNlcmNhIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG5vIGVzIHVuIG7Dum1lcm8uIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiQ29udHJhc2XDsWEgaW52w6FsaWRhIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiTsO6bWVybyBkZSB0ZWzDqWZvbm8gaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciBwYXRyw7NuIHswfSIsCgkJCQkic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZWJlIGNvbnRlbmVyIHBvciBsbyBtZW5vcyB7MH0gbsO6bWVyb3MgbyBjYXJhY3RlcmVzIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBhIGxvIG3DoXMgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkibm9uZUxhYmVsIjogIk5pbmd1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBw7FhZGlyIiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJBw7FhZGlyIiwKCQkJCSJyZW1vdmVCdXR0b25MYWJlbCI6ICJRdWl0YXIiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiQXJyaWJhIiwKCQkJCSJkb3duQnV0dG9uTGFiZWwiOiAiQWJham8iCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGZpbm5pc2ggLSBmaW5sYW5kCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZmlfRkkiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIktlbnR0w6Qgb24gcGFrb2xsaW5lbiIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiU3nDtnRlIG9uIHZpcmhlZWxsaW5lbiIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiVGFtbWlrdXUiLCAiSGVsbWlrdXUiLCAiTWFhbGlza3V1IiwgIkh1aHRpa3V1IiwgIlRvdWtva3V1IiwgIktlc8Oka3V1IiwgIkhlaW7DpGt1dSIsICJFbG9rdXUiLCAiU3l5c2t1dSIsICJMb2tha3V1IiwgIk1hcnJhc2t1dSIsICJKb3VsdWt1dSJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW50aWEiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV1dHRpYSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogInR1bnRpYSIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAicMOkaXbDpMOkIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogImt1dWthdXR0YSIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogInZ1b3R0YSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiVMOkbcOkIGtlbnR0w6Qgb24gcGFrb2xsaW5lbiIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJTZXVyYWF2YXQgc3nDtnR0ZWV0IGVpdsOkdCBvbGUgc2FsbGl0dHVqYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiS2VudMOkbiBwaXTDpMOkIHNpc8OkbHTDpMOkIHlrc2kgc2V1cmFhdmlzdGEgYXJ2b2lzdGE6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlBpZW5pbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiU3V1cmluIHNhbGxpdHR1IG3DpMOkcsOkIGFydm9qYSBvbiB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlN5w7Z0ZXR5dCBhcnZvdCBlaXbDpHQgb2xlIHVuaWlra2VqYSIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICJTecO2dGUgZWkgb2xlIGxpc3RhIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJWaXJoZWVsbGluZW4gcMOkaXbDpG3DpMOkcsOkbXVvdG86IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIlZpcmhlZWxsaW5lbiBzw6Roa8O2cG9zdGlvc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJBcnZvIGVpIG9sZSBrb2tvbmFpc2x1a3UiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlZpcmhlZWxsaW5lbiBJUHY0LW9zb2l0ZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJQaWVuaW4gc2FsbGl0dHUgYXJ2byBvbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiU3V1cmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkFydm9uIHBpdMOkw6Qgb2xsYSBzdXVyZW1waSBrdWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgcGllbmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkx1dnVuIHBpdMOkw6Qgb2xsYSBqYW9sbGluZW4gbHV2dWxsYSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiU3nDtnRlIGVpIG9sZSBsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVmlyaGVlbGxpbmVuIHNhbGFzYW5hIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVmlyaGVlbGxpbmVuIHB1aGVsaW5udW1lcm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlN5w7Z0dGVlbiB0w6R5dHl5IG9sbGEgc2V1cmFhdmFzc2EgbXVvZG9zc2E6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiU3nDtnR0ZWVuIG1pbmltaXBpdHV1cyBvbiB7MH0gbWVya2tpw6QiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiU3nDtnR0ZWVuIG1ha3NpbWlwaXR1dXMgb24gezB9IG1lcmtracOkIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmcmVuY2ggLSBmcmFuY2UKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJmcl9GUiI6IHsKCQkJCXJlcXVpcmVkOiAiQ2UgY2hhbXAgZXN0IHJlcXVpcyIsCgkJCQlpbnZhbGlkOiAiQ2UgY2hhbXAgZXN0IGludmFsaWRlIiwKCQkJCW1vbnRoczogWyJKYW52aWVyIiwgIkbDqXZyaWVyIiwgIk1hcnMiLCAiQXZyaWwiLCAiTWFpIiwgIkp1aW4iLCAiSnVpbGxldCIsICJBb8O7dCIsICJTZXB0ZW1icmUiLCAiT2N0b2JyZSIsICJOb3ZlbWJyZSIsICJEw6ljZW1icmUiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNlY29uZGVzIiwKCQkJCQlNSU5VVEU6ICJtaW51dGVzIiwKCQkJCQlIT1VSOiAiaGV1cmVzIiwKCQkJCQlEQVk6ICJqb3VycyIsCgkJCQkJTU9OVEg6ICJtb2lzIiwKCQkJCQlZRUFSOiAiYW5uw6llcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiQ2UgY2hhbXAgbidlc3QgcGFzIG9wdGlvbm5lbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbnQgZGVzIHZhbGV1cnMgaW50ZXJkaXRlcy4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJDZSBjaGFtcCBkb2l0IHByZW5kcmUgdW5lIGRlcyB2YWxldXJzIHN1aXZhbnRlcyA6IHswfS4gW3sxfV0iLAoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIkxlIG5vbWJyZSBtaW5pbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiTGUgbm9tYnJlIG1heGltdW0gZCfDqWzDqW1lbnRzIGVzdCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxlcyB2YWxldXJzIHNvbnQgdW5pcXVlcyIsCgkJCQkibm90QW5BcnJheSI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuZSBsaXN0ZSIsCgkJCQkiaW52YWxpZERhdGUiOiAiQ2V0dGUgZGF0ZSBuZSBjb3JyZXNwb25kIHBhcyBhdSBmb3JtYXQgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiQWRyZXNzZSBkZSBjb3VycmllbCBpbnZhbGlkZSwgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1biBub21icmUgZW50aWVyLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiQWRyZXNzZSBJUHY0IGludmFsaWRlLCBleDogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiTGEgdmFsZXVyIG1pbmltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJMYSB2YWxldXIgbWF4aW1hbGUgcG91ciBjZSBjaGFtcCBlc3QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkxhIHZhbGV1ciBkb2l0LcOqdHJlIHN1cMOpcmlldXJlIMOgIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBpbmbDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkxhIHZhbGV1ciBkb2l0LcOqdHJlIGRpdmlzaWJsZSBwYXIgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk1vdCBkZSBwYXNzZSBpbnZhbGlkZSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bcOpcm8gZGUgdMOpbMOpcGhvbmUgaW52YWxpZGUsIGV4OiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiQ2UgY2hhbXAgZG9pdCBjb3JyZXNwb25kcmUgYXUgbW90aWYgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJDZSBjaGFtcCBkb2l0IGNvbnRlbmlyIGF1IG1vaW5zIHswfSBjYXJhY3TDqHJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJDZSBjaGFtcCBkb2l0IGNvbnRlbmlyIGF1IHBsdXMgezB9IGNhcmFjdMOocmVzIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjcm9hdGlhbiAtIGNyb2F0aWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJocl9IUiI6IHsKCQkJCXJlcXVpcmVkOiAiUG9samUgamUgb2JhdmV6bm8iLAoJCQkJaW52YWxpZDogIlBvZ3JlxaFuYSB2cmlqZWRub3N0IiwKCQkJCW1vbnRoczogWyJTaWplxI1hbmoiLCAiVmVsamHEjWEiLCAiT8W+dWphayIsICJUcmF2YW5qIiwgIlN2aWJhbmoiLCAiTGlwYW5qIiwgIlNycGFuaiIsICJLb2xvdm96IiwgIlJ1amFuIiwgIkxpc3RvcGFkIiwgIlN0dWRlbmkiLCAiUHJvc2luYWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZGEiLAoJCQkJCU1JTlVURTogIm1pbnV0YSIsCgkJCQkJSE9VUjogInNhdGkiLAoJCQkJCURBWTogImRhbiIsCgkJCQkJTU9OVEg6ICJtamVzZWMiLAoJCQkJCVlFQVI6ICJnb2RpbmEiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIlBvbGplIG5pamUgb3BjaW9uby4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHZyaWplZG5vc3QgbmlqZSBkb3p2b2xqZW5hLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIk1vZ3XEh2UgdnJpamVkbm9zdGkgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJPZGFiZXJpdGUgbmFqbWFuamUgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiT2RhYmVyaXRlIG5hanZpxaFlIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiVnJpamVkbm9zdCBuaWplIGplZGluc3R2ZW5hIiwKCQkJCSJub3RBbkFycmF5IjogIlZyaWplZG5vc3QgbmlqZSBwb3BpcyIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0dW0gbmlqZSB1IGZvcm1hdHUgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiRS1tYWlsIGFkcmVzYSBuaWplIHUgaXNwcmF2bm9tIGZvcm1hdHUsIG5wcjogaW1lLnByZXppbWVAaW50ZXJuZXQuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiVnJpamVkbm9zdCBuaWplIGNpamVsaSBicm9qLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiSVB2NCBhZHJlc2EgbmlqZSBpc3ByYXZuYSwgbnByOiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJWcmlqZWRub3N0IGplIGlzcG9kIGRvcHXFoXRlbm9nIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJWcmlqZWRub3N0IGplIGl6bmFkIGRvcHXFoXRlbm9nIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWcmlqZWRub3N0IG1vcmEgYml0aSB2ZcSHYSBvZCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgbWFuamEgb2QgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJWcmlqZWRub3N0IG1vcmEgYml0aSBkamVsaml2YSBzYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiVnJpamVkbm9zdCBuaWplIGJyb2ouIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiTmVpc3ByYXZuYSBsb3ppbmthIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiVGVsZWZvbiBuaWplIGlzcHJhdmFuLCBucHI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJQb2dyZcWhYW4gdXpvcmFrIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiUG9samUgbW9yYSBpbWF0aSBuYW1qYW5qZSB7MH0gem5ha292YSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJQb2xqZSBtb3JhIGltYXRpIG5hanZpxaFlIHswfSB6bmFrb3ZhIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBpdGFsaWFuIC0gaXRhbHkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJpdF9JVCI6IHsKCQkJCXJlcXVpcmVkOiAiUXVlc3RvIGNhbXBvIMOoIG9iYmxpZ2F0b3JpbyIsCgkJCQlpbnZhbGlkOiAiUXVlc3RvIGNhbXBvIMOoIGludmFsaWRvIiwKCQkJCW1vbnRoczogWyJHZW5uYWlvIiwgIkZlYmJyYWlvIiwgIk1hcnpvIiwgIkFwcmlsZSIsICJNYWdnaW8iLCAiR2l1Z25vIiwgIkx1Z2xpbyIsICJBZ29zdG8iLCAiU2V0dGVtYnJlIiwgIk90dG9icmUiLCAiTm92ZW1icmUiLCAiRGljZW1icmUiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNlY29uZGkiLAoJCQkJCU1JTlVURTogIm1pbnV0aSIsCgkJCQkJSE9VUjogIm9yZSIsCgkJCQkJREFZOiAiZ2lvcm5pIiwKCQkJCQlNT05USDogIm1lc2kiLAoJCQkJCVlFQVI6ICJhbm5pIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJRdWVzdG8gY2FtcG8gbm9uIMOoIG9wemlvbmFsZSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gc29ubyB2YWxvcmkgaW52YWxpZGkiLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJRdWVzdG8gY2FtcG8gZGV2ZSBhdmVyZSB1bm8gZGVpIHNlZ3VlbnRpIHZhbG9yaSB7MH0gKHZhbG9yZSBhdHR1YWxlOiB7MX0pIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJJbCBudW1lcm8gbWluaW1vIGRpIGVsZW1lbnRpIHJpY2hpZXN0aSDDqCB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJJbCBudW1lcm8gbWFzc2ltbyBkaSBlbGVtZW50aSBhbW1lc3NpIMOoIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiSSB2YWxvcmkgbm9uIHNvbm8gdW5pdm9jaSIsCgkJCQkibm90QW5BcnJheSI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCBkaSB0aXBvIGFycmF5IiwKCQkJCSJpbnZhbGlkRGF0ZSI6ICJEYXRhIGludmFsaWRhIHBlciBpbCBmb3JtYXRvIHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkluZGlyaXp6byBlbWFpbCBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8gaW50ZXJvIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJJbmRpcml6em8gSVB2NCBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiSWwgdmFsb3JlIG1pbmltbyBwZXIgcXVlc3RvIGNhbXBvIMOoIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJJbCB2YWxvcmUgbWFzc2ltbyBwZXIgcXVlc3RvIGNhbXBvIMOoIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIG1hZ2dpb3JlIGRpIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIG1pbm9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIklsIHZhbG9yZSBkaSBxdWVzdG8gY2FtcG8gZGV2ZSBlc3NlcmUgZGl2aXNpYmlsZSBwZXIgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlF1ZXN0byB2YWxvcmUgbm9uIMOoIHVuIG51bWVybyIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIlBhc3N3b3JkIGludmFsaWRhIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiTnVtZXJvIGRpIHRlbGVmb25vIGludmFsaWRvLCBzaSBhdHRlbmRvbm8gdmFsb3JpIGRlbCB0aXBvOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgbGEgc2VndWVudGUgc3RydXR0dXJhOiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlF1ZXN0byBjYW1wbyBub24gZGV2ZSBjb250ZW5lcmUgbWVubyBkaSB7MH0gY2FyYXR0ZXJpIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIlF1ZXN0byBjYW1wbyBub24gZGV2ZSBjb250ZW5lcmUgcGnDuSBkaSB7MH0gY2FyYXR0ZXJpIiwKCQkJCSJub25lTGFiZWwiOiAiTmVzc3VubyIsCgkJCQkiYWRkSXRlbUJ1dHRvbkxhYmVsIjogIkFnZ2l1bmdpIiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmltdW92aSIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJTdSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkdpw7kiCgkJCX0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGphcGFuZXNlIC0gamFwYW4KCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyAoewogICAgICAgICJpZCI6ICJiYXNlIiwKICAgICAgICAibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJqYV9KUCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAi44GT44Gu6aCF55uu44Gv5b+F6aCI44Gn44GZIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICLjgZPjga7poIXnm67jga/mraPjgZfjgYTlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIjHmnIgiLCAiMuaciCIsICIz5pyIIiwgIjTmnIgiLCAiNeaciCIsICI25pyIIiwgIjfmnIgiLCAiOOaciCIsICI55pyIIiwgIjEw5pyIIiwgIjEx5pyIIiwgIjEy5pyIIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICLnp5IiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIuWIhiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIuaZgiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAi5pelIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIuaciCIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIuW5tCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAi44GT44Gu6aCF55uu44Gv5Lu75oSP44Gu5Zue562U6aCF55uu44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSDjga/npoHmraLjgZXjgozjgabjgYTjgovlgKTjgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruS4reOBi+OCiemBuOOBsOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAguePvuWcqOOBruWApOOBryB7MX0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4iuW/heimgeOBp+OBmSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIumgheebruaVsOOBryB7MH0g5Lul5LiL44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICLlgKTjgYzkuIDmhI/jgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM6YWN5YiX44Gn44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIuOBk+OBrumgheebruOBruacgOWwj+WApOOBryB7MH0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIuOBk+OBrumgheebruOBruacgOWkp+WApOOBryB7MH0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIuOBk+OBrumgheebruOBruWApOOBryB7MH0g44KI44KK5bCP44GV44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIuOBk+OBrumgheebruOBruWApOOBryB7MH0g44KI44KK5aSn44GN44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLlgKTjga8gezB9IOOBq+OCiOOBo+OBpuWJsuOCiuWIh+OCjOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbDlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICLlgKTjgYwgezB9IOOBruWAjeaVsOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIuOBk+OBrumgheebruOBruWApOOBjOaVtOaVsOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QUpTT04iOiAi5YCk44GM5q2j44GX44GEIEpTT04g5b2i5byP44Gu5paH5a2X5YiX44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICLjgZPjga7poIXnm67jga8gezB9IOaWh+Wtl+S7peS4iuW/heimgeOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLjgZPjga7poIXnm67jga8gezB9IOaWh+Wtl+S7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFRpbWUiOiAi5pmC6ZaT44GM5q2j44GX44GP44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICLml6Xku5jjgYwgezB9IOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIuODoeODvOODq+OCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCBpbmZvQGNsb3VkY21zLmNvbSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIklQdjQg44Ki44OJ44Os44K544GM5q2j44GX44GP44GC44KK44G+44Gb44KT44CC5L6L44GI44GwIDE5Mi4xNjguMC4xIOOBruOCiOOBhuOBquW9ouW8j+OBp+OBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIuODkeOCueODr+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIumbu+ipseeVquWPt+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAoMTIzKSA0NTYtOTk5OSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIuOBk+OBrumgheebruOBryB7MH0g44Gu44OR44K/44O844Oz44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlVSTCDjgYzmraPjgZfjgYTlvaLlvI/jgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImtleU1pc3NpbmciOiAi5Zyw5Zuz44GM56m644Gu44Kt44O844KS5ZCr44KT44Gn44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJrZXlOb3RVbmlxdWUiOiAi5Zyw5Zuz44Gu44Kt44O844GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJPYmplY3R0b29GZXdQcm9wZXJ0aWVzIjogIuODl+ODreODkeODhuOCo+OBjOi2s+OCiuOBvuOBm+OCkyAoezB9IOOBjOW/heimgeOBp+OBmSkiLAogICAgICAgICAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIuODl+ODreODkeODhuOCoyAoezB9KSDjga7mnIDlpKfmlbDjgpLotoXjgYjjgabjgYTjgb7jgZkiLAogICAgICAgICAgICAgICAgIndvcmRMaW1pdEV4Y2VlZGVkIjogInswfSDjga7ljZjoqp7mlbDjga7liLbpmZDjgpLotoXjgYjjgabjgYTjgb7jgZkiLAogICAgICAgICAgICAgICAgImVkaXRvckFubm90YXRpb25zRXhpc3QiOiAi44Ko44OH44Kj44K/44GM5L+u5q2j44GZ44G544GN44Ko44Op44O844KS5aCx5ZGK44GX44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiOiAiNeahgeOBriBaaXBjb2RlICgjIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiOeahgeOBriBaaXBjb2RlICgjIyMjIy0jIyMjKSDjgafjga/jgYLjgorjgb7jgZvjgpMiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIG5vcndlZ2lhbiAtIG5vcndheQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgIm5iX05PIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJGZWx0ZXQgZXIgb2JsaWdhdG9yaXNrIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJWZXJkaWVuIGVyIHVneWxkaWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk1hcnMiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVzZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dHRlciIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlRpbWVyIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJEYWdlciIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNw6VuZWRlciIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIsOFciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGV0dGUgZmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZW5uZSB2ZXJkaWVuIGVyIGlra2UgdGlsbGF0dDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRmVsdGV0IG3DpSBpbm5laG9sZGUgZW4gYXYgZsO4bGdlbmRlIHZlcmRpZXI6IHswfS4gTsOldsOmcmVuZGUgdmVyZGkgZXI6IHsxfSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiRGV0IG1pbnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7hyc3RlIHRpbGxhdHRlIGFudGFsbGV0IGVsZW1lbnRlciBlciB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZlcmRpZW5lIGVyIGlra2UgdW5pa2UiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSWtrZSBlbiBsaXN0ZSBhdiB2ZXJkaWVyIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJVZ3lsZGlnIGRhdG9mb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIlVneWxkaWcgZS1wb3N0YWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZlcmRpZW4gZXIgaWtrZSBldCBoZWx0YWxsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVZ3lsZGlnIElQdjQtYWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEZW4gbWluc3RlIHRpbGxhdHRlIHZlcmRpZW4gZXIgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRlbiBzdMO4cnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWZXJkaWVuIG3DpSB2w6ZyZSBzdMO4cnJlIGVubiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgbWluZHJlIGVubiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRhbGxldCBtw6UgdsOmcmUgZGVsYmFydCBtZWQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlZlcmRpZW4gZXIgaWtrZSBldCB0YWxsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVWd5bGRpZyBwYXNzb3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVWd5bGRpZyB0ZWxlZm9ubnVtbWVyIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJGZWx0ZXQgbcOlIHbDpnJlIGkgZsO4bGdlbmRlIGZvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJEZXR0ZSBmZWx0ZXQgbcOlIG1pbnN0IGlubmVob2xkZSB7MH0gdGVnbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0ZSBmZWx0ZXQga2FuIG1ha3MgaW5uZWhvbGRlIHswfSB0ZWduIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBkdXRjaCAtIGJlbGdpdW0KCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJubF9CRSI6IHsKCQkJCXJlcXVpcmVkOiAiRGl0IHZlbGQgaXMgdmVycGxpY2h0IiwKCQkJCWludmFsaWQ6ICJEaXQgdmVsZCBpcyBvbmdlbGRpZyIsCgkJCQltb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYWFydCIsICJBcHJpbCIsICJNZWkiLCAiSnVuaSIsICJKdWx5IiwgIkF1Z3VzdHVzIiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlbiIsCgkJCQkJTUlOVVRFOiAibWludXRlbiIsCgkJCQkJSE9VUjogInVyZW4iLAoJCQkJCURBWTogImRhZ2VuIiwKCQkJCQlNT05USDogIm1hYW5kZW4iLAoJCQkJCVlFQVI6ICJqYXJlbiIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRGl0IHZlbGQgaXMgbmlldCBvcHRpb25lZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB6aWpuIHZlcmJvZGVuIHdhYXJkZW4uIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGl0IHZlbGQgbW9ldCDDqcOpbiB2YW4gdm9sZ2VuZGUgYmV2YXR0ZW4gOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJIZXQgbWluaW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkhldCBtYXhpbXVtIGFhbnRhbCBlbGVtZW50ZW4gaXMgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJEZSB3YWFyZGVuIHppam4gdW5pZWsiLAoJCQkJIm5vdEFuQXJyYXkiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBsaWpzdCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGUgZGF0dW0ga29tdCBuaWV0IG92ZXJlZW4gbWV0IGZvcm1hYXQgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiT25nZWxkaWcgZS1tYWlsYWRyZXMsIHZiLjogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdlaGVlbCBnZXRhbC4iLAoJCQkJImludmFsaWRJUHY0IjogIk9uZ2VsZGlnIElQdjQgYWRyZXMsIHZiLjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGUgbWluaW1hbGUgd2FhcmRlIHZvb3IgZGl0IHZlbGQgaXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRlIG1heGltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBncm90ZXIgemlqbiBkYW4gezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIkRlIHdhYXJkZSBtb2V0IGtsZWluZXIgemlqbiBkYW4gezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJEZSB3YWFyZGUgbW9ldCBkZWVsYmFhciB6aWpuIGRvb3IgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIkRlemUgd2FhcmRlIGlzIGdlZW4gZ2V0YWwuIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiT25nZWxkaWcgd2FjaHR3b29yZCIsCgkJCQkiaW52YWxpZFBob25lIjogIk9uZ2VsZGlnIHRlbGVmb29ubnVtbWVyLCB2YjogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkRpdCB2ZWxkIG1vZXQgb3ZlcmVlbmtvbWVuIG1ldCBwYXRyb29uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGl0IHZlbGQgbW9ldCBtaW5zdGVucyB7MH0gdGVrZW5zIGJldmF0dGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpdCB2ZWxkIG1vZXQgbWluZGVyIGRhbiB7MH0gdGVrZW5zIGJldmF0dGVuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBwb2xpc2ggLSBwb2xhbmQKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyAoewogICAgICAgICJpZCI6ICJiYXNlIiwKICAgICAgICAibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJwbF9QTCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiVG8gcG9sZSBqZXN0IHd5bWFnYW5lIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJUbyBwb2xlIGplc3QgbmllcHJhd2lkxYJvd2UiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlN0eWN6ZcWEIiwgIkx1dHkiLCAiTWFyemVjIiwgIkt3aWVjaWXFhCIsICJNYWoiLCAiQ3plcndpZWMiLCAiTGlwaWVjIiwgIlNpZXJwaWXFhCIsICJXcnplc2llxYQiLCAiUGHFumR6aWVybmlrIiwgIkxpc3RvcGFkIiwgIkdydWR6aWXFhCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5keSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXR5IiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiZ29kemlueSIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiZG5pIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1pZXNpxIVjZSIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogImxhdGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlRvIHBvbGUgbmllIGplc3Qgb3Bjam9uYWxuZSIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgZG96d29sb25hOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGplZG7EhSB6IG5hc3TEmXB1asSFY3ljaCB3YXJ0b8WbY2k6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltYWxuYSBsaWN6YmEgZWxlbWVudMOzdyB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiTWFrc3ltYWxuYSBsaWN6YmEgZWxlbWVudMOzdyB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJUZSB3YXJ0b8WbY2kgbmllIHPEhSB1bmlrYWxuZSIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgdGFibGljxIUiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIk5pZXBvcHJhd255IGZvcm1hdCBkYXR5OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJOaWVwb3ByYXdueSBhZHJlcyBlbWFpbCwgbi5wLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgbGljemLEhSBjYcWCa293aXTEhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiTmllcG9wcmF3bnkgYWRyZXMgSVB2NCwgbi5wLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiTWluaW1hbG5hIHdhcnRvxZvEhyBkbGEgdGVnbyBwb2xhIHd5bm9zaSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTWFrc3ltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIldhcnRvxZvEhyBkbGEgdGVnbyBwb2xhIG11c2kgYnnEhyB3acSZa3N6YSBuacW8IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgbW5pZWpzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIldhcnRvxZvEhyBtdXNpIGJ5xIcgcG9kemllbG5hIHByemV6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJXYXJ0b8WbxIcgbmllIGplc3QgbGljemLEhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIk5pZXBvcHJhd25lIGhhc8WCbyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk5pZXBvcHJhd255IG51bWVyIHRlbGVmb251LCBuLnAuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiVG8gcG9sZSBwb3dpbm5vIG1pZcSHIGZvcm1hdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgY28gbmFqbW5pZWogezB9IHpuYWvDs3ciLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBuYWp3ecW8ZWogezB9IHpuYWvDs3ciCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9ydHVndWVzZSAtIHBvcnR1Z2FsCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicHRfQlIiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkVzdGUgY2FtcG8gw6kgb2JyaWdhdMOzcmlvIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJFc3RlIGNhbXBvIMOpIGludsOhbGlkbyIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFuZWlybyIsICJGZXZlcmVpcm8iLCAiTWFyw6dvIiwgIkFicmlsIiwgIk1haW8iLCAiSnVuaG8iLCAiSnVsaG8iLCAiQWdvc3RvIiwgIlNldGVtYnJvIiwgIk91dHVicm8iLCAiTm92ZW1icm8iLCAiRGV6ZW1icm8iXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNlZ3VuZG9zIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dG9zIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiaG9yYXMiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRpYXMiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAibWVzZXMiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJhbm9zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJFc3RlIGNhbXBvIG7Do28gw6kgb3BjaW9uYWwiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IHPDo28gdmFsb3JlcyBwcm9pYmlkb3MiLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJFc3RlIGNhbXBvIGRldmUgdGVyIHVtIGRvcyBzZWd1aW50ZXMgdmFsb3JlczogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiTyBuw7ptZXJvIG3DrW5pbW8gZGUgZWxlbWVudG9zIMOpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk8gbsO6bWVybyBtw6F4aW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIk9zIHZhbG9yZXMgbsOjbyBzw6NvIMO6bmljb3MiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiRXN0ZSB2YWxvciBuw6NvIMOpIHVtYSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRXN0YSBkYXRhIG7Do28gdGVtIG8gZm9ybWF0byB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJFbmRlcmXDp28gZGUgZS1tYWlsIGludsOhbGlkbyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bSBuw7ptZXJvIGludGVpcm8iLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIkVuZGVyZcOnbyBJUHY0IGludsOhbGlkbywgZXg6IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk8gdmFsb3IgbcOtbmltbyBwYXJhIGVzdGUgY2FtcG8gw6kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk8gdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gw6kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIk8gdmFsb3IgZGVzdGUgY2FtcG8gZGV2ZSBzZXIgbWFpb3IgcXVlIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1lbm9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIk8gdmFsb3IgZGV2ZSBzZXIgZGl2aXPDrXZlbCBwb3IgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bSBuw7ptZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiU2VuaGEgaW52w6FsaWRhIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiTsO6bWVybyBkZSB0ZWxlZm9uZSBpbnbDoWxpZG8sIGV4OiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciBvIHBhZHLDo28gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJFc3RlIGNhbXBvIGRldmUgaW5jbHVpciBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkVzdGUgY2FtcG8gcG9kZSBpbmNsdWlyIG5vIG3DoXhpbW8gezB9IGNhcmFjdGVyZXMiLAoJCSJ0aHVtYm5haWwiOiAiTWluaWF0dXJhIiwKICAgICAgICAJImZpbGVuYW1lIjogIkFycXVpdm8iLAogICAgICAgIAkiZmlsZVNpemUiOiAiVGFtYW5obyhieXRlcykiLAogICAgICAgIAkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQ29tYW5kb3MiLAogICAgICAgIAkiY2hvb3NlRmlsZSI6ICJFc2NvbGhlciBhcnF1aXZvLi4uIiwKICAgICAgICAJImNob29zZUZpbGVzIjogIkVzY29saGVyIGFycXVpdm9zLi4uIiwKICAgICAgICAJImRyb3Bab25lU2luZ2xlIjogIkNsaXF1ZSBlbSBFc2NvbGhlciBvdSBhcnJhc3RlIHVtIGFycXVpdm8gYXF1aS4uLiIsCiAgICAgICAgCSJkcm9wWm9uZU11bHRpcGxlIjogIkNsaXF1ZSBlbSBFc2NvbGhlciBvdSBhcnJhc3RlIGFycXVpdm9zIGFxdWkuLi4iLAoJCSJmaWxlVG9vQmlnIjogIkFycXVpdm8gbXVpdG8gZ3JhbmRlOiAiLAogICAgICAgICJub25TZWxlY3RlZFRleHQiOiAiLSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gc3dlZGlzaCAtIHN3ZWRlbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInN2X1NFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJGw6RsdGV0IMOkciBvYmxpZ2F0b3Jpc2t0IiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJWw6RyZGV0IMOkciBmZWxha3RpZ3QiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFycyIsICJBcHJpbCIsICJNYWoiLCAiSnVuaSIsICJKdWxpIiwgIkF1Z3VzdGkiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dGVyIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAidGltbWFyIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkYWdhciIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtw6VuYWRlciIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIsOlciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGV0dGEgZsOkbHQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVzc2EgdsOkcmRlbiDDpHIgaW50ZSB0aWxsw6V0bmE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkbDpGx0ZXQgbcOlc3RlIGlubmVow6VsbGEgZXR0IGF2IGbDtmxqYW5kZSB2w6RyZGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEZXQgbWluc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO2cnN0YSB0aWxsw6V0bmEgYW50YWxldCBlbGVtZW50IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlbDpHJkZW5hIMOkciBpbnRlIHVuaWthIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkludGUgZW4gbGlzdGEgYXYgdsOkcmRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmVsYWt0aWd0IGZvcm1hdCBmw7ZyIGRhdHVtOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJPZ2lsdGlnIGUtcG9zdGFkcmVzcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIlbDpHJkZXQgw6RyIGludGUgZXR0IGhlbHRhbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiT2dpbHRpZyBJUHY0LWFkcmVzcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEZXQgbWluc3RhIHRpbGzDpXRuYSB2w6RyZGV0IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSB2w6RyZGV0IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVsOkcmRldCBtw6VzdGUgdmFyYSBzdMO2cnJlIMOkbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVsOkcmRldCBtw6VzdGUgdmFyYSBtaW5kcmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAiVGFsZXQgbcOlc3RlIHZhcmEgZGVsYmFydCBtZWQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlbDpHJkZXQgw6RyIGludGUgZXR0IHRhbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIk9naWx0aWd0IGzDtnNlbm9yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk9naWx0aWd0IHRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkbDpGx0ZXQgbcOlc3RlIHZhcmEgaSBmw7ZsamFuZGUgZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRldHRhIGbDpGx0IG3DpXN0ZSBpbm5laMOlbGxhIG1pbnN0IHswfSB0ZWNrZW4iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGEgZsOkbHQgZsOlciBpbm5laMOlbGxhIGjDtmdzdCB7MH0gdGVja2VuIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBjaGluZXNlIC0gY2hpbmEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJ6aF9DTiI6IHsKCQkJCXJlcXVpcmVkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjQ1MTc7JiMzOTAzNTsiLAoJCQkJaW52YWxpZDogIiYjMjc0OTI7JiMyMjQ5NTsmIzE5OTgxOyYjMjE1MTI7JiMyNjY4NDsiLAoJCQkJbW9udGhzOiBbIiYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMDEwODsmIzI2Mzc2OyIsICImIzE5OTc3OyYjMjYzNzY7IiwgIiYjMjIyMzU7JiMyNjM3NjsiLCAiJiMyMDExNjsmIzI2Mzc2OyIsICImIzIwODQ1OyYjMjYzNzY7IiwgIiYjMTk5NzE7JiMyNjM3NjsiLCAiJiMyMDg0MzsmIzI2Mzc2OyIsICImIzIwMDYxOyYjMjYzNzY7IiwgIiYjMjEzMTM7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzE5OTY4OyYjMjYzNzY7IiwgIiYjMjEzMTM7JiMyMDEwODsmIzI2Mzc2OyJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAiJiMzMTE4NjsiLAoJCQkJCU1JTlVURTogIiYjMjA5OTg7IiwKCQkJCQlIT1VSOiAiJiMyNjEwMjsiLAoJCQkJCURBWTogIiYjMjYwODU7IiwKCQkJCQlNT05USDogIiYjMjYzNzY7IiwKCQkJCQlZRUFSOiAiJiMyNDE4MDsiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM4NzUwOyYjMjAyMTk7JiMzNjg3MzsiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzY3NTU7JiMyMDgzNzsmIzIxMjUzOyYjMjUzMjQ7IHswfS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICImIzIwODAxOyYjMzU3Njg7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiJiMyNjM2ODsmIzIzNTY3OyYjMjAwMTA7JiMyNTk2ODsgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjAwMTA7JiMyNTk2ODsgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICImIzM2NzU1OyYjMjA4Mzc7JiMyMDU0MDsmIzE5OTgxOyYjMjk0MjA7JiMyOTMwNTsiLAoJCQkJIm5vdEFuQXJyYXkiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjU5Njg7JiMzMjQ1MjsiLAoJCQkJImludmFsaWREYXRlIjogIiYjMjYwODU7JiMyNjM5OTsmIzI2Njg0OyYjMjQzMzU7JiMyMjI0MDsmIzM1ODEzOyYjMjYxNTk7IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIiYjMjAyMzQ7JiMyMjk2OTsmIzIwNzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzE5OTgxOyYjMjM1NDU7LCBleDogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk3MjsmIzI1OTY4Oy4iLAoJCQkJImludmFsaWRJUHY0IjogIiYjMTk5ODE7JiMyNjE1OTsmIzIxNTEyOyYjMjc4NjE7SVAmIzIyMzIwOyYjMjIzMzY7LCBleDogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiJiMyNjM2ODsmIzIzNTY3OyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIiYjMjYzNjg7JiMyMjgyMzsmIzIwNTQwOyYjMjYxNTk7IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzIyODIzOyYjMjAxMTA7IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzIzNTY3OyYjMjAxMTA7IHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiJiMyMDU0MDsmIzI0NTE3OyYjMzkwMzU7JiMzMzAyMTsmIzM0OTg3OyB7MH0gJiMyNTk3MjsmIzM4NTAwOyIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzIzMzgzOy4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICImIzM4NzUwOyYjMjc4NjE7JiMyMzQ5NDsmIzMwNzIxOyIsCgkJCQkiaW52YWxpZFBob25lIjogIiYjMzg3NTA7JiMyNzg2MTsmIzMwMDA1OyYjMzU4MDU7JiMyMTQ5NTsmIzMwNzIxOywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICImIzI3NDkyOyYjMjI0OTU7JiMzOTAzNTsmIzI2Mzc3OyYjMjY2ODQ7JiMyNDMzNTsgezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICImIzI3NDkyOyYjMjI0OTU7JiMzMzI2NzsmIzIzNTY5OyYjMzgyNzE7JiMyNDIzMDsgezB9IiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzI2MzY4OyYjMjI4MTA7JiMzODI3MTsmIzI0MjMwOyB7MH0iCgkJCX0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CgovKioKICogV2ViIFRoZW1lICgid2ViIikKICoKICogRGVmaW5lcyB0aGUgZGVmYXVsdCB3ZWIgdGhlbWUgZm9yIHB1cmUgSFRNTDUgZm9ybXMuCiAqCiAqIFRoZSB2aWV3cyBhcmU6CiAqCiAqICAgIHdlYi12aWV3CiAqICAgIHdlYi1lZGl0CiAqICAgIHdlYi1jcmVhdGUKICoKICogVGhpcyB0aGVtZSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgdmlldzoKICoKICogICAgewogKiAgICAgICAidWkiOiAid2ViIiwKICogICAgICAgInR5cGUiOiBudWxsIHwgInZpZXciIHwgImVkaXQiIHwgImNyZWF0ZSIKICogICAgfQogKgogKi8KCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbmplY3RvciAoIndlYiIpLgogICAgICoKICAgICAqIFRoZSBob29rcyBwcm92aWRlZCBoZXJlIGFyZSBlbXB0eS4gIFRoZSB3ZWIgdmlldyBmYWxscyBiYWNrIG9uIHN0cmFpZ2h0IEhUTUw1IGZvciBwcmV0dHkgbXVjaCBldmVyeXRoaW5nLgogICAgICogQXMgc3VjaCwgdGhlc2UgbW9zdGx5IHNlcnZlIGFzIGEgcmVmZXJlbmNlIGZvciBleHRlbnNpb24uCiAgICAgKi8KICAgIHZhciBjYWxsYmFja3MgPSB7fTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgZmllbGQgcmVuZGVycwogICAgY2FsbGJhY2tzWyJmaWVsZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udHJvbCByZW5kZXJzCiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyBhZnRlciBhIGNvbnRhaW5lciByZW5kZXJzCiAgICBjYWxsYmFja3NbImNvbnRhaW5lciJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgZm9ybSByZW5kZXJzCiAgICBjYWxsYmFja3NbImZvcm0iXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIHJlcXVpcmVkCiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyBvcHRpb25hbAogICAgY2FsbGJhY2tzWyJvcHRpb25hbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVhZG9ubHkKICAgIGNhbGxiYWNrc1sicmVhZG9ubHkiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyBlbmFibGVkCiAgICBjYWxsYmFja3NbImVuYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBjYWxsZWQgd2hlbiB2YWxpZGl0eSBzdGF0ZSBmb3IgYSBmaWVsZCBpcyBiZWluZyBjbGVhcmVkCiAgICBjYWxsYmFja3NbImNsZWFyVmFsaWRpdHkiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGludmFsaWQKICAgIGNhbGxiYWNrc1siaW52YWxpZCJdID0gZnVuY3Rpb24oaGlkZGVuKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYSB2YWxpZAogICAgY2FsbGJhY2tzWyJ2YWxpZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBhIG1lc3NhZ2UgdG8gYW4gaW52YWxpZCBmaWVsZAogICAgY2FsbGJhY2tzWyJhZGRNZXNzYWdlIl0gPSBmdW5jdGlvbihpbmRleCwgbWVzc2FnZUlkLCBtZXNzYWdlVGV4dCwgaGlkZGVuKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHRvIHJlbW92ZSBhbGwgbWVzc2FnZXMgZm9yIGEgZmllbGQKICAgIGNhbGxiYWNrc1sicmVtb3ZlTWVzc2FnZXMiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlQnV0dG9uIl0gPSBmdW5jdGlvbihidXR0b24pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgd2hlbiBhIGJ1dHRvbiBpcyBiZWluZyBkaXNhYmxlZAogICAgY2FsbGJhY2tzWyJkaXNhYmxlQnV0dG9uIl0gPSBmdW5jdGlvbihidXR0b24pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIG9yIHJlbW92ZSB0aGUgYXJyYXkgdG9vbGJhciBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJhcnJheVRvb2xiYXIiXSA9IGZ1bmN0aW9uKHJlbW92ZSkKICAgIHsKICAgICAgICAvLyBOT1RFOiB0aGlzID0gYXJyYXkgZmllbGQKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3dhcCBleGlzdGluZyB0b29sYmFyIHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgZXhpc3RpbmdUb29sYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS10b29sYmFyW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVG9vbGJhci5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX1RPT0xCQVJfRklFTERfSUQgKyAiPSciICsgc2VsZi5nZXRJZCgpICsgIic+PC9kaXY+Iik7CgoJCQkJaWYgKHNlbGYub3B0aW9ucy50b29sYmFyUG9zaXRpb24gJiYgc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiA9PT0gImJvdHRvbSIpIHsKCQkJCQl2YXIgY29udGFpbmVyTGFzdEl0ZW0gPSAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwoJCQkJCWlmIChjb250YWluZXJMYXN0SXRlbS5sZW5ndGggPiAwKXsKCQkJCQkJY29udGFpbmVyTGFzdEl0ZW0uYWZ0ZXIoaW5zZXJ0aW9uUG9pbnRFbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWV4aXN0aW5nVG9vbGJhci5iZWZvcmUoaW5zZXJ0aW9uUG9pbnRFbCk7CgkJCQl9CgkJCQlleGlzdGluZ1Rvb2xiYXIucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gZmluZCB0aGUgdGhlIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRvb2xiYXIKICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItYXJyYXktdG9vbGJhciIsIHNlbGYpOwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9vbGJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyI6IHNlbGYudG9vbGJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMudG9vbGJhclN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAidG9vbGJhclBvc2l0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUodG9vbGJhcik7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSBhY3Rpb25iYXJzIGFsbCBjaGlsZHJlbiBvZiBhbiBhcnJheSBmaWVsZAogICAgY2FsbGJhY2tzWyJhcnJheUFjdGlvbmJhcnMiXSA9IGZ1bmN0aW9uKHJlbW92ZSkKICAgIHsKICAgICAgICAvLyBOT1RFOiB0aGlzID0gYXJyYXkgZmllbGQKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAvLyB3YWxrIG92ZXIgYWxsIGNoaWxkcmVuCiAgICAgICAgZm9yICh2YXIgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2NoaWxkSW5kZXhdOwogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZElkID0gY2hpbGRGaWVsZC5nZXRJZCgpOwoKICAgICAgICAgICAgaWYgKHJlbW92ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgZXhpc3RpbmcgYWN0aW9uIGJhciBmb3IgdGhpcyBjaGlsZAogICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBvbmUsIHJlbW92ZSBpdCBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0FjdGlvbmJhciA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD0nIiArIGNoaWxkRmllbGRJZCArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKCI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgY2hpbGRGaWVsZC5uYW1lICsgIic+PC9kaXY+Iik7CgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbmJhci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZpbmQgb25lLCBiaW5kIGluIHRoZSBhY3Rpb24gdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgY2hpbGRGaWVsZC5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItYXJyYXktYWN0aW9uYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXIgPSBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2hpbGRGaWVsZC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRJZCI6IGNoaWxkRmllbGQuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtSW5kZXgiOiBjaGlsZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhclN0eWxlIjogc2VsZi5vcHRpb25zLmFjdGlvbmJhclN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoYWN0aW9uYmFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgLy8gZmlyZWQgYWZ0ZXIgYSB0ZXh0IGZpZWxkIGlzIGRlZW1lZCB0byBiZSBhdXRvY29tcGxldGUtYWJsZQogICAgY2FsbGJhY2tzWyJhdXRvY29tcGxldGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CgoKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiIjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJhZGRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZXhwYW5kZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbInRhYmxlIl0gPSAiIjsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJwYXJlbnQiOiAiYmFzZSIsCiAgICAgICAgInR5cGUiOiAiZGlzcGxheSIsCiAgICAgICAgInVpIjogIndlYiIsCiAgICAgICAgInRpdGxlIjogIkRlZmF1bHQgSFRNTDUgZGlzcGxheSB2aWV3IiwKICAgICAgICAiZGlzcGxheVJlYWRvbmx5IjogdHJ1ZSwKICAgICAgICAidGVtcGxhdGVzIjoge30sCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJob3Jpem9udGFsIjogZmFsc2UKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBlZGl0IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWVkaXQiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgInRpdGxlIjogIkRlZmF1bHQgSFRNTDUgY3JlYXRlIHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiBmYWxzZSwKICAgICAgICAidGVtcGxhdGVzIjoge30sCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1jcmVhdGUtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItY3JlYXRlIiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBUd2l0dGVyIEJvb3RzdHJhcCBUaGVtZSAoImJvb3RzdHJhcCIpCiAqCiAqIERlZmluZXMgdGhlIEFscGFjYSB0aGVtZSBmb3IgVHdpdHRlciBCb290c3RyYXAgdjMuCiAqCiAqIFRoZSB2aWV3cyBhcmU6CiAqCiAqICAgIGJvb3RzdHJhcC12aWV3CiAqICAgIGJvb3RzdHJhcC1lZGl0CiAqICAgIGJvb3RzdHJhcC1jcmVhdGUKICoKICogVGhpcyB0aGVtZSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgdmlldzoKICoKICogICAgewogKiAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICogICAgICAgInR5cGUiOiAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvLyBjdXN0b20gc3R5bGVzCiAgICB2YXIgc3R5bGVzID0ge307CiAgICBzdHlsZXNbImJ1dHRvbiJdID0gImJ0biBidG4tZGVmYXVsdCI7CiAgICBzdHlsZXNbInNtYWxsQnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLXBsdXMtc2lnbiI7CiAgICBzdHlsZXNbInJlbW92ZUljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLW1pbnVzLXNpZ24iOwogICAgc3R5bGVzWyJ1cEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tdXAiOwogICAgc3R5bGVzWyJkb3duSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duIjsKICAgIHN0eWxlc1siZXhwYW5kZWRJY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93biI7CiAgICBzdHlsZXNbImNvbGxhcHNlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1yaWdodCI7CiAgICBzdHlsZXNbInRhYmxlIl0gPSAidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI7CgogICAgLy8gY3VzdG9tIGNhbGxiYWNrcwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgY2FsbGJhY2tzWyJyZXF1aXJlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcyBnZXQgYSBsaXR0bGUgc3RhciBpbiB0aGVpciBsYWJlbAogICAgICAgIHZhciBsYWJlbCA9ICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKTsKICAgICAgICAkKCc8c3BhbiBjbGFzcz0iYWxwYWNhLWljb24tcmVxdWlyZWQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGFyIj48L3NwYW4+JykucHJlcGVuZFRvKGxhYmVsKTsKCiAgICB9OwogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGNvbnRyb2wgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udHJvbEZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmdldEZpZWxkRWwoKSkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udGFpbmVyIGZpZWxkLCBhZGQgY2xhc3MgImhhcy1lcnJvciIKICAgICAgICBpZiAodGhpcy5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmdldEZpZWxkRWwoKSkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgIH0KICAgICAgICAqLwoKICAgIH07CiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gdmFsaWQgZmllbGRzIHJlbW92ZSB0aGUgY2xhc3MgJ2hhcy1lcnJvcicKICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJyk7CiAgICB9OwogICAgY2FsbGJhY2tzWyJjb250cm9sIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gY29udHJvbHMgZ2V0IHNvbWUgc3BlY2lhbCBmb3JtYXR0aW5nCgogICAgICAgIC8vIGZpZWxkRWwKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwoKICAgICAgICAvLyBjb250cm9sRWwKICAgICAgICB2YXIgY29udHJvbEVsID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgLy8gYWxsIGNvbnRyb2xzIGdldCB0aGUgImZvcm0tY29udHJvbCIgY2xhc3MgaW5qZWN0ZWQKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikuYWRkQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgidGV4dGFyZWEiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJzZWxlY3QiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgLy8gZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9ZmlsZV0iKS5yZW1vdmVDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKCiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0eXBlID09IGNvbG9yLCByZW1vdmUgZm9ybS1jb250cm9sCiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAiY29sb3IiKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dCIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFueSBjaGVja2JveCBpbnB1dHMgZ2V0IHRoZSAiY2hlY2tib3giIGNsYXNzIG9uIHRoZWlyIGNoZWNrYm94CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCJjaGVja2JveCIpOwogICAgICAgIC8vIGFueSByYWRpbyBpbnB1dHMgZ2V0IHRoZSAicmFkaW8iIGNsYXNzIG9uIHRoZWlyIHJhZGlvCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpbyIpOwoKICAgICAgICAvLyBpZiBmb3JtIGhhcyAiZm9ybS1pbmxpbmUiIGNsYXNzLCB0aGVuIHJhZGlvIGFuZCBjaGVja2JveCBsYWJlbHMgZ2V0IGlubGluZSBjbGFzc2VzCiAgICAgICAgaWYgKCQoZmllbGRFbCkucGFyZW50cygiZm9ybSIpLmhhc0NsYXNzKCJmb3JtLWlubGluZSIpKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY2hlY2tib3hlcwogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94LWlubGluZSIpOwoKICAgICAgICAgICAgLy8gcmFkaW9zCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1yYWRpb10iKS5wYXJlbnQoKS5hZGRDbGFzcygicmFkaW8taW5saW5lIik7CiAgICAgICAgfQoKICAgICAgICAvLyBhbGwgY29udHJvbCBsYWJlbHMgZ2V0IGNsYXNzICJjb250cm9sLWxhYmVsIgogICAgICAgICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKS5hZGRDbGFzcygiY29udHJvbC1sYWJlbCIpOwoKICAgICAgICAvLyBpZiBpbiBob3Jpem9udGFsIG1vZGUsIGFkZCBhIHdyYXBwZXIgZGl2IChjb2wtc20tOSkgYW5kIGxhYmVsIGdldHMgKGNvbC1zbS0zKQogICAgICAgIGlmICh0aGlzLnZpZXcuaG9yaXpvbnRhbCkKICAgICAgICB7CiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKS5hZGRDbGFzcygiY29sLXNtLTMiKTsKCiAgICAgICAgICAgIC8vYWxpZ24gaGVscCB0ZXh0IHdpdGggaW5wdXQuCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiLmhlbHAtYmxvY2siKS5hZGRDbGFzcygiY29sLXNtLW9mZnNldC0zIGNvbC1zbS05Iik7CgogICAgICAgICAgICB2YXIgd3JhcHBlciA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2xhc3MoImNvbC1zbS05Iik7CgogICAgICAgICAgICAkKGNvbnRyb2xFbCkuYWZ0ZXIod3JhcHBlcik7CiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kKGNvbnRyb2xFbCk7CgogICAgICAgICAgICAkKGZpZWxkRWwpLmFwcGVuZCgiPGRpdiBzdHlsZT0nY2xlYXI6Ym90aDsnPjwvZGl2PiIpOwogICAgICAgIH0KICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRhaW5lciJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBjb250YWluZXJFbCA9IHRoaXMuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImZvcm0taG9yaXpvbnRhbCIpOwogICAgICAgIH0KICAgIH07CiAgICBjYWxsYmFja3NbImZvcm0iXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZm9ybUVsID0gdGhpcy5nZXRGb3JtRWwoKTsKCiAgICAgICAgLy8gdXNlIHB1bGwtcmlnaHQgZm9yIGZvcm0gYnV0dG9ucwogICAgICAgIC8vJChmb3JtRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b25zLWNvbnRhaW5lciIpLmFkZENsYXNzKCJwdWxsLXJpZ2h0Iik7CiAgICB9OwogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgICAgICAkKGJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgICAgICAkKGJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbGxhcHNpYmxlIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKICAgICAgICB2YXIgbGVnZW5kRWwgPSAkKGZpZWxkRWwpLmZpbmQoImxlZ2VuZCIpLmZpcnN0KCk7CiAgICAgICAgdmFyIGFuY2hvckVsID0gJCgiW2RhdGEtdG9nZ2xlPSdjb2xsYXBzZSddIiwgbGVnZW5kRWwpOwogICAgICAgIGlmICgkKGFuY2hvckVsKS5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICAgICAgLy8gY29udGFpbmVyIGlkCiAgICAgICAgICAgIHZhciBpZCA9ICQoY29udGFpbmVyRWwpLmF0dHIoImlkIik7CiAgICAgICAgICAgIGlmICghaWQpIHsKICAgICAgICAgICAgICAgIGlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmF0dHIoImlkIiwgaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgdXAgY29udGFpbmVyIHRvIGJlIGNvbGxhcHNpYmxlCiAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmFkZENsYXNzKCJjb2xsYXBzZSIpOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb2xsYXBzZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmFkZENsYXNzKCJpbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgdXAgbGVnZW5kIGFuY2hvcgogICAgICAgICAgICBpZiAoISQoYW5jaG9yRWwpLmF0dHIoImRhdGEtdGFyZ2V0IikpIHsKICAgICAgICAgICAgICAgICQoYW5jaG9yRWwpLmF0dHIoImRhdGEtdGFyZ2V0IiwgIiMiICsgaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKGFuY2hvckVsKS5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoImN1cnNvciIsICJwb2ludGVyIik7CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfTsKCiAgICAvLyB0YWJsZS1jb250cm9sIGNhbGxiYWNrcwogICAgY2FsbGJhY2tzWyJ0YWJsZUhlYWRlclJlcXVpcmVkIl0gPSBmdW5jdGlvbihzY2hlbWEsIG9wdGlvbnMsIGRvbUVsKQogICAgewogICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcyBnZXQgYSBsaXR0bGUgc3RhciBpbiB0aGVpciBsYWJlbAogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8oZG9tRWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyT3B0aW9uYWwiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInR5cGUiOiAiZGlzcGxheSIsCiAgICAgICAgInVpIjogImJvb3RzdHJhcCIsCiAgICAgICAgInRpdGxlIjogIkRpc3BsYXkgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAidGVtcGxhdGVzIjoge30KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZGlzcGxheS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZWRpdCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiZWRpdCIsCiAgICAgICAgInVpIjogImJvb3RzdHJhcCIsCiAgICAgICAgInRpdGxlIjogIkVkaXQgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAidGVtcGxhdGVzIjoge30KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZWRpdC1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtY3JlYXRlIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAidGl0bGUiOiAiQ3JlYXRlIFZpZXcgZm9yIEJvb3RzdHJhcCAzIiwKICAgICAgICAidHlwZSI6ICJjcmVhdGUiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJib290c3RyYXAtY3JlYXRlIiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCiAgICAgICAgCiAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0VmlldyA9ICdib290c3RyYXAnOwogICAgICAgIAogICAgICAgIHJldHVybiBBbHBhY2E7CgogICAgCgp9KSk7Cg==</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigndmFsJywgJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCQkJZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CQkJCgkJfSwgMjAwMCk7Cgl9CgkKCWNhcnJlZ2FDdXN0b21Qcm9wcyhhY3RpdmVRdWV1ZSk7Cn07CgoKdmFyIHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYyA9IGZ1bmN0aW9uKGZvcm0pIHsKCWZvcm1PcHRpb25zID0gZm9ybS5vcHRpb25zLmZpZWxkczsKCWZvcm1BbHBhY2EgPSBmb3JtOwoJCglpZiAoZm9ybSkgewoJCSQoJy5zZWxlY3RwaWNrZXInKS5zZWxlY3RwaWNrZXIoKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.15</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.15">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-07-26 10:16:08</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbD4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQkJPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9Ii9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBhdXRoZW50aWNhdGUiKSB8IGh0bWwgJV08L0E+ClslIFJlbmRlckJsb2NrRW5kKCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCQkKCTwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD0iZm9ybVBhbmVsIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgVHJhbnNsYXRlKCJQbGVhc2UgZmlsbCB0aGUgZm9sbG93aW5nIGZvcm0gdG8gb3BlbiB5b3VyIHRpY2tldCIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CgoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSIgaWQ9ImZvcm1UaWNrZXQiPgoJCgk8L2Rpdj4KPC9kaXY+CiAKIDxzY3JpcHQgc3JjPSJbJSBDb25maWcoIkZyb250ZW5kOjpSaWNoVGV4dFBhdGgiKSAlXWNrZWRpdG9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCgkkLmFscGFjYS5zZXREZWZhdWx0TG9jYWxlKChuYXZpZ2F0b3IubGFuZ3VhZ2VzID8gbmF2aWdhdG9yLmxhbmd1YWdlc1swXSA6IChuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkpLnJlcGxhY2UoIi0iLCJfIikpOwoJCQkKCSQuYWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewoJCSJub25lTGFiZWwiOiAiLSIsCgl9KTsKCQoJJCgiI1NlcnZpY2VJRCIpLmNoYW5nZShmdW5jdGlvbigpIHsKCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CgkgICAJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsKICAgCQl9IGVsc2UgewogICAJCQlkZXN0cnVpckZvcm0oKTsKICAgCQkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoIiIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuaGlkZSgpOwogICAJCX0gIAkKICAJfSk7CiAgCQogICAJaWYgKCQoIiNTZXJ2aWNlSUQiKS5oYXMoJ1tzZWxlY3RlZF0nKSkgewogIAkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewogIAkJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iLCAiWyUgRGF0YS5Gb3JtSUQgJV0iKTsKICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOyAgCQkJICAJCQkKICAJCX0KICAJfQogIAkKICAJJCgiI1Jlc3BvbnNpdmVGb290ZXIiKS5yZW1vdmUoKTsKPC9zY3JpcHQ+ICAgIApbJSBFTkQgJV0=</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KICAJCQk8YSAgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgaHJlZj0iL290cnMvWyUgRGF0YS5Nb2R1bGUgJV0ucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFslIERhdGEuUHVibGljTW9kZSAlXSI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQiKSB8IGh0bWwgJV08L2E+CgkJPC9kaXY+CQkKCTwvZGl2PgkJCjwvZGl2PgoJClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KWyUgRU5EICVd</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgRW5jb2RlIHF3KCBlbmNvZGVfdXRmOCBkZWNvZGVfdXRmOCApOwp1c2UgSlNPTiBxdyhlbmNvZGVfanNvbiBkZWNvZGVfanNvbik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lTDo6U3lzdGVtOjpMb2ciLAoiS2VybmVMOjpTeXN0ZW06OlRpY2tldCIsCiJLZXJuZUw6OlN5c3RlbTo6VHlwZSIsCiJLZXJuZWw6OlN5c3RlbTo6WUFNIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hUHVibGljfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzT3B0aW9ucyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNGb3JtfTsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc2NoZW1hIGZvciBuZXcgdGlja2V0IHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWF9Owp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIHN5c3RlbSBmaWVsZCB2YWx1ZXMgKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIFJlcGxhY2VPVFJTVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApID0gJFNlbGYtPkdldE9UUlNTZXJ2aWNlc0RhdGEoKTsKCSRzY2hlbWEgID1+IHMvT1RSU19zZXJ2aWNlX3ZhbHVlcy8kc2VydmljZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3NlcnZpY2VfbGFiZWxzLyRzZXJ2aWNlTmFtZXMvZzsKCglteSAoICR0eXBlTmFtZXMsICR0eXBlSURzICkgPSAkU2VsZi0+R2V0T1RSU1R5cGVzRGF0YShVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0pOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3R5cGVfdmFsdWVzLyR0eXBlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfdHlwZV9sYWJlbHMvJHR5cGVOYW1lcy9nOwoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIHNlcnZpY2VzIGluZm8gKHNlcnZpY2UgYW5kIHR5cGUpCj1jdXQKc3ViIEdldE9UUlNTZXJ2aWNlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzZXJ2aWNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJbXkgJXNlcnZpY2VMaXN0ID0gJHNlcnZpY2VzLT5TZXJ2aWNlTGlzdCggVmFsaWQgPT4gMSwgVXNlcklEID0+ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpICk7CglteSAkc2VydmljZU5hbWVzID0gIiI7CglteSAkc2VydmljZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICRzZXJ2aWNlTGlzdHskYX0gY21wICRzZXJ2aWNlTGlzdHskYn0gKSB9IGtleXMgJXNlcnZpY2VMaXN0ICkgewoJCSRzZXJ2aWNlTmFtZXMgLj0gIlwiJHNlcnZpY2VMaXN0eyRffVwiLCI7CgkJJHNlcnZpY2VJRHMgICAuPSAiJF8sIjsKCX0KCSRzZXJ2aWNlTmFtZXMgPSBzdWJzdHIoJHNlcnZpY2VOYW1lcywgMCwgLTEpOwoJJHNlcnZpY2VJRHMgPSBzdWJzdHIoJHNlcnZpY2VJRHMsIDAsIC0xKTsKCXJldHVybiAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICk7Cn0KCj1oZWFkCkdldCBPVFJTIHRpY2tldCB0eXBlcyAKPWN1dApzdWIgR2V0T1RSU1R5cGVzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCglteSAldHlwZUxpc3QgID0gJHRpY2tldE9iamVjdC0+VGlja2V0VHlwZUxpc3QoIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwoJbXkgJHR5cGVOYW1lcyA9ICIiOwoJbXkgJHR5cGVJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdHlwZUxpc3R7JGF9IGNtcCAkdHlwZUxpc3R7JGJ9ICkgfSBrZXlzICV0eXBlTGlzdCApIHsKCQlpZiAoaW5kZXgoJHR5cGVMaXN0eyRffSwgJzo6JykgPT0gLTEpIHsKCQkJJHR5cGVOYW1lcyAuPSAiXCIkdHlwZUxpc3R7JF99XCIsIjsKCQkJJHR5cGVJRHMgICAuPSAiJF8sIjsKCQl9Cgl9CgkKCSR0eXBlTmFtZXMgPSBzdWJzdHIoJHR5cGVOYW1lcywgMCwgLTEpOwoJJHR5cGVJRHMgPSBzdWJzdHIoJHR5cGVJRHMsIDAsIC0xKTsKCQoJcmV0dXJuICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBkeW5hbWljIGZpZWxkcwo9Y3V0CnN1YiBSZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAkZGZpZWxkcyAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15IEBkZmllbGRMaXN0ID0gQHsgJGRmaWVsZHMtPkR5bmFtaWNGaWVsZExpc3RHZXQoIFZhbGlkID0+IDEgKSB9OwoKCWZvcmVhY2ggKEBkZmllbGRMaXN0KSB7CgkJbXkgJGNhbXBvID0gJF87CgoJCW15ICRuYW1lICAgICAgICAgID0gJGNhbXBvLT57TmFtZX07CgkJbXkgJGNvbmZpZyAgICAgICAgPSAkY2FtcG8tPntDb25maWd9OwoJCW15ICR0eXBlICAgICAgICAgID0gJGNhbXBvLT57RmllbGRUeXBlfTsKCQlteSAkaWRGaWVsZFZhbHVlcyA9ICJERl8iIC4gJG5hbWUgLiAiX3ZhbHVlcyI7CgkJbXkgJGlkRmllbGRMYWJlbHMgPSAiREZfIiAuICRuYW1lIC4gIl9sYWJlbHMiOwoJCWlmICggJHR5cGUgZXEgIkRyb3Bkb3duIiApIHsKCQkJbXkgKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApID0gJFNlbGYtPkdldER5bmFtaWNGaWVsZFZhbHVlcyggQ29uZmlnREYgPT4gJGNvbmZpZyApOwoJCQkkc2NoZW1hICA9fiBzLyRpZEZpZWxkVmFsdWVzLyRkZlZhbHVlcy9nOwoJCQkkb3B0aW9ucyA9fiBzLyRpZEZpZWxkTGFiZWxzLyRkZkxhYmVscy9nOwoJCX0KCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBkeWFubWljIGZpZWxkIHZhbHVlcwo9Y3V0CnN1YiBHZXREeW5hbWljRmllbGRWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRjb25maWcgPSAkUGFyYW17Q29uZmlnREZ9OwoJbXkgJHZhbHVlcyA9ICRjb25maWctPntQb3NzaWJsZVZhbHVlc307CgoJbXkgJGRmVmFsdWVzID0gIiI7CglteSAkZGZMYWJlbHMgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHZhbHVlcy0+eyRhfSBjbXAgJHZhbHVlcy0+eyRifSApIH0ga2V5cyAleyR2YWx1ZXN9ICkgewoJCSRkZlZhbHVlcyAuPSAiXCIkX1wiLCI7CgkJJGRmTGFiZWxzIC49ICJcIiR2YWx1ZXMtPnskX31cIiwiOwoJfQoKCSRkZlZhbHVlcyA9IHN1YnN0cigkZGZWYWx1ZXMsIDAsIC0xKTsKCSRkZkxhYmVscyA9IHN1YnN0cigkZGZMYWJlbHMsIDAsIC0xKTsKCXJldHVybiAoICRkZlZhbHVlcywgJGRmTGFiZWxzICk7Cgp9Cgo9aGVhZApCdWlsZHMgc2VydmljZSBjaG9vc2luZyBjb21ibwo9Y3V0CnN1YiBCdWlsZFNlcnZpY2VzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJFJlc3RyaWN0ZWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2UiKTsKCW15ICRQdWJsaWMgPSAkUGFyYW17UHVibGljfTsKCQoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCW15ICVTZXJ2aWNlcyA9ICgpOwoKCWlmICggISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCSVTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCggVXNlcklEID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLCApOwoJfQoJZWxzZSB7CgkJJVNlcnZpY2VzID0KCQkgICRRdWV1ZVNlcnZpY2VPYmplY3QtPkdldFNlcnZpY2VMaXN0KCBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLCApOwoJfQoJbXkgQFNlcnZpY2VzQ29tYm8gPSAoKTsKCQoJbXkgQHJlc3RyaWN0ZWRTZXJ2aWNlcyA9ICRSZXN0cmljdGVkT2JqZWN0LT5HZXRSZXN0cmljdGVkU2VydmljZXMoKTsKCQoJZm9yIG15ICRzZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlcyApIHsKCQlpZiAoIGdyZXAgeyBpbmRleCggJFNlcnZpY2VzeyRffSwgJFNlcnZpY2VzeyRzZXJ2aWNlSUR9IC4gIjo6IiApID49IDAgfSAoIGtleXMgJVNlcnZpY2VzICkgKSB7CQkJCgkJCWlmICgoISAkUHVibGljKSB8fCAoISAoICRzZXJ2aWNlSUQgfn4gQHJlc3RyaWN0ZWRTZXJ2aWNlcyApKSkgewoJCQkJbXkgJXNlcnYgPSAoKTsKCQkJCSRzZXJ2e1ZhbHVlfSAgICA9ICRTZXJ2aWNlc3skc2VydmljZUlEfTsKCQkJCSRzZXJ2e0tleX0gICAgICA9ICRzZXJ2aWNlSUQ7CgkJCQkkc2VydntEaXNhYmxlZH0gPSAxOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJCWVsc2UgewoJCQlpZiAoKCEgJFB1YmxpYykgfHwgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSkpIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIiI7CglteSAkc2VydmljZVByZURlZmluZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApOwoJJHJldG9ybm8gPSAiPHNlbGVjdCBkYXRhLXdpZHRoPVwiYXV0b1wiIGlkPVwiU2VydmljZUlEXCIgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgY2xhc3M9XCJzZWxlY3RwaWNrZXJcIiBkYXRhLWxpdmUtc2VhcmNoPVwidHJ1ZVwiPlxuPG9wdGlvbiB2YWx1ZT1cIlwiPi08L29wdGlvbj4iOwkKCglpZiAoJHNlcnZpY2VQcmVEZWZpbmVkKSB7CgkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIHNwZWNpZmllZDogJHNlcnZpY2VQcmVEZWZpbmVkIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiU2VydmljZSBub3Qgc3BlY2lmaWVkIik7CgkJCgl9CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCWlmICgkc2VydmljZVByZURlZmluZWQgZXEgJHNlcnZpY2UtPntLZXl9KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gc2VsZWN0ZWQgdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0gZWxzZSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRpb24gdmFsdWU9JyIgLiAkc2VydmljZS0+e0tleX0gLiAiJz4iIC4gJFNlbGYtPkxhc3RQYXJ0KCRzZXJ2aWNlLT57VmFsdWV9KSAuICI8L29wdGlvbj5cbiI7CgkJCX0KCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCW15ICRjbGVhck5hbWUgPSAkdG1wRmlsZXtGaWxlbmFtZX07CgkkY2xlYXJOYW1lID1+IHRyLzAtOWEtekEtWlwuXC0vXF8vYzsKCSR0bXBGaWxle0ZpbGVuYW1lfSA9ICRjbGVhck5hbWU7CgoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBBZGRpbmcgZmlsZSB0byBjYWNoZS4gRm9ybUlEOiAiIC4gJGZvcm1JZCAuICIgXHQgRmlsZW5hbWU6ICIgLiAkdG1wRmlsZXtGaWxlbmFtZX0gLiAiIFx0IENvbnRlbnRUeXBlOiAiIC4gJHRtcEZpbGV7Q29udGVudFR5cGV9ICk7CgoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJbXkgJEZvcm1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoJCgkkU2VsZi0+Q2xlYXJDYWNoZShGb3JtSUQgPT4gJEZvcm1JRCk7CgoJbXkgKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICkgPSAkU2VsZi0+R2V0Rm9ybSggUHVibGljID0+ICRQYXJhbXtQdWJsaWN9LCBTZXJ2aWNlRm9ybSA9PiBcJXNlcnZpY2VGb3JtLCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gIlt7IiAuICRzY2hlbWEgLiAifSwgeyIgLiAkZmllbGRzIC4gIn0sIFwiIiAuICRpbnRyb2R1Y3Rpb24gLiAiXCJdIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKQWxsb3dzIHVzaW5nIGEgZmllbGQgaW4gdGhlIGZvcm0gdG8gc2VsZWN0IGEgdGFyZ2V0IHF1ZXVlLgpJZiBhIHF1ZXVlIHdhcyBkZWZpbmVkIGluIHJlcXVlc3QgcGFyYW1ldGVyLCB1c2VzIGl0LgpJZiB0aGVyZSBpcyBhIHByZWZpeCBkZWZpbmVkIGZvciB0aGUgcXVldWVzIHRvIGF1dG9tYXRpY2FsbHkgZm9yd2FyZCB0aWNrZXRzLAphbmQgYWxzbyBhIGZpZWxkIHdhcyBkZWZpbmVkIGFzIGhhbmRsaW5nIHRoZSB0YXJnZXQgcXVldWUsIHRyeSB0byBsb2NhdGUgb25lLgoKSWYgbm9uZSBpcyBmb3VuZCwgdXNlcyB0aGUgZGVmYXVsdCBxdWV1ZS4KCkZvciBleGFtcGxlOgoJUXVldWVEZWZhdWx0ID0gUHJpbWVpcm8gTml2ZWwKCVF1ZXVlUHJlZml4ID0gUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRmllbGQgPSBVbmlkYWRlCgkKCUF2YWlsYWJsZVF1ZXVlcyA9IFByaW1laXJvIE5pdmVsIENDQiwgUHJpbWVpcm8gTml2ZWwgQ0NFLCBQcmltZWlybyBOaXZlbAoJUXVldWVEZWZhdWx0ID0gUHJpbWVpcm8gTml2ZWwKCQoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0IsIHRoZW4gc2VsZWN0cyBxdWV1ZSBQcmltZWlybyBOaXZlbCBDQ0IKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NKIChubyBxdWV1ZSBieSB0aGF0IHN1ZmZpeCksIHRoZW4gc2VsZWN0cyBxdWV1ZSBQcmltZWlybyBOaXZlbAoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0UsIHRoZW4gc2VsZWN0cyBxdWV1ZSBQcmltZWlybyBOaXZlbCBDQ0UKPWN1dApzdWIgR2V0UXVldWVJRCgpIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCQoJIyBDaGVjayBpZiBxdWV1ZUlEIHdhcyBzZW50CglteSAkUXVldWVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQoJaWYgKCRRdWV1ZUlEKSB7CgkJbXkgJVF1ZXVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUXVldWVJRCk7CgkJcmV0dXJuICgkUXVldWV7Ik5hbWUifSwgJFF1ZXVlSUQpOyAKCX0KCgkjIEdldHMgZGVmYXVsdCBRdWV1ZQoJbXkgJENvbmZpZ1RpY2tldCAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIik7CglteSAkQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkKCglteSAkUXVldWVEZWZhdWx0ID0gJENvbmZpZ1RpY2tldC0+eyJRdWV1ZURlZmF1bHQifTsKCgkjIENoZWNrcyBpZiB0aGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcXVldWUKCW15ICRRdWV1ZVByZWZpeCA9ICRDb25maWdUaWNrZXRXaXphcmQtPnsiUXVldWVQcmVmaXgifTsKCW15ICRRdWV1ZUZpZWxkICA9ICRDb25maWdUaWNrZXRXaXphcmQtPnsiUXVldWVGaWVsZCJ9OwoKCW15ICVRdWV1ZUxpc3RJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCAgICAgICAgID0+IDEgKTsKCW15ICVRdWV1ZUxpc3QgICA9IHJldmVyc2UgJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkID0+IDEgKTsKCSRRdWV1ZUlEICAgICA9ICRRdWV1ZUxpc3R7JFF1ZXVlRGVmYXVsdH07CglteSAkUXVldWUgICAgICAgPSAkUXVldWVMaXN0SUR7JFF1ZXVlSUR9OwoKCWlmICggJFF1ZXVlUHJlZml4ICYmICRRdWV1ZUZpZWxkICkgewoJCW15ICRRdWV1ZVNlbGVjdGVkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFF1ZXVlRmllbGQgKTsKCQlteSAkUXVldWVOYW1lID0gIiRRdWV1ZVByZWZpeCAkUXVldWVTZWxlY3RlZCI7CgoJCWlmICggJFF1ZXVlTGlzdHskUXVldWVOYW1lfSApIHsKCQkJJFF1ZXVlSUQgPSAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9OwoJCQkkUXVldWUgICA9ICRRdWV1ZU5hbWU7CgkJfQoJfQoJCglyZXR1cm4gKCAkUXVldWUsICRRdWV1ZUlEICk7Cn0KCj1oZWFkClJldHVybnMgdGhlIGZvcm0gY29kZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRzY2hlbWE7CglteSAkZmllbGRzOwoJCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJHZXR0aW5nIHB1YmxpYyBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYVB1YmxpYygpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMoKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJHZXR0aW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWEoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zKCk7Cgl9CgkKCW15ICRpbnRyb2R1Y3Rpb247CgoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU1ZhbHVlcygKCQlTY2hlbWEgID0+ICRzY2hlbWEsCgkJT3B0aW9ucyA9PiAkZmllbGRzLAoJCVVzZXJJRCAgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfQoJKTsKCQoJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfSApIHsKCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCSRpbnRyb2R1Y3Rpb24gPSAiIjsKCQkjIEluY2x1ZGUgZHluYW1pYyBmaWVsZHMgaW4gcmVwbGFjZSBjb21tYW5kCgkJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCX0KCWVsc2UgewoJCW15ICVzZXJ2aWNlRm9ybSA9ICV7ICRQYXJhbXtTZXJ2aWNlRm9ybX0gfTsKCQkkaW50cm9kdWN0aW9uID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgoJCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX17U2NoZW1hfSApIHsKCQkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJfQoJCWVsc2UgewoJCQlteSAkc2NoZW1hRm9ybSA9ICIsIiAuICRzZXJ2aWNlRm9ybXtTY2hlbWF9OwoJCQlteSAkZmllbGRzRm9ybSA9ICIsIiAuICRzZXJ2aWNlRm9ybXtGb3JtfTsKCQkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8kc2NoZW1hRm9ybS9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8kZmllbGRzRm9ybS9nOwoJCX0KCgkJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNEeW5hbWljRmllbGRzKCBTY2hlbWEgPT4gJHNjaGVtYSwgT3B0aW9ucyA9PiAkZmllbGRzICk7CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJCglpZiAoJFBhcmFteyJRdWV1ZUlEIn0pIHsJCQkKCQkkc2NoZW1hID0gJHNjaGVtYSAuICIsXG5cIlF1ZXVlSURcIjoge1xuXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cImRlZmF1bHRcIjogXCIiIC4gJFBhcmFteyJRdWV1ZUlEIn0gLiAiXCJ9IjsKCQkkZmllbGRzID0gJGZpZWxkcyAuICIsXG5cIlF1ZXVlSURcIjoge1xuXCJ0eXBlXCI6IFwiaGlkZGVuXCJcbn0iOwoJfQoKCXJldHVybiAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKTsKfQoKPWhlYWQKSWYgc29tZSBmaWVsZHMgaGF2ZSBmaXhlZCB2YWx1ZXMgaW4gc2VydmljZSBkZWZpbml0aW9uLCBzZXRzIHRoZW0KPWN1dApzdWIgQWRqdXN0Rml4ZWRGaWVsZHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRmb3JtID0gJFBhcmFte0ZpZWxkc307CglteSAkZml4ZWRWYWx1ZXMgPSAkUGFyYW17Rml4ZWRWYWx1ZXN9OwoJCglteSBAdmFsdWVzID0gc3BsaXQoL1xuLywgJGZpeGVkVmFsdWVzKTsKCQoJZm9yIG15ICR2YWx1ZSAoQHZhbHVlcykgewoKCQkkdmFsdWUgPX4gcy9cci8vZzsKCQlteSBAZGF0YSA9IHNwbGl0KCc9JywgJHZhbHVlKTsKCQkJCQkKCQlteSAkZmllbGRLZXkgPSAkZGF0YVswXTsKCQlteSAkZml4ZWRWYWx1ZSA9ICRkYXRhWzFdOwoKCQkkU2VsZi0+RGVidWcoIkFkanVzdGluZyBmaXhlZCBmaWVsZCB7ICRmaWVsZEtleSB9IHdpdGggdmFsdWUgWyAkZml4ZWRWYWx1ZSBdIik7CgkJCQkJCQkJCQkKCQlteSAka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJbXkgJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIicgLiAnOiB7InR5cGUiOiAic3RyaW5nIiwgImRlZmF1bHQiOiAiJyAuICRmaXhlZFZhbHVlIC4gJyJ9JzsKCgkJJFNlbGYtPkRlYnVnKCJBZGp1c3RpbmcgZml4ZWQgZmllbGRzIGluIHNjaGVtYTogXG4gIiAuICRzY2hlbWEpOwoJCQoJCSRzY2hlbWEgPX4gcy8ka2V5LyRyZXBsYWNlLzsKCQkKCQkkU2VsZi0+RGVidWcoIkFkanVzdGluZyBmaXhlZCBmaWVsZHMgaW4gZm9ybTogXG4gIiAuICRmb3JtKTsKCgkJJGZvcm0gPSAieyIgLiAkZm9ybSAuICJ9IjsKCQkkZm9ybSA9IGVuY29kZV91dGY4KCRmb3JtKTsKCQlteSAkZm9ybVN0cnVjdCA9IGRlY29kZV9qc29uKCRmb3JtKTsKCQlteSAkaGlkZGVuU3RydWN0ID0ge307CQkKCQkkaGlkZGVuU3RydWN0LT57InR5cGUifSA9ICJoaWRkZW4iOwoJCSRmb3JtU3RydWN0LT57JGZpZWxkS2V5fSA9ICRoaWRkZW5TdHJ1Y3Q7CgkJCgkJcHJpbnQgU1RERVJSIER1bXBlcigkZm9ybVN0cnVjdCk7CgoJCSRmb3JtID0gZW5jb2RlX2pzb24oJGZvcm1TdHJ1Y3QpOwoJCSRmb3JtID0gZGVjb2RlX3V0ZjgoJGZvcm0pOwoJCXN1YnN0cigkZm9ybSwgMCwgMSwgIiIpOwoJCXN1YnN0cigkZm9ybSwgLTEsIDEsICIiKTsJCQoJfQkJCgkKCXJldHVybiAoJHNjaGVtYSwgJGZvcm0pOwkKfQoKPWhlYWQKQ3JlYXRlcyBhIG5ldyB0aWNrZXQsIGdpdmVuIHRoZSBpbnB1dCBkYXRhIGFuZCBzZW50IGF0dGFjaG1lbnRzL2ltYWdlcwo9Y3V0CnN1YiBDcmVhdGVUaWNrZXQgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgoJbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kIik7CglteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIpOwoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCQogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIAoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkTWFpbnRlbmFuY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TWFpbnRlbmFuY2UiKTsKCW15ICREYXRlVXRpbHNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RGF0ZVV0aWxzIik7CgoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7QXV0aGVudGljYXRlVVJMfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGU6OkNBUzo6Q0FTVXJsJykKCQkJICAuICIvbG9naW4/c2VydmljZT0iCgkJCSAgLiAiaHR0cHM6Ly8iCgkJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCQkgIC4gJEVOVntTQ1JJUFRfTkFNRX0KCQkJICAuICI/QWN0aW9uPU5ld1RpY2tldFdpemFyZCI7Cgl9CgkKCSMgQ2hlY2sgaWYgcXVldWUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZAoJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKSkgewkJCgkJJERhdGF7UXVldWVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkJJFNlbGYtPkRlYnVnKCJTcGVjaWZpYyBxdWV1ZSBkZWZpbmVkID0+ICIgLiAkRGF0YXtRdWV1ZUlEfSk7Cgl9IGVsc2UgewoJCSAjIENoZWNrIGlmIG11c3Qgc2hvdyBxdWV1ZSAtIGlmIHNvLCByZWRpcmVjdCB1c2VyCiAgICAgICAgbXkgJF9Db25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKICAgICAgICBteSAkX1Nob3dRdWV1ZSAgICAgICAgICA9ICRfQ29uZmlnVGlja2V0V2l6YXJkLT57IlNob3dRdWV1ZSJ9OwogICAgICAgIGlmICghICRfU2hvd1F1ZXVlKSB7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiUXVldWUgc2VsZWN0aW9uIG11c3QgYmUgc2hvd24gLSByZWRpcmVjdGlvbiB0byBRdWV1ZVBhbmVsUHVibGljIGFjdGlvbiIpOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249UXVldWVzUGFuZWxQdWJsaWMiICk7CiAgICAgICAgfQkJCgl9CgkKCW15ICggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+R2V0Rm9ybShQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30pOwoJCgkkRGF0YXtTY2hlbWFGb3JtfSA9ICRzY2hlbWE7CgkkRGF0YXtGaWVsZHNGb3JtfSA9ICRmaWVsZHM7CgoJIyBDb21tb24gaW5mbwoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CglteSAkaWRDdXN0b21UZW1wbGF0ZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJDdXN0b21UZW1wbGF0ZSJ9OwoJCglteSAkbXNnQ2hvb3NlU2VydmljZTsJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkbXNnQ2hvb3NlU2VydmljZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJNZXNzYWdlQ2hvb3NlU2VydmljZVB1YmxpYyJ9OwoJfSBlbHNlIHsKCQkkbXNnQ2hvb3NlU2VydmljZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJNZXNzYWdlQ2hvb3NlU2VydmljZSJ9OwoJfQoJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICkgewoJCW15ICVxdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKTsKCQlteSAkcXVldWVOYW1lID0gJHF1ZXVlRGF0YXtOYW1lfTsJCQoJCSRtc2dDaG9vc2VTZXJ2aWNlID1+IHMvUExBQ0VcX05BTUUvJHF1ZXVlTmFtZS9nOwoJfQoJJERhdGF7TXNnQ2hvb3NlU2VydmljZX0gPSAkbXNnQ2hvb3NlU2VydmljZTsJCgkKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCQoJCgoJIyBCdWlsZCBzZXJ2aWNlIGNob29zZXIKCSREYXRhe1NlcnZpY2VTdHJnfSA9ICRUaWNrZXRXaXphcmQtPkJ1aWxkU2VydmljZXMoU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksIFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgoJIyBCdWlsZCBvdXRwdXQKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCAgVGl0bGUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXcgdGlja2V0IHdpemFyZCIpICk7CgkJICAKCSMgTG9hZCBjdXJyZW50IG1haW50ZW5hbmNlcyAgCglteSBAbWFpbnRlbmFuY2VzID0gJE1haW50ZW5hbmNlT2JqZWN0LT5MaXN0Q3VycmVudE1haW50ZW5hbmNlcygpOwoJCQoJaWYgKEBtYWludGVuYW5jZXMpIHsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VzUGFuZWwnLAoJCSk7CQkKCQkJCgkJZm9yIG15ICRtYWludGVuYW5jZUhhc2ggKEBtYWludGVuYW5jZXMpIHsKCQkJbXkgJW1haW50ZW5hbmNlID0gJXskbWFpbnRlbmFuY2VIYXNofTsKCQkJCQkJCQoJCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJCU5hbWUgPT4gJ01haW50ZW5hbmNlTGluZScsCgkJCQlEYXRhID0+IHsKCQkJCQlNZXNzYWdlICAgPT4gJG1haW50ZW5hbmNleydEZXNjcmlwdGlvbid9LAkJCQkJCQoJCQkJCVN0YXJ0RGF0ZSA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5CcmF6aWxpYW5EYXRlKFRpbWVzdGFtcCA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5Gcm9tU1FMKFN0cmluZ0RhdGUgPT4gJG1haW50ZW5hbmNle1N0YXJ0RGF0ZX0pKSwKCQkJCX0pOwkJCQkJCQkKCQl9CQoJfQkJCgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJQdWJsaWMgdmlldyAtIHVuYXV0aGVudGljYXRlZCBtZXNzYWdlIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnVW5hdXRoZW50aWNhdGVkTWVzc2FnZScsCgkJKTsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gcHVibGljIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdUb29sQmFyUHVibGljJywKCQkpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiQ3VzdG9tZXIgdmlldyAtIGN1c3RvbWVyIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAkJCgkJCU5hbWUgPT4gJ1Rvb2xCYXJDdXN0b21lcicsCgkJKTsKCX0KCgkjIFByZXBhcmUgY2FjaGUgZm9yIGltYWdlbnMgYW5kIGF0dGFjaG1lbnRzCglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJJERhdGF7Rm9ybUlEfSA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQ3JlYXRlKCk7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJfQoKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmQnLAoJKTsKCQkKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQKU2VwYXJhdGUgc2VydmljZS1maWVsZCBsYWJlbCBuYW1lcywgdG8gbWFrZSBpdCBodW1hbi1yZWFkYWJsZSAoQ2FwaXRhbExpa2VMYWJlbHMgLT4gQ2FwaXRhbCBsaWtlIGxhYmVscykKPWN1dApzdWIgYnJlYWtXb3JkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJHJldHVybiA9ICRQYXJhbXtUZXh0fTsJCgkKCSRyZXR1cm4gPX4gcy8oLikoW0EtWl1bXkEtWl0pLyQxICQyL2c7CgkkcmV0dXJuID1+IHMvKFtcdyddKykvXHVcTCQxL2c7CgkKCXJldHVybiAkcmV0dXJuOwp9CgpzdWIgRGVidWcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRtc2cgPSBzaGlmdDsKCSRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpMb2ciKS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICRtc2cgKTsKfQoKCjE7Cg==</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlucHV0VHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5wdXRUeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpbnB1dFR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBpZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC10ZXh0YXJlYSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicm93cz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiY29scz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiZGF0YS0iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJvd3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbHMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdXJsIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsYWJlbCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtYnV0dG9uIGFscGFjYS1jb250cm9sLWJ1dHRvbi0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3R5bGVzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdHlsZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InN0eWxlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVuZGVyQnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9uIGFscGFjYS1mb3JtLWJ1dHRvbi0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3R5bGVzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdHlsZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InN0eWxlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmF0dHJpYnV0ZXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lc3NhZ2UgYWxwYWNhLW1lc3NhZ2UtIgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJ3aXphcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLW5hdlwiPlxuICAgICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdmJhciBuYXZiYXItZGVmYXVsdFwiIHJvbGU9XCJuYXZpZ2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBhbHBhY2Etd2l6YXJkLWJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdmJhci1uYXZcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdGVwcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmF2PlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRpdGxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aXRsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGl0bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hldnJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtcHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW5vdz1cIjBcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MCU7XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxoMz4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aXphcmRUaXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoid2l6YXJkVGl0bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvaDM+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxoND4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aXphcmREZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkRGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoid2l6YXJkRGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvaDQ+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hbGlnbiA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjE0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkXCI+XG5cbiAgICAgICAgPCEtLSBuYXYgYmFyIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dTdGVwcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPCEtLSB3aXphcmQgcHJvZ3Jlc3MgYmFyIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dQcm9ncmVzc0JhciA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aXphcmRUaXRsZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkRGVzY3JpcHRpb24gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHN0ZXBzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1zdGVwc1wiPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gd2l6YXJkIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLWJ1dHRvbnNcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjbGVhcjpib3RoXCI+PC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGVnZW5kIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvbGVnZW5kPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiICI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIj5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgIDwvc3Bhbj5cbiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciBoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLTE2IGdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRhaW5lcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1yYWRpbyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5kYXRhIDogZGVwdGhzWzFdKSx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXNlbGVjdCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kaXNwbGF5YWJsZVRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRpc3BsYXlhYmxlVGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkaXNwbGF5YWJsZVRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLWRvd25sb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cImVycm9yXCIgY29sc3Bhbj1cIjJcIj5cbiAgICAgICAgICAgIEVycm9yOlxuICAgICAgICAgICAgIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgdGl0bGU9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWdhbGxlcnk9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGEgaHJlZj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgdGl0bGU9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWdhbGxlcnk9XCJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8L2E+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0RlbGV0ZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlbGV0ZSBidG4gYnRuLWRhbmdlclwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10cmFzaCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiBidG4gIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5idXR0b25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImJ1dHRvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczQoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmljb25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Imljb25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRyIGNsYXNzPVwidGVtcGxhdGUtZG93bmxvYWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFkZVwiPjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4iOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cImVycm9yXCIgY29sc3Bhbj1cIjJcIj48c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLWltcG9ydGFudFwiPkVycm9yPC9zcGFuPiAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90ZD5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS52YWxpZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRhdGEgJiYgZGF0YS5pbmRleCksMCx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPHRkIGNsYXNzPVwic3RhcnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF1dG9VcGxvYWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzIHByb2dyZXNzLXN1Y2Nlc3MgcHJvZ3Jlc3Mtc3RyaXBlZCBhY3RpdmVcIiByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBhcmlhLXZhbHVlbm93PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHN0eWxlPVwid2lkdGg6MCU7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCI+IFxcXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWQgZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TdGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhbmNlbFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRhdGEgJiYgZGF0YS5pbmRleCksMCx7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCIxNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWJhbi1jaXJjbGUgZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DYW5jZWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMz1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRyIGNsYXNzPVwidGVtcGxhdGUtdXBsb2FkXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+PC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jc3NDbGFzc2VzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jc3NDbGFzc2VzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImNzc0NsYXNzZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPk5hbWU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+U2l6ZTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+PCEtLSBlcnJvciBvciBzdGFydCBvciBwcm9ncmVzcyBpbmRpY2F0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5BY3Rpb25zPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5UaHVtYm5haWw8L3RkPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jc3NDbGFzc2VzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFscGFjYS1maWxldXBsb2FkLWNob29zZXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIiCiAgICArIGFsaWFzMihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmlldyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiIGZpbGVpbnB1dC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZXVwbG9hZC1hZGQtYnV0dG9uXCI+IgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jaG9vc2VCdXR0b25MYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY2hvb3NlQnV0dG9uTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImNob29zZUJ1dHRvbkxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0XCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQtaGlkZGVuXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNfaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFscGFjYS1maWxldXBsb2FkLXdlbGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGZpbGV1cGxvYWQtYWN0aXZlLXpvbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0hlYWRlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDxwIGFsaWduPVwiY2VudGVyXCIgY2xhc3M9XCJkcm9wem9uZS1tZXNzYWdlXCI+IgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kcm9wWm9uZU1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRyb3Bab25lTWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZHJvcFpvbmVNZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicHJvZ3Jlc3NcIiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjb250cm9sLWxhYmVsIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWxwLWJsb2NrXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCI+PC9pPiZuYnNwOyIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm1lc3NhZ2UgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gPSB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXSB8fCB7fTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lci1ncmlkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIGJ0bi1ncm91cCI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7CgogIHJldHVybiAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGFsaWFzMT1jb250YWluZXIubGFtYmRhLCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25cIiBkYXRhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCksIGRlcHRoMCkpCiAgICArICI8L2E+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczI9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbiAiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMix7Im5hbWUiOiJhY3Rpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmljb25DbGFzcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Imljb25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS10b29sYmFyXCIgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJidXR0b24iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhckFjdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXJcIj48L2Rpdj5cblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPCEtLSBoaWRkZW4gY29sdW1uIHN0b3Jpbmcgc29ydCBvcmRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtaGVhZGVyXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBkcmFnZ2FibGUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXJcIj48L3RoPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtaGVhZGVyLWlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGlkZGVuIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L3RoPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2xhc3M9XCJhbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlblwiIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFjdGlvbnM8L3RoPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRyYWdSb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGVhZGVycyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGJvZHkgLS0+XG4gICAgICAgICAgICA8dGJvZHk+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtY29sb3JwaWNrZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPjxpPjwvaT48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb21wb25lbnQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXR0cmlidXRlcyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb21wb25lbnQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dVcGxvYWRQcmV2aWV3IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZW5hbWVMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZW5hbWVMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZW5hbWVMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVTaXplTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVTaXplTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVTaXplTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlVXBsb2FkQWN0aW9uc0xhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGh1bWJuYWlsTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRodW1ibmFpbExhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6InRodW1ibmFpbExhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjb250cm9sLWxhYmVsIGFscGFjYS1jb250cm9sLWxhYmVsXCIgZm9yPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xhYmVsPlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJoZWxwLWJsb2NrIGFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwovKioKICogVXNpbmcgZm9yazoKICogaHR0cHM6Ly9naXRodWIuY29tL2tjbW9vdC9CYXNlLmpzLUZvcmsvYmxvYi9tYXN0ZXIvYnVpbGQvYmFzZS5qcwogKi8KKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CiAgICAvKgogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS4KICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIChyb290LnJldHVybkV4cG9ydHNHbG9iYWwgPSBmYWN0b3J5KCkpOwogICAgICAgIH0pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAogICAgICAgIC8vIGxpa2UgTm9kZS4KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgIH0gZWxzZSB7CiAgICAqLwogICAgICAgIHJvb3RbJ0Jhc2UnXSA9IGZhY3RvcnkoKTsKICAgIC8qCiAgICB9CiAgICAqLwp9KHRoaXMsIGZ1bmN0aW9uICgpIHsKCiAgICAvKioKICAgICAqICAgQmFzZS5qcywgdmVyc2lvbiAxLjFhCiAgICAgKiAgIENvcHlyaWdodCAyMDA2LTIwMTAsIERlYW4gRWR3YXJkcwogICAgICogICBMaWNlbnNlOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogICAgICoKICAgICAqICAgTW9kaWZpZWQgYnkgdGhlIE5lcmRlcnkgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlIGFuZCB2YXJpb3VzIGJ1Z2ZpeGVzCiAgICAgKi8KCiAgICAvKioKICAgICAqIEZ1bmN0aW9uIHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7CgogICAgLyoqCiAgICAgKiBPYmplY3QgdHlwZQogICAgICoKICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQGlnbm9yZQogICAgICogQGZpbmFsCiAgICAgKi8KICAgIHZhciBUWVBFX09CSkVDVCA9ICdvYmplY3QnOwoKICAgIC8qKgogICAgICogU3RyaW5nIHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9TVFJJTkcgPSAnc3RyaW5nJzsKCiAgICAvKioKICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIGFyZSBjdXJyZW50bHkgY3JlYXRpbmcgYSBjbGVhbiBwcm90b3R5cGUgb2YgYSBjbGFzcwogICAgICoKICAgICAqIEB0eXBlIEJvb2xlYW4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHZhciBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE1ldGhvZCB0byBleHRlbmQgbWFudWFsbHkgLSBkbyBub3QgZG8gYXV0b21hdGljYWxseQogICAgICoKICAgICAqIEB0eXBlIEFycmF5CiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2hpZGRlbk1ldGhvZHMgPSBbJ2NvbnN0cnVjdG9yJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXTsKCiAgICAvKioKICAgICAqIExlbnRoIG9mIGhpZGRlbiBtZXRob2RzIGFycmF5CiAgICAgKgogICAgICogQHR5cGUgTnVtYmVyCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2hpZGRlbk1ldGhvZHNMZW5ndGggPSBfaGlkZGVuTWV0aG9kcy5sZW5ndGg7CgogICAgLyoqCiAgICAgKiBSZWdleCB0byBmaW5kIGFueSBjYWxscyB0byBhIHBhcmVudCBtZXRob2QKICAgICAqCiAgICAgKiBAdHlwZSBSZWdFeHAKICAgICAqIEBwcml2YXRlCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIHZhciBfc3VwZXJNZXRob2RSZWdleCA9IC9cYmJhc2VcYi87CgogICAgLyoqCiAgICAgKiBCbGFuayBmdW5jdGlvbgogICAgICoKICAgICAqIEB0eXBlIEZ1bmN0aW9uCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX2JsYW5rRnVuY3Rpb24gPSBmdW5jdGlvbigpIHt9OwoKICAgIC8qKgogICAgICogUHJvdG90eXBlIGRlZmF1bHQgdmFsdWVzLiBXaGVuIGV4dGVuZGluZyBtZXRob2RzLCBpZiBib3RoIHNvdXJjZXMgaGF2ZSB0aGVzZSB2YWx1ZXMsIGRvIG5vdCBjb3B5IHRoZW0uCiAgICAgKgogICAgICogQHR5cGUgT2JqZWN0CiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwZURlZmF1bHRzID0geyB0b1NvdXJjZTogbnVsbCwgYmFzZTogX2JsYW5rRnVuY3Rpb24gfTsKCiAgICAvKioKICAgICAqIEJhc2VMaWIgY2xhc3MKICAgICAqCiAgICAgKiBBIGxpYnJhcnkgdG8gY3JlYXRlIGEgbW9yZSB0cmFkaXRpb25hbCBPT1AgaW50ZXJmYWNlIGZvciBkZXZlbG9wZXJzIHRvIHdvcmsgd2l0aAogICAgICoKICAgICAqIEBjbGFzcyBMaWIuQmFzZS5CYXNlCiAgICAgKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIHZhciBCYXNlID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFN1YmNsYXNzIGEgY2xhc3MKICAgICAqCiAgICAgKiBAbWV0aG9kIGV4dGVuZAogICAgICogQHBhcmFtIHtPYmplY3R9IFtpbnN0YW5jZU1ldGhvZHNdIEluc3RhbmNlIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGF0aWNNZXRob2RzXSBTdGF0aWMgbWVtYmVycy9tZXRob2RzCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgQmFzZS5leHRlbmQgPSBmdW5jdGlvbihpbnN0YW5jZU1ldGhvZHMsIHN0YXRpY01ldGhvZHMpIHsgLy8gc3ViY2xhc3MKICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAvLyBidWlsZCB0aGUgcHJvdG90eXBlCiAgICAgICAgX3Byb3RvdHlwaW5nID0gdHJ1ZTsKCiAgICAgICAgdmFyIHByb3RvID0gbmV3IHRoaXMoKTsKICAgICAgICBleHRlbmQuY2FsbChwcm90bywgaW5zdGFuY2VNZXRob2RzKTsKCiAgICAgICAgLy8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGFueSBvdGhlciBtZXRob2QgdG8gaW52b2tlIHRoYXQgbWV0aG9kJ3MgYW5jZXN0b3IKICAgICAgICBwcm90by5iYXNlID0gX3Byb3RvdHlwZURlZmF1bHRzLmJhc2U7CgogICAgICAgIF9wcm90b3R5cGluZyA9IGZhbHNlOwoKICAgICAgICAvLyBjcmVhdGUgdGhlIHdyYXBwZXIgZm9yIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvLmNvbnN0cnVjdG9yOwogICAgICAgIHZhciBrbGFzcyA9IHByb3RvLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nKSB7CiAgICAgICAgICAgICAgICAvLyBpbnN0YW50aWF0aW9uCiAgICAgICAgICAgICAgICBpZiAodGhpcyAmJiAodGhpcy5fY29uc3RydWN0aW5nIHx8IHRoaXMuY29uc3RydWN0b3IgPT09IGtsYXNzKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN0cnVjdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdGluZwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgQmFzZS5jYXN0LmFwcGx5KGtsYXNzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBidWlsZCB0aGUgY2xhc3MgaW50ZXJmYWNlCiAgICAgICAgZXh0ZW5kLmNhbGwoa2xhc3MsIHRoaXMpOwogICAgICAgIGtsYXNzLmFuY2VzdG9yID0gdGhpczsKICAgICAgICBrbGFzcy5wcm90b3R5cGUgPSBwcm90bzsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIG9yaWdpbmFsIG1ldGhvZAogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB2YWx1ZU9mCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFt0eXBlXQogICAgICAgICAqIEByZXR1cm4gRnVuY3Rpb24KICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICovCiAgICAgICAga2xhc3MudmFsdWVPZiA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlID09PSBUWVBFX09CSkVDVCkgPyBrbGFzcyA6IGNvbnN0cnVjdG9yLnZhbHVlT2YoKTsKICAgICAgICB9OwogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCBzdGF0aWNNZXRob2RzKTsKCiAgICAgICAgLy8gaWYgc3RhdGljIGluaXQgbWV0aG9kIGV4aXN0cywgY2FsbCBpdAogICAgICAgIGlmICh0eXBlb2Yga2xhc3MuaW5pdCA9PT0gVFlQRV9GVU5DVElPTikgewogICAgICAgICAgICBrbGFzcy5pbml0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICAgIC8qKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gc291cmNlCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdmFsdWVdCiAgICAgKiBAY2hhaW5hYmxlCiAgICAgKi8KICAgIEJhc2UucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgdmFsdWUpIHsKICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBhIG5hbWUvdmFsdWUgcGFpcgogICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBUWVBFX1NUUklORyAmJiBhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzW3NvdXJjZV07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGFuY2VzdG9yICYmCiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGluZyBhIG1ldGhvZD8KICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUgPT09IFRZUEVfRlVOQ1RJT04pICYmCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlT2YoKSBjb21wYXJpc29uIGlzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgICghYW5jZXN0b3IudmFsdWVPZiB8fCBhbmNlc3Rvci52YWx1ZU9mKCkgIT09IHZhbHVlLnZhbHVlT2YoKSkgJiYKICAgICAgICAgICAgICAgIF9zdXBlck1ldGhvZFJlZ2V4LnRlc3QodmFsdWUpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB1bmRlcmx5aW5nIG1ldGhvZAogICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlLnZhbHVlT2YoKTsKCiAgICAgICAgICAgICAgICAvLyBvdmVycmlkZQogICAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5iYXNlIHx8IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IGFuY2VzdG9yOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBwb2ludCB0byB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlID09PSBUWVBFX09CSkVDVCkgPyB2YWx1ZSA6IG1ldGhvZDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZyA9IEJhc2UudG9TdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc1tzb3VyY2VdID0gdmFsdWU7CgogICAgICAgICAgICAvLyBleHRlbmRpbmcgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbAogICAgICAgIH0gZWxzZSBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIHZhciBleHRlbmQgPSBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CgogICAgICAgICAgICAvLyBpZiB0aGlzIG9iamVjdCBoYXMgYSBjdXN0b21pc2VkIGV4dGVuZCBtZXRob2QgdGhlbiB1c2UgaXQKICAgICAgICAgICAgaWYgKCFfcHJvdG90eXBpbmcgJiYgdHlwZW9mIHRoaXMgIT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IHRoaXMuZXh0ZW5kIHx8IGV4dGVuZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZG8gaGlkZGVuIG1ldGhvZHMgc2VwYXJhdGVseQogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgcHJvdG90eXBpbmcgdGhlbiBpbmNsdWRlIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB2YXIgaSA9IF9wcm90b3R5cGluZyA/IDAgOiAxOwogICAgICAgICAgICB2YXIga2V5OwogICAgICAgICAgICBmb3IgKDsgaSA8IF9oaWRkZW5NZXRob2RzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGtleSA9IF9oaWRkZW5NZXRob2RzW2ldOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZVtrZXldICE9PSBfcHJvdG90eXBlRGVmYXVsdHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKHRoaXMsIGtleSwgc291cmNlW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IGVhY2ggb2YgdGhlIHNvdXJjZSBvYmplY3QncyBwcm9wZXJ0aWVzIHRvIHRoaXMgb2JqZWN0CiAgICAgICAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKCFfcHJvdG90eXBlRGVmYXVsdHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKHRoaXMsIGtleSwgc291cmNlW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLy8gaW5pdGlhbGlzZQogICAgQmFzZSA9IEJhc2UuZXh0ZW5kKHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBzdGF0aWMgYmFzZSBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgYmFzZQogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICBiYXNlOiBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZQoKICAgIH0sIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogUGFyZW50IG9iamVjdC9jbGFzcwogICAgICAgICAqCiAgICAgICAgICogQHByb3BlcnR5IGFuY2VzdG9yCiAgICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICBhbmNlc3RvcjogT2JqZWN0LAoKICAgICAgICAvKioKICAgICAgICAgKiBCYXNlLmpzIHZlcnNpb24KICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSB2ZXJzaW9uCiAgICAgICAgICogQHR5cGUgU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgKi8KICAgICAgICB2ZXJzaW9uOiAnMS4xJywKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5kIGN1cnJlbnQgY2xhc3MgaW50byBhbm90aGVyIG9iamVjdCBvciBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIElmIGFuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZSBpcyBwYXNzZWQsIG9ubHkgcHJvdG90eXBlIG1ldGhvZHMKICAgICAgICAgKiB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBhIGNsYXNzICh3aXRoIGNvbnN0cnVjdG9yKSBpcyBwYXNzZWQsIGJvdGggc3RhdGljIGFuZAogICAgICAgICAqIHByb3RvdHlwZSBtZXRob2RzIHdpbGwgYmUgY2FzdCBFWENFUFQgZm9yIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgY2FzdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjbGFzcyogQ2xhc3NlcyBvciBvYmplY3RzIHRvIGNhc3QKICAgICAgICAgKiBAY2hhaW5hYmxlCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGNhc3Q6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICB2YXIgZXh0ZW5kOwogICAgICAgICAgICB2YXIgY2FzdGVyOwoKICAgICAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgY2FzdGVyID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgZXh0ZW5kID0gY2FzdGVyLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CgogICAgICAgICAgICAgICAgLy8gY2FzdCBwcm90b3R5cGUgYW5kIHN0YXRpYyBtZXRob2RzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhc3RlciA9PT0gVFlQRV9GVU5DVElPTikgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5wcm90b3R5cGUuZXh0ZW5kIHx8IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbChjYXN0ZXIucHJvdG90eXBlLCB0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBjYXN0ZXIuYW5jZXN0b3IgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICAvLyBjYXN0IG9ubHkgcHJvdG90eXBlIG1ldGhvZHMKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLCB0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudCBhIGNsYXNzIGludG8gdGhlIGN1cnJlbnQgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBBbGwgcHJvdG90eXBlIGFuZCBzdGF0aWMgcHJvcGVydGllcyB3aWxsIGJlIGV4dGVuZGVkIGludG8KICAgICAgICAgKiBgdGhpc2AgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGltcGxlbWVudAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjbGFzcyogQ2xhc3NlcyBvciBvYmplY3RzIHRvIGNhc3QKICAgICAgICAgKiBAY2hhaW5hYmxlCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGltcGxlbWVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhc3QuY2FsbChhcmd1bWVudHNbaV0sIHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgc3RyaW5nIHZhbHVlIG9mIGNsYXNzCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIHRvU3RyaW5nCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgKyAnJzsKICAgICAgICB9CgogICAgfSk7CgogICAgcmV0dXJuIEJhc2U7CgoKfSkpOwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCi8qanNoaW50IC1XMDgzICovIC8vIGlubGluZSBmdW5jdGlvbnMgYXJlIHVzZWQgc2FmZWx5Ci8qKgogKiBBbHBhY2EgZm9ybXMgZW5naW5lIGZvciBqUXVlcnkKICovCihmdW5jdGlvbigkKSB7CgogICAgLyoqCiAgICAgKiBSZW5kZXJzIGFuIEFscGFjYSBmaWVsZCBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogVGhlIGJhc2ljIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIGNvbmZpZyk7CiAgICAgKiAgICAgPC9wcmU+CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogVGhlIGZ1bGwgc3ludGF4IGlzOgogICAgICoKICAgICAqIDxjb2RlPgogICAgICogICAgIDxwcmU+CiAgICAgKiAgICAgICAgIEFscGFjYShlbCwgewogICAgICogICAgICAgICAgICAgICJkYXRhIiA6IHtBbnl9IGZpZWxkIGRhdGEgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAic2NoZW1hIjoge09iamVjdH0gZmllbGQgc2NoZW1hIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgIm9wdGlvbnMiIDoge09iamVjdH0gZmllbGQgb3B0aW9ucyAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJ2aWV3Ijoge09iamVjdHxTdHJpbmd9IGZpZWxkIHZpZXcgKG9iamVjdCBvciBpZCByZWZlcmVuY2UpIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInJlbmRlciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlcGxhY2luZyBkZWZhdWx0IHJlbmRlcmluZyBtZXRob2QgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHBvc3QtcmVuZGVyaW5nICAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJlcnJvciI6IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVycm9yIGhhbmRsaW5nICAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJjb25uZWN0b3IiOiB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yIGZvciByZXRyaWV2aW5nIG9yIHN0b3JpbmcgZGF0YSwgc2NoZW1hLCBvcHRpb25zLCB2aWV3IGFuZCB0ZW1wbGF0ZXMuIChvcHRpb25hbCkKICAgICAqICAgICAgICAgfSk7CiAgICAgKiAgICAgPC9wcmU+CiAgICAgKiA8L2NvZGU+CiAgICAgKgogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIHZhciBBbHBhY2EgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIC8vIGlsbGVnYWwKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiWW91IG11c3Qgc3VwcGx5IGF0IGxlYXN0IG9uZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgY2FuIGVpdGhlciBiZSBhIERPTSBlbGVtZW50IGFnYWluc3Qgd2hpY2ggQWxwYWNhIHdpbGwgZ2VuZXJhdGUgYSBmb3JtIG9yIGl0IGNhbiBiZSBhIGZ1bmN0aW9uIG5hbWUuICBTZWUgaHR0cDovL3d3dy5hbHBhY2Fqcy5vcmcgZm9yIG1vcmUgZGV0YWlscy4iKTsKICAgICAgICB9CgogICAgICAgIC8vIGVsZW1lbnQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50IChlaXRoZXIgYSBzdHJpbmcgb3IgYSBET00gZWxlbWVudCkKICAgICAgICB2YXIgZWwgPSBhcmdzWzBdOwogICAgICAgIGlmIChlbCAmJiBBbHBhY2EuaXNTdHJpbmcoZWwpKSB7CiAgICAgICAgICAgIGVsID0gJCgiIyIgKyBlbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBvdGhlciBhcmd1bWVudHMgd2UgbWF5IHdhbnQgdG8gZmlndXJlIG91dAogICAgICAgIHZhciBkYXRhID0gbnVsbDsKICAgICAgICB2YXIgc2NoZW1hID0gbnVsbDsKICAgICAgICB2YXIgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgdmFyIHZpZXcgPSBudWxsOwogICAgICAgIHZhciBjYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIHJlbmRlcmVkQ2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgY29ubmVjdG9yID0gbnVsbDsKICAgICAgICB2YXIgbm90VG9wTGV2ZWwgPSBmYWxzZTsKICAgICAgICB2YXIgaW5pdGlhbFNldHRpbmdzID0ge307CgogICAgICAgIC8vIGlmIHRoZXNlIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCB0aGVuIGRhdGEsIHNjaGVtYSwgb3B0aW9ucyBhbmQgc291cmNlIGFyZSBsb2FkZWQgdmlhIGNvbm5lY3RvcgogICAgICAgIHZhciBkYXRhU291cmNlID0gbnVsbDsKICAgICAgICB2YXIgc2NoZW1hU291cmNlID0gbnVsbDsKICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSBudWxsOwoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB0aGUgQWxwYWNhIGZpZWxkIGluc3RhbmNlIGJvdW5kIHRvIHRoZSBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEZpcnN0IGNvbnNpZGVycyB0aGUgaW1tZWRpYXRlIGRvbSBlbGVtZW50IGFuZCB0aGVuIGxvb2tzIDEgbGV2ZWwgZGVlcCB0byBjaGlsZHJlbiBhbmQgdGhlbiB1cCB0byBwYXJlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICB2YXIgZmluZEV4aXN0aW5nQWxwYWNhQmluZGluZyA9IGZ1bmN0aW9uKGRvbUVsZW1lbnQsIHNraXBQaXZvdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IG51bGw7CgogICAgICAgICAgICAvLyBsb29rIGF0ICJkYXRhLWFscGFjYS1maWVsZC1pZCIKICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkSWQgPSAkKGRvbUVsZW1lbnQpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FGaWVsZElkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYWxwYWNhRmllbGQgPSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbYWxwYWNhRmllbGRJZF07CiAgICAgICAgICAgICAgICBpZiAoYWxwYWNhRmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBhbHBhY2FGaWVsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBsb29rIGF0ICJkYXRhLWFscGFjYS1mb3JtLWlkIgogICAgICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZm9ybUlkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIik7CiAgICAgICAgICAgICAgICBpZiAoZm9ybUlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdWJFbGVtZW50cyA9ICQoZG9tRWxlbWVudCkuZmluZCgiOmZpcnN0Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRmllbGRJZCA9ICQoc3ViRWxlbWVudHNbMF0pLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJGaWVsZElkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRmllbGQgPSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbc3ViRmllbGRJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBzdWJGaWVsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBmb3IgY2hpbGRyZW4gMHRoIGVsZW1lbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGREb21FbGVtZW50cyA9ICQoZWwpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkRG9tRWxlbWVudHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcoY2hpbGREb21FbGVtZW50c1swXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IGNoaWxkRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgZm91bmQsIGNoZWNrIHBhcmVudAogICAgICAgICAgICBpZiAoIWV4aXN0aW5nICYmICFza2lwUGl2b3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRFbCA9ICQoZWwpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZCA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcocGFyZW50RWwsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gcGFyZW50RmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIHNwZWNpYWxGdW5jdGlvbk5hbWVzID0gWyJnZXQiLCAiZXhpc3RzIiwgImRlc3Ryb3kiXTsKICAgICAgICB2YXIgaXNTcGVjaWFsRnVuY3Rpb24gPSAoYXJncy5sZW5ndGggPiAxICYmIEFscGFjYS5pc1N0cmluZyhhcmdzWzFdKSAmJiAoc3BlY2lhbEZ1bmN0aW9uTmFtZXMuaW5kZXhPZihhcmdzWzFdKSA+IC0xKSk7CgogICAgICAgIHZhciBleGlzdGluZyA9IGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcoZWwpOwogICAgICAgIGlmIChleGlzdGluZyB8fCBpc1NwZWNpYWxGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc1NwZWNpYWxGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBzcGVjaWFsIGZ1bmN0aW9uIG5hbWUKICAgICAgICAgICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lID0gYXJnc1sxXTsKICAgICAgICAgICAgICAgIGlmICgiZ2V0IiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJleGlzdHMiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleGlzdGluZyA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZGVzdHJveSIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5rbm93biBzcGVjaWFsIGZ1bmN0aW9uOiAiICsgc3BlY2lhbEZ1bmN0aW9uTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbmZpZyA9IG51bGw7CgogICAgICAgICAgICAvLyBqdXN0IGEgZG9tIGVsZW1lbnQsIG5vIG90aGVyIGFyZ3M/CiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ3JhYiB0aGUgZGF0YSBpbnNpZGUgb2YgdGhlIGVsZW1lbnQgYW5kIHVzZSB0aGF0IGZvciBjb25maWcKICAgICAgICAgICAgICAgIHZhciBqc29uU3RyaW5nID0gJChlbCkudGV4dCgpOwoKICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7CiAgICAgICAgICAgICAgICAkKGVsKS5odG1sKCIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoYXJnc1sxXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gYXJnc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogYXJnc1sxXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghY29uZmlnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIEFscGFjYSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRhdGEgPSBjb25maWcuZGF0YTsKICAgICAgICAgICAgc2NoZW1hID0gY29uZmlnLnNjaGVtYTsKICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zOwogICAgICAgICAgICB2aWV3ID0gY29uZmlnLnZpZXc7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLnJlbmRlcjsKICAgICAgICAgICAgaWYgKGNvbmZpZy5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayA9IGNvbmZpZy5wb3N0UmVuZGVyOwogICAgICAgICAgICBlcnJvckNhbGxiYWNrID0gY29uZmlnLmVycm9yOwogICAgICAgICAgICBjb25uZWN0b3IgPSBjb25maWcuY29ubmVjdG9yOwoKICAgICAgICAgICAgLy8gc291cmNlcwogICAgICAgICAgICBkYXRhU291cmNlID0gY29uZmlnLmRhdGFTb3VyY2U7CiAgICAgICAgICAgIHNjaGVtYVNvdXJjZSA9IGNvbmZpZy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSBjb25maWcub3B0aW9uc1NvdXJjZTsKICAgICAgICAgICAgdmlld1NvdXJjZSA9IGNvbmZpZy52aWV3U291cmNlOwoKICAgICAgICAgICAgLy8gb3RoZXIKICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkgewogICAgICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzWyJ1aSJdID0gY29uZmlnLnVpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSkgewogICAgICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzWyJ0eXBlIl0gPSBjb25maWcudHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZy5ub3RUb3BMZXZlbCkpIHsKICAgICAgICAgICAgICAgIG5vdFRvcExldmVsID0gY29uZmlnLm5vdFRvcExldmVsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBubyBlcnJvciBjYWxsYmFjayBpcyBwcm92aWRlZCwgd2UgZmFsbCBiYWNrIHRvIGEgYnJvd3NlciBhbGVydAogICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShlcnJvckNhbGxiYWNrKSkgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrID0gQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrOwogICAgICAgIH0KCiAgICAgICAgLy8gaW5zdGFudGlhdGUgdGhlIGNvbm5lY3RvciAoaWYgbm90IGFscmVhZHkgaW5zdGFudGlhdGVkKQogICAgICAgIC8vIGlmIGNvbmZpZyBpcyBwYXNzZWQgaW4gKGFzIG9iamVjdCksIHdlIGluc3RhbnRpYXRlCiAgICAgICAgaWYgKCFjb25uZWN0b3IgfHwgIWNvbm5lY3Rvci5jb25uZWN0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvcklkID0gImRlZmF1bHQiOwogICAgICAgICAgICB2YXIgY29ubmVjdG9yQ29uZmlnID0ge307CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoY29ubmVjdG9yKSkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KGNvbm5lY3RvcikgJiYgY29ubmVjdG9yLmlkKSB7CiAgICAgICAgICAgICAgICBjb25uZWN0b3JJZCA9IGNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgIGlmIChjb25uZWN0b3IuY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yQ29uZmlnID0gY29ubmVjdG9yLmNvbmZpZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkKTsKICAgICAgICAgICAgaWYgKCFDb25uZWN0b3JDbGFzcykgewogICAgICAgICAgICAgICAgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQsIGNvbm5lY3RvckNvbmZpZyk7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3Igc2Vjb25kIG9yIGRlZXBlciBsZXZlbCBvZiBmaWVsZHMsIGRlZmF1bHQgbG9hZGVyIHNob3VsZCBiZSB0aGUgb25lIHRvIGRvIGxvYWRBbGwKICAgICAgICAvLyBzaW5jZSBzY2hlbWEsIGRhdGEsIG9wdGlvbnMgYW5kIHZpZXcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICAgICAgICAvLyBVbmxlc3Mgd2Ugd2FudCB0byBsb2FkIGluZGl2aWR1YWwgZmllbGRzIChvdGhlciB0aGFuIHRoZSB0ZW1wbGF0ZXMpIHVzaW5nIHRoZSBwcm92aWRlZAogICAgICAgIC8vIGxvYWRlciwgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guIFRoZSBiZW5lZml0IGlzIHNhdmluZyB0aW1lIG9uIGxvYWRlciBmb3JtYXQgY2hlY2tpbmcuCgogICAgICAgIHZhciBsb2FkQWxsQ29ubmVjdG9yID0gY29ubmVjdG9yOwoKICAgICAgICBpZiAobm90VG9wTGV2ZWwpIHsKICAgICAgICAgICAgdmFyIExvYWRBbGxDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIpOwogICAgICAgICAgICBsb2FkQWxsQ29ubmVjdG9yID0gbmV3IExvYWRBbGxDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9CgogICAgICAgIC8vIHJlc2V0cyB0aGUgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgYmFjayB0byBkZWZhdWx0IHN0YXRlIGFmdGVyIGZpcnN0IHJlbmRlcgogICAgICAgIHZhciBfcmVzZXRJbml0VmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oZmllbGQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAvLyB3cmFwIHJlbmRlcmVkIGNhbGxiYWNrIHRvIGFsbG93IGZvciBVSSB0cmVhdG1lbnQgKGRvbSBmb2N1cywgZXRjKQogICAgICAgIHZhciBfcmVuZGVyZWRDYWxsYmFjayA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdG9wIGxldmVsLCBhcHBseSBhIHVuaXF1ZSBvYnNlcnZhYmxlIHNjb3BlIGlkCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWVsZC5vYnNlcnZhYmxlU2NvcGUgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgdGhlIHRvcC1tb3N0IGNvbnRyb2wKICAgICAgICAgICAgLy8gZmlyZSAicmVhZHkiIGV2ZW50IG9uIGV2ZXJ5IGNvbnRyb2wKICAgICAgICAgICAgLy8gZ28gZG93biBkZXB0aCBmaXJzdCBhbmQgZmlyZSB0byBsb3dlc3QgY29udHJvbHMgYmVmb3JlIHRyaWNrbGluZyBiYWNrIHVwCiAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KGZpZWxkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdG9wIGxldmVsIGFuZCBmb2N1cyBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLCB0aGVuIGF1dG8tc2V0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQob3B0aW9ucy5mb2N1cykgJiYgIWZpZWxkLnBhcmVudCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb2N1cyA9IEFscGFjYS5kZWZhdWx0Rm9jdXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGF1dG8tc2V0IHRoZSBmb2N1cz8KICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb2N1cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBkb0ZvY3VzID0gZnVuY3Rpb24oX19maWVsZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX19maWVsZC5zdXNwZW5kQmx1ckZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNDb250cm9sRmllbGQgJiYgZmllbGQuaXNBdXRvRm9jdXNhYmxlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZm9jdXMgb24gdGhpcyBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZvY3VzID0gdHJ1ZSwgdGhlbiBmb2N1cyBvbiB0aGUgZmlyc3QgY2hpbGQgY29udHJvbCBpZiBpdCBpcyBhdXRvLWZvY3VzYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vdCByZWFkLW9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgZmlyc3QgZWxlbWVudCBpbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW5bel0uaXNDb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQXV0b0ZvY3VzYWJsZSgpICYmICFmaWVsZC5jaGlsZHJlblt6XS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhmaWVsZC5jaGlsZHJlblt6XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKG9wdGlvbnMuZm9jdXMpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSBwYXRoIHRvIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmdldENvbnRyb2xCeVBhdGgob3B0aW9ucy5mb2N1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmlzQ29udHJvbEZpZWxkICYmIGNoaWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Gb2N1cyhjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBfcmVzZXRJbml0VmFsaWRhdGlvbkVycm9yKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZW5kZXJlZENhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZW5kZXJlZENhbGxiYWNrKGZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGxvYWRBbGxDb25uZWN0b3IubG9hZEFsbCh7CiAgICAgICAgICAgICJkYXRhIjogZGF0YSwKICAgICAgICAgICAgInNjaGVtYSI6IHNjaGVtYSwKICAgICAgICAgICAgIm9wdGlvbnMiOiBvcHRpb25zLAogICAgICAgICAgICAidmlldyI6IHZpZXcsCiAgICAgICAgICAgICJkYXRhU291cmNlIjogZGF0YVNvdXJjZSwKICAgICAgICAgICAgInNjaGVtYVNvdXJjZSI6IHNjaGVtYVNvdXJjZSwKICAgICAgICAgICAgIm9wdGlvbnNTb3VyY2UiOiBvcHRpb25zU291cmNlLAogICAgICAgICAgICAidmlld1NvdXJjZSI6IHZpZXdTb3VyY2UKICAgICAgICB9LCBmdW5jdGlvbihsb2FkZWREYXRhLCBsb2FkZWRPcHRpb25zLCBsb2FkZWRTY2hlbWEsIGxvYWRlZFZpZXcpIHsKCiAgICAgICAgICAgIC8vIGZvciBjYXNlcyB3aGVyZSB0aGluZ3MgY291bGQgbm90IGJlIGxvYWRlZCB2aWEgc291cmNlIGxvYWRlcnMsIGZhbGwgYmFjayB0byB3aGF0IG1heSBoYXZlIGJlZW4gcGFzc2VkCiAgICAgICAgICAgIC8vIGluIGRpcmVjdGx5IGFzIHZhbHVlcwoKICAgICAgICAgICAgbG9hZGVkRGF0YSA9IGxvYWRlZERhdGEgPyBsb2FkZWREYXRhIDogZGF0YTsKICAgICAgICAgICAgbG9hZGVkU2NoZW1hID0gbG9hZGVkU2NoZW1hID8gbG9hZGVkU2NoZW1hOiBzY2hlbWE7CiAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMgPSBsb2FkZWRPcHRpb25zID8gbG9hZGVkT3B0aW9ucyA6IG9wdGlvbnM7CiAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRWaWV3ID8gbG9hZGVkVmlldyA6IHZpZXc7CgogICAgICAgICAgICAvLyBzb21lIGRlZmF1bHRzIGZvciB0aGUgY2FzZSB3aGVyZSBkYXRhIGlzIG51bGwKICAgICAgICAgICAgLy8gaWYgc2NoZW1hICsgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkLCB3ZSBhc3N1bWUgYSB0ZXh0IGZpZWxkCgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkRGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRTY2hlbWEpICYmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zKSB8fCBBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zLnR5cGUpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWREYXRhID0gIiI7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShsb2FkZWRPcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMgPSAidGV4dCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgJiYgQWxwYWNhLmlzT2JqZWN0KG9wdGlvbnMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkT3B0aW9ucy50eXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxvYWRlZE9wdGlvbnMudmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9hZGVkVmlldyA9IGxvYWRlZE9wdGlvbnMudmlldzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaW5pdCBhbHBhY2EKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbml0KGVsLCBsb2FkZWREYXRhLCBsb2FkZWRPcHRpb25zLCBsb2FkZWRTY2hlbWEsIGxvYWRlZFZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIF9yZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sobG9hZEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWVzcGFjZSBOYW1lc3BhY2UgZm9yIGFsbCBBbHBhY2EgRmllbGQgQ2xhc3MgSW1wbGVtZW50YXRpb25zLgogICAgICovCiAgICBBbHBhY2EuRmllbGRzID0geyB9OwoKICAgIC8qKgogICAgICogQG5hbWVzcGFjZSBOYW1lc3BhY2UgZm9yIGFsbCBBbHBhY2EgQ29ubmVjdG9yIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkNvbm5lY3RvcnMgPSB7IH07CgogICAgQWxwYWNhLkV4dGVuZCA9ICQuZXh0ZW5kOwoKICAgIEFscGFjYS5DcmVhdGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgIGFyZ3MudW5zaGlmdCh7fSk7CgogICAgICAgIHJldHVybiAkLmV4dGVuZC5hcHBseSh0aGlzLCBhcmdzKTsKICAgIH07CgogICAgLy8gc3RhdGljIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMKICAgIEFscGFjYS5FeHRlbmQoQWxwYWNhLAogICAgLyoqIEBsZW5kcyBBbHBhY2EgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBub25BcnJheSBBIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG91dCBvZiB0aGUgbm9uLWFycmF5IHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIG1ha2VBcnJheSA6IGZ1bmN0aW9uKG5vbkFycmF5KSB7CiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub25BcnJheSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGZ1bmN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBmdW5jdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNTdHJpbmc6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICJzdHJpbmciKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gIUFscGFjYS5pc1VuZGVmaW5lZChvYmopICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYSBwbGFpbiwgbm9uLXByb3RvdHlwZWQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBwbGFpbiBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICQuaXNQbGFpbk9iamVjdChvYmopOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBudW1iZXIuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIG51bWJlciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzTnVtYmVyOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAibnVtYmVyIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYXJyYXksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0FycmF5OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBib29sZWFuLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBib29sZWFuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNCb29sZWFuOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAiYm9vbGVhbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHVuZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVW5kZWZpbmVkOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09ICJ1bmRlZmluZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdHJpcHMgYW55IGV4Y2VzcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4gdGV4dC4KICAgICAgICAgKiBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzdHIKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gdHJpbW1lZCBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICB0cmltOiBmdW5jdGlvbih0ZXh0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSB0ZXh0OwoKICAgICAgICAgICAgaWYgKHRyaW1tZWQgJiYgQWxwYWNhLmlzU3RyaW5nKHRyaW1tZWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cmltbWVkID0gdHJpbW1lZC5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJpbW1lZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBhIHNhZmUgY29udmVyc2lvbiBvZiBhbiBIVE1MIHRleHR1YWwgc3RyaW5nIGludG8gYSBET00gb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHgKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIHNhZmVEb21QYXJzZTogZnVuY3Rpb24oeCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4ICYmIEFscGFjYS5pc1N0cmluZyh4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgeCA9IEFscGFjYS50cmltKHgpOwoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZG9tCiAgICAgICAgICAgICAgICB2YXIgY29udmVydGVkID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9ICQoeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIGFub3RoZXIgYXR0ZW1wdCB0byBhY2NvdW50IGZvciBzYWZldHkgaW4gc29tZSBicm93c2VycwogICAgICAgICAgICAgICAgICAgIHggPSAiPGRpdj4iICsgeCArICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpLmNoaWxkcmVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciBhIHZhcmlhYmxlIGlzIGVtcHR5LgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0gW2Jvb2xlYW5dIGluY2x1ZGVGdW5jdGlvbnMgd2hldGhlciB0byBpbmNsdWRlIGZ1bmN0aW9ucyBpbiBhbnkgY291bnRzCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNFbXB0eTogZnVuY3Rpb24ob2JqLCBpbmNsdWRlRnVuY3Rpb25zKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IHNlbGYuY291bnRQcm9wZXJ0aWVzKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucyk7CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmoKICAgICAgICAgKiBAcGFyYW0gaW5jbHVkZUZ1bmN0aW9ucwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBjb3VudFByb3BlcnRpZXM6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICB2YXIgY291bnQgPSAwOwoKICAgICAgICAgICAgaWYgKG9iaiAmJiBBbHBhY2EuaXNPYmplY3Qob2JqKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBvYmopCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRnVuY3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvYmpba10pICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb2R1Y2VzIGEgY29weSBvZiB0aGUgZ2l2ZW4gSlMgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYSBzaW1wbGUgYXJyYXkgb3IgYSBzaW1wbGUgb2JqZWN0LCB0aGVuIGEgcHVyZSBjb3B5IGlzIHByb2R1Y2VkLgogICAgICAgICAqCiAgICAgICAgICogSWYgaXQncyBhIGNvbXBsZXggb2JqZWN0IG9yIGEgZnVuY3Rpb24sIHRoZW4gdGhlIHJlZmVyZW5jZSBpcyBjb3BpZWQgKGkuZS4gbm90IHRydWx5IGEgY29weSkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGhpbmcKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIGNvcHlPZjogZnVuY3Rpb24odGhpbmcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29weSA9IHRoaW5nOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29weSA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29weS5wdXNoKEFscGFjYS5jb3B5T2YodGhpbmdbaV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodGhpbmcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBEYXRlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGRhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpbmcuZ2V0VGltZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaW5nIGluc3RhbmNlb2YgUmVnRXhwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaW5nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaW5nLm5vZGVUeXBlICYmICJjbG9uZU5vZGUiIGluIHRoaW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlCiAgICAgICAgICAgICAgICAgICAgY29weSA9IHRoaW5nLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdCh0aGluZykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29weSA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaW5nKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmhhc093blByb3BlcnR5KGspKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2tdID0gQWxwYWNhLmNvcHlPZih0aGluZ1trXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCdzIHNvbWUgb3RoZXIga2luZCBvZiBvYmplY3Qgc28gd2UganVzdCBkbyBhIHJlZmVyZW50aWFsIGNvcHkKICAgICAgICAgICAgICAgICAgICAvLyBpbiBvdGhlciB3b3Jkcywgbm90IGEgY29weQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY29weTsKICAgICAgICB9LAoKICAgICAgICBjb3B5SW50bzogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShpKSAmJiAhdGhpcy5pc0Z1bmN0aW9uKHRoaXNbaV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IHNvdXJjZVtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2VzLiAgQWxpYXMgZm9yIGNvcHlPZigpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG9iamVjdAogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGNsb25lT2JqZWN0OiBmdW5jdGlvbihvYmplY3QpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNvcHlPZihvYmplY3QpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNwbGljZXMgYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlIFNvdXJjZSBzdHJpbmcgdG8gYmUgc3BsaWNlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZVBvaW50IFNwbGljZSBsb2NhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3BsaWNlIFN0cmluZyB0byBiZSBzcGxpY2VkIGluLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNwbGljZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgc3BsaWNlSW46IGZ1bmN0aW9uKHNvdXJjZSwgc3BsaWNlUG9pbnQsIHNwbGljZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnN0cmluZygwLCBzcGxpY2VQb2ludCkgKyBzcGxpY2UgKyBzb3VyY2Uuc3Vic3RyaW5nKHNwbGljZVBvaW50LCBzb3VyY2UubGVuZ3RoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYWN0cyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciBTb3VyY2UgYXJyYXkgdG8gYmUgY29tcGFjdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gQ29tcGFjdGVkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGNvbXBhY3RBcnJheTogZnVuY3Rpb24oYXJyKSB7CiAgICAgICAgICAgIHZhciBuID0gW10sIGwgPSBhcnIubGVuZ3RoLGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghbGFuZy5pc051bGwoYXJyW2ldKSAmJiAhbGFuZy5pc1VuZGVmaW5lZChhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGFycltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhY2NlbnRzIGZyb20gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFNvdXJjZSBzdHJpbmcuCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gQ2xlYW5lZCBzdHJpbmcgd2l0aG91dCBhY2NlbnRzLgogICAgICAgICAqLwogICAgICAgIHJlbW92ZUFjY2VudHM6IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1vDoMOhw6LDo8Okw6VdL2csICJhIikucmVwbGFjZSgvW8Oow6nDqsOrXS9nLCAiZSIpLnJlcGxhY2UoL1vDrMOtw67Dr10vZywgImkiKS5yZXBsYWNlKC9bw7LDs8O0w7XDtl0vZywgIm8iKS5yZXBsYWNlKC9bw7nDusO7w7xdL2csICJ1IikucmVwbGFjZSgvW8O9w79dL2csICJ5IikucmVwbGFjZSgvW8OxXS9nLCAibiIpLnJlcGxhY2UoL1vDp10vZywgImMiKS5yZXBsYWNlKC9bxZNdL2csICJvZSIpLnJlcGxhY2UoL1vDpl0vZywgImFlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gZWwKICAgICAgICAgKiBAcGFyYW0gYXJyCiAgICAgICAgICogQHBhcmFtIGZuCiAgICAgICAgICovCiAgICAgICAgaW5kZXhPZjogZnVuY3Rpb24oZWwsIGFyciwgZm4pIHsKICAgICAgICAgICAgdmFyIGwgPSBhcnIubGVuZ3RoLGk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0Z1bmN0aW9uKGZuKSkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZWx0CiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXJyRWx0CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oZWx0LCBhcnJFbHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0ID09PSBhcnJFbHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoZm4uY2FsbCh7fSwgZWwsIGFycltpXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFN0YXRpYyBjb3VudGVyIGZvciBnZW5lcmF0aW5nIGEgdW5pcXVlIElELgogICAgICAgICAqLwogICAgICAgIHVuaXF1ZUlkQ291bnRlcjogMCwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBMb2NhbGUuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdExvY2FsZTogImVuX1VTIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byBzZXQgZm9jdXMgYnkgZGVmYXVsdAogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRGb2N1czogdHJ1ZSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBmdW5jdGlvbiB0byB1c2UgZm9yIGVudW1lcmF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U29ydDogZnVuY3Rpb24oYSwgYikgewoKICAgICAgICAgICAgaWYgKGEudGV4dCA+IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYS50ZXh0IDwgYi50ZXh0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGRlZmF1bHQgTG9jYWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBOZXcgZGVmYXVsdCBsb2NhbGUuCiAgICAgICAgICovCiAgICAgICAgc2V0RGVmYXVsdExvY2FsZTogZnVuY3Rpb24obG9jYWxlKSB7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExvY2FsZSA9IGxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaWVsZCBUeXBlIHRvIFNjaGVtYSBUeXBlIE1hcHBpbmdzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBmaWVsZCB0eXBlIHRvIHNjaGVtYSBkYXRhIHR5cGUgbWFwcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzY2hlbWFUeXBlIFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZzogZnVuY3Rpb24oc2NoZW1hVHlwZSwgZmllbGRUeXBlKSB7CiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlICYmIGZpZWxkVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nW3NjaGVtYVR5cGVdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgRm9ybWF0IE1hcHBpbmdzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmc6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBmaWVsZCB0eXBlIHRvIHNjaGVtYSBmb3JtYXQgbWFwcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgU2NoZW1hIGZvcm1hdC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGRUeXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiBmdW5jdGlvbihmb3JtYXQsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoZm9ybWF0ICYmIGZpZWxkVHlwZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nW2Zvcm1hdF0gPSBmaWVsZFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHNjaGVtYSB0eXBlIG9mIGEgdmFyaWFibGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBUaGUgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gU2NoZW1hIHR5cGUgb2YgdGhlIHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYVR5cGU6IGZ1bmN0aW9uKGRhdGEpIHsKCiAgICAgICAgICAgIHZhciBzY2hlbWFUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG1hcCBkYXRhIHR5cGVzIHRvIGRlZmF1bHQgZmllbGQgdHlwZXMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gInN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJvYmplY3QiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyhkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJudW1iZXIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0Jvb2xlYW4oZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAiYm9vbGVhbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTGFzdCBjaGVjayBmb3IgZGF0YSB0aGF0IGNhcnJpZXMgZnVuY3Rpb25zIC0tIEdpdGFuYUNvbm5lY3RvciBjYXNlLgogICAgICAgICAgICBpZiAoIXNjaGVtYVR5cGUgJiYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYSBiZXN0IGd1ZXNzIGF0IHRoZSBvcHRpb25zIGZpZWxkIHR5cGUgaWYgbm9uZSBwcm92aWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZmllbGQgdHlwZQogICAgICAgICAqLwogICAgICAgIGd1ZXNzT3B0aW9uc1R5cGU6IGZ1bmN0aW9uKHNjaGVtYSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0eXBlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzY2hlbWEgJiYgdHlwZW9mKHNjaGVtYVsiZW51bSJdKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzY2hlbWFbImVudW0iXS5sZW5ndGggPiAzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2VsZWN0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhZGlvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWEudHlwZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBmb3JtYXQgZGVmaW5lZAogICAgICAgICAgICBpZiAoc2NoZW1hLmZvcm1hdCAmJiBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHlwZSA9IEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nW3NjaGVtYS5mb3JtYXRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbHBhY2EgVmlld3MuCiAgICAgICAgICovCiAgICAgICAgdmlld3M6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB2YWxpZCB2aWV3IGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gQSB2YWxpZCB1bmlxdWUgdmlldyBpZC4KICAgICAgICAgKi8KICAgICAgICBnZW5lcmF0ZVZpZXdJZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICJ2aWV3LSIgKyB0aGlzLmdlbmVyYXRlSWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB2aWV3IHdpdGggdGhlIGZyYW1ld29yay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3T2JqZWN0CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJWaWV3OiBmdW5jdGlvbih2aWV3T2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXdPYmplY3QuaWQ7CgogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHZpZXcgd2l0aCBtaXNzaW5nIHZpZXcgaWQ6ICIgKyB2aWV3SWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZXhpc3RpbmdWaWV3ID0gdGhpcy52aWV3c1t2aWV3SWRdOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdWaWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QoZXhpc3RpbmdWaWV3LCB2aWV3T2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHZpZXdPYmplY3Q7CgogICAgICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0LnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlcyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IHByZWNvbXBpbGVkIHZpZXdzLCBmbGFnIHRoZW0KICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZHMgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5pZHMoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5naW5lSWRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZCA9IGVuZ2luZUlkc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhc2sgdGhlIGVuZ2luZSBpZiBpdCBoYXMgYW55IGNhY2hlIGtleXMgZm9yIHZpZXcgdGVtcGxhdGVzIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IGVuZ2luZS5maW5kQ2FjaGVLZXlzKHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHogPSAwOyB6IDwgY2FjaGVLZXlzLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBBbHBhY2Euc3BsaXRDYWNoZUtleShjYWNoZUtleXNbel0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcHJlY29tcGlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdPYmplY3QudGVtcGxhdGVzW3BhcnRzLnRlbXBsYXRlSWRdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogZW5naW5lSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleXNbel0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYSBub3JtYWxpemVkIHZpZXcgYnkgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAqLwogICAgICAgIGdldE5vcm1hbGl6ZWRWaWV3OiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNvbHZlcyB3aGljaCB2aWV3IGhhbmRsZXMgYSBnaXZlbiB0aGVtZSBhbmQgdHlwZSBvZiBvcGVyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdWkKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBsb29rdXBOb3JtYWxpemVkVmlldzogZnVuY3Rpb24odWksIHR5cGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGhlVmlld0lkID0gbnVsbDsKCiAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiB0aGlzLm5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLm5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3LnVpID09PSB1aSAmJiB2aWV3LnR5cGUgPT09IHR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhlVmlld0lkID0gdmlld0lkOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhlVmlld0lkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIHRlbXBsYXRlIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZUlkIFRlbXBsYXRlIGlkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdGVtcGxhdGUgRWl0aGVyIHRoZSB0ZXh0IG9mIHRoZSB0ZW1wbGF0ZSBvciBhbiBvYmplY3QgY29udGFpbmluZyB7ICJ0eXBlIjogIjx0ZW1wbGF0ZUVuZ2luZUlkZW50aWZpZXI+IiwgInRlbXBsYXRlIjogIjxtYXJrdXA+IiB9CiAgICAgICAgICogQHBhcmFtIFtTdHJpbmddIHZpZXdJZCB0aGUgb3B0aW9uYWwgdmlldyBpZC4gIElmIG5vbmUgaXMgcHJvdmlkZWQsIHRoZW4gYWxsIHJlZ2lzdHJhdGlvbnMgYXJlIHRvIHRoZSBkZWZhdWx0IHZpZXcuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGVJZCwgdGVtcGxhdGUsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSA9IHRlbXBsYXRlOwoKICAgICAgICAgICAgLy8gaWYgbm9ybWFsaXplZCB2aWV3cyBoYXZlIGFscmVhZHkgYmVlbiBjb21wdXRlZCwgdGhlbiB3aXBlIHRoZW0gZG93bgogICAgICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGVtIHRvIGJlIHJlLWNvbXB1dGVkIG9uIHRoZSBuZXh0IHJlbmRlciBhbmQgYWxsb3dzIHRoaXMgdGVtcGxhdGUgdG8gcGFydGljaXBhdGUKICAgICAgICAgICAgaWYgKEFscGFjYS5jb3VudFByb3BlcnRpZXMoQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Eubm9ybWFsaXplZFZpZXdzID0ge307CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbGlzdCBvZiB0ZW1wbGF0ZXMgdG8gYSB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdGVtcGxhdGVzIFRlbXBsYXRlcyBiZWluZyByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSB0ZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlclRlbXBsYXRlczogZnVuY3Rpb24odGVtcGxhdGVzLCB2aWV3SWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB0ZW1wbGF0ZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJUZW1wbGF0ZSh0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZXNbdGVtcGxhdGVJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBtZXNzYWdlIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgSWQgb2YgdGhlIG1lc3NhZ2UgYmVpbmcgcmVnaXN0ZXJlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIHJlZ2lzdGVyZWQKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmlld0lkIElkIG9mIHRoZSB2aWV3IHRoYXQgdGhlIG1lc3NhZ2UgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2VJZCwgbWVzc2FnZSwgdmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgbm8gdmlldyBzcGVjaWZpZWQsIGZhbGwgYmFjayB0byB0aGUgYmFzZSB2aWV3IHdoaWNoIGlzICJiYXNlIgogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gImJhc2UiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdID0ge307CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0uaWQgPSB2aWV3SWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0ubWVzc2FnZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzW21lc3NhZ2VJZF0gPSBtZXNzYWdlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBtZXNzYWdlcyB3aXRoIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2VzIE1lc3NhZ2VzIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlcyBiZWluZyByZWdpc3RlcmVkIHRvLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyTWVzc2FnZXM6IGZ1bmN0aW9uKG1lc3NhZ2VzLCB2aWV3SWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIG1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXMuaGFzT3duUHJvcGVydHkobWVzc2FnZUlkKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlKG1lc3NhZ2VJZCwgbWVzc2FnZXNbbWVzc2FnZUlkXSwgdmlld0lkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgZGF0ZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdERhdGVGb3JtYXQ6ICJNTS9ERC9ZWVlZIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCB0aW1lIGZvcm1hdC4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0VGltZUZvcm1hdDogIkhIOm1tOnNzIiwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVndWxhciBleHByZXNzaW9ucyBmb3IgZmllbGRzLgogICAgICAgICAqLwogICAgICAgIHJlZ2V4cHM6CiAgICAgICAgewogICAgICAgICAgICAiZW1haWwiOiAvXlthLXowLTkhXCNcJCUmJ1wqXC1cLz1cP1wrXC1cXl9gXHtcfFx9fl0rKD86XC5bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKykqQCg/OlthLXowLTldKD86W2EtejAtOS1dKlthLXowLTldKT9cLikrW2Etel17Miw2fSQvaSwKICAgICAgICAgICAgInVybCI6IC9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvW2EtejAtOV0rKFtcLVwuXXsxfVthLXowLTldKykqXC5bYS16XXsyLDV9KFw6WzAtOV17MSw1fSk/KFwvLiopPyQvaSwKICAgICAgICAgICAgImludHJhbmV0LXVybCI6IC9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvW2EtejAtOV0rKFtcLVwuXXsxfVthLXowLTldKykqKFw6WzAtOV17MSw1fSk/KFwvLiopPyQvaSwKICAgICAgICAgICAgInBhc3N3b3JkIjogL15bMC05YS16QS1aXHgyMC1ceDdFXSokLywKICAgICAgICAgICAgImRhdGUiOiAvXigwWzEtOV18MVswMTJdKVstIC8uXSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVstIC8uXVxkXGQkLywKICAgICAgICAgICAgImludGVnZXIiOiAvXihbXCtcLV0/KFsxLTldXGQqKXwwKSQvLAogICAgICAgICAgICAibnVtYmVyIjovXihbXCtcLV0/KCgoWzAtOV0rKFwuKT8pfChbMC05XSpcLlswLTldKykpKFtlRV1bKy1dP1swLTldKyk/KSkkLywKICAgICAgICAgICAgInBob25lIjovXihcRD8oXGR7M30pXEQ/XEQ/KFxkezN9KVxEPyhcZHs0fSkpPyQvLAogICAgICAgICAgICAiaXB2NCI6L14oPzoxXGQ/XGQ/fDIoPzpbMC00XVxkP3xbNjc4OV18NVswLTVdPyk/fFszLTldXGQ/fDApKD86XC4oPzoxXGQ/XGQ/fDIoPzpbMC00XVxkP3xbNjc4OV18NVswLTVdPyk/fFszLTldXGQ/fDApKXszfSQvLAogICAgICAgICAgICAiemlwY29kZS1maXZlIjogL14oXGR7NX0pPyQvLAogICAgICAgICAgICAiemlwY29kZS1uaW5lIjogL14oXGR7NX0oLVxkezR9KT8pPyQvLAogICAgICAgICAgICAid2hpdGVzcGFjZSI6IC9eXHMrJC8KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXAgb2YgaW5zdGFudGlhdGVkIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZEluc3RhbmNlczoge30sCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcHMgb2YgZmllbGQgdHlwZXMgdG8gZmllbGQgY2xhc3MgaW1wbGVtZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGZpZWxkQ2xhc3NSZWdpc3RyeToge30sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgdGhpcy5maWVsZENsYXNzUmVnaXN0cnlbdHlwZV0gPSBmaWVsZENsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHR5cGUgb2YgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgY2xhc3MgbWFwcGVkIHRvIGZpZWxkIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnlbdHlwZV07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZmllbGQgdHlwZSBpZCBmb3IgYSBnaXZlbiBmaWVsZCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkZpZWxkfSBmaWVsZENsYXNzIEZpZWxkIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRmllbGQgdHlwZSBvZiB0aGUgZmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRDbGFzc1R5cGU6IGZ1bmN0aW9uKGZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgZm9yICh2YXIgdHlwZSBpbiB0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5Lmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID09PSBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGNvbm5lY3RvciB0eXBlcyB0byBjb25uZWN0b3IgY2xhc3MgaW1wbGVtZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RvckNsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgY29ubmVjdG9yIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBjQ29ubmVjdCB0eXBlCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3JDbGFzcyBDb25uZWN0b3IgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSwgY29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gY29ubmVjdG9yQ2xhc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgY29ubmVjdG9yIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBDb25uZWN0IHR5cGUuCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5Db25uZWN0b3J9IENvbm5lY3RvciBjbGFzcyBtYXBwZWQgdG8gY29ubmVjdCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldENvbm5lY3RvckNsYXNzOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RvckNsYXNzUmVnaXN0cnlbdHlwZV07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgZWFjaCBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gcmVwbGFjZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBTb3VyY2Ugc3RyaW5nIGJlaW5nIHJlcGxhY2VkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXBsYWNlIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcmVwbGFjaW5nLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB3aXRoX3RoaXMgUmVwbGFjZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXBsYWNlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgcmVwbGFjZUFsbDogZnVuY3Rpb24odGV4dCwgcmVwbGFjZSwgd2l0aF90aGlzKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChyZXBsYWNlLCAnZycpLCB3aXRoX3RoaXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCB3aXRoIGEgZ2l2ZW4gdGFnIG5hbWUsIGRvbS9zdHlsZSBhdHRyaWJ1dGVzIGFuZCBjbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0YWcgVGFnIG5hbWUuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gZG9tQXR0cmlidXRlcyBET00gYXR0cmlidXRlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzdHlsZUF0dHJpYnV0ZXMgU3R5bGUgYXR0cmlidXRlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBjbGFzc05hbWVzIENsYXNzIG5hbWVzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTmV3IGVsZW1lbnQgd2l0aCB0aGUgdGFnIG5hbWUgYW5kIGFsbCBvdGhlciBwcm92aWRlZCBhdHRyaWJ1dGVzLgogICAgICAgICAqLwogICAgICAgIGVsZW1lbnQ6IGZ1bmN0aW9uKHRhZywgZG9tQXR0cmlidXRlcywgc3R5bGVBdHRyaWJ1dGVzLCBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgIHZhciBlbCA9ICQoIjwiICsgdGFnICsgIi8+Iik7CgogICAgICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuYXR0cihkb21BdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3R5bGVBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBlbC5jc3Moc3R5bGVBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xhc3NOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgYSB0ZW1wbGF0ZSB3aXRoIGxpc3Qgb2YgcmVwbGFjZW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlIFRlbXBsYXRlIGJlaW5nIHByb2Nlc3NlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3Vic3RpdHV0aW9ucyBMaXN0IG9mIHN1YnN0aXR1dGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBSZXBsYWNlZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50RnJvbVRlbXBsYXRlOiBmdW5jdGlvbih0ZW1wbGF0ZSwgc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICB2YXIgaHRtbCA9IHRlbXBsYXRlOwogICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBzdWJzdGl0dXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IEFscGFjYS5yZXBsYWNlQWxsKGh0bWwsICIkeyIgKyB4ICsgIn0iLCBzdWJzdGl0dXRpb25zW3hdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJChodG1sKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHVuaXF1ZSBhbHBhY2EgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFscGFjYS51bmlxdWVJZENvdW50ZXIrKzsKICAgICAgICAgICAgcmV0dXJuICJhbHBhY2EiICsgQWxwYWNhLnVuaXF1ZUlkQ291bnRlcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJvdmlkZSBZQUhPTyBsYXRlciBsaWtlIGNhcGFiaWxpdGllcy4KICAgICAgICAgKi8KICAgICAgICBsYXRlcjogZnVuY3Rpb24od2hlbiwgbywgZm4sIGRhdGEsIHBlcmlvZGljKSB7CiAgICAgICAgICAgIHdoZW4gPSB3aGVuIHx8IDA7CiAgICAgICAgICAgIG8gPSBvIHx8IHt9OwogICAgICAgICAgICB2YXIgbSA9IGZuLCBkID0gJC5tYWtlQXJyYXkoZGF0YSksIGYsIHI7CgogICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgbSA9IG9bZm5dOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIW0pIHsKICAgICAgICAgICAgICAgIC8vIFRocm93IGFuIGVycm9yIGFib3V0IHRoZSBtZXRob2QKICAgICAgICAgICAgICAgIHRocm93IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVHlwZUVycm9yJywKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4iCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbS5hcHBseShvLCBkKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHIgPSAocGVyaW9kaWMpID8gc2V0SW50ZXJ2YWwoZiwgd2hlbikgOiBzZXRUaW1lb3V0KGYsIHdoZW4pOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiByLAogICAgICAgICAgICAgICAgaW50ZXJ2YWw6IHBlcmlvZGljLAogICAgICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYW4gc3RyaW5nIGVuZHMgd2l0aCBhIGdpdmVuIHN1ZmZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWZmaXggU3VmZml4LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBlbmRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHN1ZmZpeCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5pbmRleE9mKHN1ZmZpeCwgdGV4dC5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYW4gc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gcHJlZml4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHN0cmluZyBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeCBQcmVmaXgKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBzdGFydHNXaXRoIDogZnVuY3Rpb24odGV4dCwgcHJlZml4KSB7CiAgICAgICAgICAgIC8vcmV0dXJuICh0ZXh0Lm1hdGNoKCJeIiArIHByZWZpeCkgPT0gcHJlZml4KTsKICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgYSB2YXJpYWJsZSBpcyBhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBVUkksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VyaSA6IGZ1bmN0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzU3RyaW5nKG9iaikgJiYgKEFscGFjYS5zdGFydHNXaXRoKG9iaiwgImh0dHA6Ly8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgImh0dHBzOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICIvIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICIuLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi4vIikpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGEgc3ViLWVsZW1lbnQgZnJvbSBhbiBvYmplY3QgdXNpbmcgYSBrZXlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBPYmplY3QgdG8gYmUgdHJhdmVyc2VkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGtleXMgRWl0aGVyIGFuIGFycmF5IG9mIHRva2VucyBvciBhIGRvdC1kZWxpbWl0ZWQgc3RyaW5nIChpLmUuICJkYXRhLnVzZXIuZmlyc3RuYW1lIikKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VicHJvcCBPcHRpb25hbCBzdWJwcm9wZXJ0eSB0byB0cmF2ZXJzZSAoaS5lLi4gImRhdGEucHJvcGVydGllcy51c2VyLnByb3BlcnRpZXMuZmlyc3RuYW1lIikKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFN1YiBlbGVtZW50IG1hcHBlZCB0byB0aGUgZ2l2ZW4ga2V5IHBhdGgKICAgICAgICAgKi8KICAgICAgICB0cmF2ZXJzZU9iamVjdCA6IGZ1bmN0aW9uKG9iamVjdCwga2V5cywgc3VicHJvcCkgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGtleXMpKSB7CiAgICAgICAgICAgICAgICBrZXlzID0ga2V5cy5zcGxpdCgiLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZWxlbWVudCA9IG51bGw7CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gb2JqZWN0OwoKICAgICAgICAgICAgdmFyIGtleSA9IG51bGw7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGtleSA9IGtleXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIGlmIChzdWJwcm9wICYmIGtleSA9PT0gc3VicHJvcCkgewogICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY3VycmVudFtrZXldKSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAga2V5cyA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlIChrZXlzLmxlbmd0aCA+IDApOwoKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHVwb24gZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheQogICAgICAgICAqIFRoZSBlbGVtZW50IG9mIHRoZSBhcnJheSBiZWNvbWVzIHRoZSAidGhpcyIgdmFyaWFibGUgaW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gZGF0YSBFaXRoZXIgYW4gYXJyYXkgb3IgYW4gb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBGdW5jdGlvbiB0byBiZSBleGVjdXRlZC4KICAgICAgICAgKi8KICAgICAgICBlYWNoIDogZnVuY3Rpb24oZGF0YSwgZnVuYykgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoZGF0YVtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoZGF0YVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uIG9iajIgaW50byBvYmoxIHVzaW5nIGEgcmVjdXJzaXZlIGFwcHJvYWNoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajEgRGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyIFNvdXJjZSBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdmFsaWRLZXlGdW5jdGlvbiBGdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGluY2x1ZGUgYSBnaXZlbiBrZXkgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTWVyZ2VkIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBtZXJnZSA6IGZ1bmN0aW9uKG9iajEsIG9iajIsIHZhbGlkS2V5RnVuY3Rpb24pIHsKICAgICAgICAgICAgaWYgKCFvYmoxKSB7CiAgICAgICAgICAgICAgICBvYmoxID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iajIpIHsKICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkS2V5RnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkS2V5RnVuY3Rpb24oa2V5KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdChvYmoyW2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iajFba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gQWxwYWNhLm1lcmdlKG9iajFba2V5XSwgb2JqMltrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG9iajE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWVyZ2VzIGpzb24gInNvdXJjZSIgaW50byAidGFyZ2V0IiB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4gVGhlIG1lcmdlIHdpbGwgaW5jbHVkZSBlbXB0eSB2YWx1ZXMKICAgICAgICAgKiBvZiBvYmoyIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRhcmdldCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTWVyZ2VkIG9iamVjdAogICAgICAgICAqLwogICAgICAgIG1lcmdlT2JqZWN0IDogZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKCiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0YXJnZXQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHNvdXJjZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm1lcmdlT2JqZWN0Mihzb3VyY2UsIHRhcmdldCk7CgogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH0sCgogICAgICAgIG1lcmdlT2JqZWN0MjogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNBcnJheSA9IEFscGFjYS5pc0FycmF5OwogICAgICAgICAgICB2YXIgaXNPYmplY3QgPSBBbHBhY2EuaXNPYmplY3Q7CiAgICAgICAgICAgIHZhciBpc1VuZGVmaW5lZCA9IEFscGFjYS5pc1VuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvcHlPZiA9IEFscGFjYS5jb3B5T2Y7CgogICAgICAgICAgICB2YXIgX21lcmdlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFycmF5IGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChjb3B5T2Yoc291cmNlW2luZGV4XSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIEFSUkFZCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdCh0YXJnZXQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2Ugb2JqZWN0IHByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHNvdXJjZSwgZnVuY3Rpb24oa2V5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHRhcmdldFtrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gY29weU9mKHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBfbWVyZ2Uoc291cmNlW2tleV0sIHRhcmdldFtrZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgaXMgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IHRoYXQgaXNuJ3QgYW4gT0JKRUNUCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBhIHNjYWxhciwgYWx3YXlzIG92ZXJ3cml0ZQogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGNvcHlPZihzb3VyY2UpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBfbWVyZ2Uoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdWJzdGl0dXRlcyBhIHN0cmluZyB3aXRoIGEgbGlzdCBvZiB0b2tlbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGV4dCBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEBwYXJhbSBhcmdzIExpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgU3Vic3RpdHV0ZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHN1YnN0aXR1dGVUb2tlbnMgOiBmdW5jdGlvbih0ZXh0LCBhcmdzKSB7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRleHQpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAieyIgKyBpICsgIn0iOwoKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHRleHQuaW5kZXhPZih0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnQgPSB0ZXh0LnN1YnN0cmluZygwLCB4KSArIGFyZ3NbaV0gKyB0ZXh0LnN1YnN0cmluZyh4ICsgMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBudDsKICAgICAgICAgICAgICAgICAgICAgICAgLy90ZXh0ID0gQWxwYWNhLnJlcGxhY2VBbGwodGV4dCwgdG9rZW4sIGFyZ3NbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0d28gb2JqZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIEZpcnN0IG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTZWNvbmQgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdHdvIG9iamVjdHMgYXJlIHNhbWUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBjb21wYXJlT2JqZWN0IDogZnVuY3Rpb24ob2JqMSwgb2JqMikgewogICAgICAgICAgICByZXR1cm4gZXF1aXYob2JqMSwgb2JqMik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgY29udGVudCBvZiB0d28gYXJyYXlzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyXzEgRmlyc3QgYXJyYXkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyXzIgU2Vjb25kIGFycmF5LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBhcnJheXMgaGF2ZSBzYW1lIGNvbnRlbnQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBjb21wYXJlQXJyYXlDb250ZW50IDogZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICB2YXIgZXF1YWwgPSBhICYmIGIgJiYgKGEubGVuZ3RoID09PSBiLmxlbmd0aCk7CgogICAgICAgICAgICBpZiAoZXF1YWwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBhW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkodiwgYikgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBlcXVhbDsKICAgICAgICB9LAoKICAgICAgICB0ZXN0UmVnZXg6IGZ1bmN0aW9uKGV4cHJlc3Npb24sIHRleHRWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoZXhwcmVzc2lvbik7CgogICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh0ZXh0VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBoYXMgZW1wdHkgdmFsdWUgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbCBWYXJpYWJsZSB0byBiZSBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbiBpbiBhbnkgY291bnRzCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNWYWxFbXB0eSA6IGZ1bmN0aW9uKHZhbCwgaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICB2YXIgZW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCwgaW5jbHVkZUZ1bmN0aW9ucykpIHsKICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSAmJiB2YWwgPT09ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWwpICYmICQuaXNFbXB0eU9iamVjdCh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc051bWJlcih2YWwpICYmIGlzTmFOKHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbXB0eTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIGZpZWxkIGluc3RhbmNlIGFuZCBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIG5lZWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBDb250YWluZXIgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluaXRpYWxTZXR0aW5ncyBhbnkgYWRkaXRpb25hbCBzZXR0aW5ncyBwcm92aWRlZCB0byB0aGUgdG9wLWxldmVsIEFscGFjYSBvYmplY3QKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBSZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVuZGVyZWRDYWxsYmFjayBQb3N0LXJlbmRlciBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5jb25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IE5ldyBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKi8KICAgICAgICBpbml0OiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCByZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBDT01QSUxBVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgYW4gaW5saW5lIHZpZXcgb2JqZWN0LCB3ZSBhc3NpZ24gYW4gaWQgYW5kIHN0b3JlIG9udG8gdmlld3MgbWFwCiAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgZ2V0cyBjb21waWxlZCBhbG9uZyB3aXRoIHRoZSByZXN0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmlldykpIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3LmlkOwogICAgICAgICAgICAgICAgaWYgKCF2aWV3SWQpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LmlkID0gdGhpcy5nZW5lcmF0ZVZpZXdJZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gdmlldy5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpZXcucGFyZW50ID0gImJvb3RzdHJhcC1lZGl0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHZpZXcpOwogICAgICAgICAgICAgICAgdmlldyA9IHZpZXcuaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbXBpbGUgYWxsIG9mIHRoZSB2aWV3cyBhbmQgdGVtcGxhdGVzCiAgICAgICAgICAgIHRoaXMuY29tcGlsZShjb25uZWN0b3IsIGZ1bmN0aW9uKHJlcG9ydCkgewoKICAgICAgICAgICAgICAgIGlmIChyZXBvcnQuZXJyb3JzICYmIHJlcG9ydC5lcnJvcnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBvcnQuZXJyb3JzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHJlcG9ydC5lcnJvcnNbaV0udmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gcmVwb3J0LmVycm9yc1tpXS5jYWNoZUtleQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gcmVwb3J0LmVycm9yc1tpXS5lcnI7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICJUaGUgdGVtcGxhdGUgd2l0aCBjYWNoZSBrZXk6ICIgKyBjYWNoZUtleSArICIgZm9yIHZpZXc6ICIgKyB2aWV3SWQgKyAiIGZhaWxlZCB0byBjb21waWxlIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiLCBtZXNzYWdlOiAiICsgZXJyLm1lc3NhZ2U7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChlcnIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiLCBlcnI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcih0ZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLm5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi52aWV3c1t2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJWaWV3IGNvbXBpbGF0aW9uIGZhaWxlZCwgY2Fubm90IGluaXRpYWxpemUgQWxwYWNhLiAiICsgbWVzc2FnZXMuam9pbigiLCAiKSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5faW5pdChlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCByZW5kZXJlZENhbGxiYWNrLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgUkVTT0xVVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgogICAgICAgICAgICAvLyBtYWtlIHNvbWUgaW50ZWxsaWdlbnQgZ3Vlc3NlcyBhYm91dCB3aGF0IHZpZXcgaWQgd2UgbWlnaHQgZGVmYXVsdCB0byBpbiBjYXNlIHRoZXkgd2FudCB0byB1c2UKICAgICAgICAgICAgLy8gYXV0by12aWV3IHNlbGVjdGlvbi4gIFdlIGRldGVjdCBqcXVlcnktdWksIGJvb3RzdHJhcCBhbmQganF1ZXJ5bW9iaWxlLiAgSWYgbm90aGluZyBjYW4gYmUgZGV0ZWN0ZWQsCiAgICAgICAgICAgIC8vIHdlIGZhbGwgYmFjayB0byBzdHJhaWdodCB3ZWIgdmlld3MuCiAgICAgICAgICAgIHZhciBmYWxsYmFja1VJICAgPSBBbHBhY2EuZGVmYXVsdFZpZXcgfHwgbnVsbDsKICAgICAgICAgICAgdmFyIGZhbGxiYWNrVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBkZXRlY3QgalF1ZXJ5IE1vYmlsZQogICAgICAgICAgICBpZiAoJC5tb2JpbGUgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5bW9iaWxlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IHR3aXR0ZXIgYm9vdHN0cmFwCiAgICAgICAgICAgIHZhciBib290c3RyYXBEZXRlY3RlZCA9ICh0eXBlb2YgJC5mbi5tb2RhbCA9PT0gJ2Z1bmN0aW9uJyk7CiAgICAgICAgICAgIGlmIChib290c3RyYXBEZXRlY3RlZCAmJiAhZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9ICJib290c3RyYXAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZXRlY3QganF1ZXJ5IHVpCiAgICAgICAgICAgIHZhciBqUXVlcnlVSURldGVjdGVkID0gKHR5cGVvZigkLnVpKSAhPT0gInVuZGVmaW5lZCIpOwogICAgICAgICAgICBpZiAoalF1ZXJ5VUlEZXRlY3RlZCAmJiAhZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9ICJqcXVlcnl1aSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmYWxsYmFja1VJKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJlZGl0IjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tUeXBlID0gImNyZWF0ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgcHJvdmlkZWQsIGJ1dCB0aGV5IHByb3ZpZGVkICJ1aSIgYW5kIG9wdGlvbmFsbHkgInR5cGUiLCB0aGVuIHdlIHRyeSB0byBhdXRvLXNlbGVjdCB0aGUgdmlldwogICAgICAgICAgICBpZiAoIXZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB1aSA9IGluaXRpYWxTZXR0aW5ncy51aTsKICAgICAgICAgICAgICAgIHZhciB0eXBlID0gaW5pdGlhbFNldHRpbmdzLnR5cGU7CgogICAgICAgICAgICAgICAgaWYgKCF1aSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tVSSA9IEFscGFjYS5kZWZhdWx0VUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpID0gZmFsbGJhY2tVSTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHVpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBmYWxsYmFja1R5cGUgPyBmYWxsYmFja1R5cGUgOiAiZWRpdCI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgcHJvdmlkZWQgYnV0IGZvdW5kIHJlcXVlc3QgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gYXV0by1zZWxlY3QgYSB2aWV3CiAgICAgICAgICAgICAgICAgICAgdmlldyA9IHRoaXMubG9va3VwTm9ybWFsaXplZFZpZXcodWksIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRm91bmQgdmlldzogIiArIHZpZXcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiTm8gdmlldyBmb3VuZCBmb3IgVUk6ICIgKyB1aSArICIgYW5kIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgdmlldyBpcyBhIHN0cmluZyAodGhlIHZpZXcgaWQpIG9yIGl0IGlzIGVtcHR5L251bGwKCiAgICAgICAgICAgIC8vIGlmIHN0aWxsIG5vIHZpZXcsIHRoZW4gZGVmYXVsdCBmYWxsYmFjayB0byBvdXIgZGV0ZWN0ZWQgdmlldyBvciB0aGUgZGVmYXVsdAogICAgICAgICAgICBpZiAoIXZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQSB2aWV3IHdhcyBub3Qgc3BlY2lmaWVkIGFuZCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVidWdnaW5nOiBpZiB0aGUgdmlldyBpc24ndCBhdmFpbGFibGUsIHdlIHdhbnQgdG8gcmVwb3J0IGl0IHJpZ2h0IGF3YXkKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vcm1hbGl6ZWRWaWV3c1t2aWV3XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVGhlIGRlc2lyZWQgdmlldzogIiArIHZpZXcgKyAiIGNvdWxkIG5vdCBiZSBsb2FkZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGxvYWRlZCBhbmQgbm90IG1pc3NwZWxsZWQuIiwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBGSUVMRCBJTlNUQU5USUFUSU9OCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAgICAgLy8gVEVTVCAtIHN3YXAgY29kZQogICAgICAgICAgICAgICAgLy8gc3dhcCBlbCAtPiBwbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgLy92YXIgdGVtcEhvbGRlciA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLmJlZm9yZSh0ZW1wSG9sZGVyKTsKICAgICAgICAgICAgICAgIC8vJChlbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gQWxwYWNhLmNyZWF0ZUZpZWxkSW5zdGFuY2UoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGZpZWxkIHdoaWxlIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtcmVuZGVyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuYWRkQ2xhc3MoImFscGFjYS1oaWRkZW4iKTsKCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2ZpZWxkLmdldElkKCldID0gZmllbGQ7CgogICAgICAgICAgICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgbG9va2luZyB1cCBmaWVsZCBpbnN0YW5jZXMgYnkgaWQKICAgICAgICAgICAgICAgICAgICBmaWVsZC5hbGxGaWVsZEluc3RhbmNlcyA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZmllbGRJbnN0YW5jZXM7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgY2FsbGJhY2tzIGRlZmluZWQgdGhyb3VnaCB2aWV3CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZpZWxkLnZpZXcucmVuZGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkocmVuZGVyZWRDYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayA9IGZpZWxkLnZpZXcucG9zdFJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBmaW4gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB3ZSBhcHBseSBzb21lIGFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLSIgKyBzZWxmLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXcpLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB3ZSBtYXJrIGFzIHRvcAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtdG9wIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBhbHBhY2EgZmllbGQsIHRoZW4gd2UgY2FsbCBmb3IgdmFsaWRhdGlvbiBzdGF0ZSB0byBiZSByZWNhbGN1bGF0ZWQgYWNyb3NzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBjaGlsZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIGNhbGwgdG8gdXBkYXRlIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gc3VzcGVuZCBpbml0aWFsIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgdG8gZmFsc2UgZm9yIGZpZWxkIGFuZCBhbGwgY2hpbGRyZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC52aWV3LnR5cGUgIT09ICd2aWV3JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oZmllbGQsIGZ1bmN0aW9uKGZpZWxkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gZmFsc2UgYWZ0ZXIgZmlyc3QgdmFsaWRhdGlvbiAoZXZlbiBpZiBpbiBDUkVBVEUgbW9kZSwgd2Ugb25seSBmb3JjZSBpbml0IHZhbGlkYXRpb24gZXJyb3IgZmFsc2Ugb24gZmlyc3QgcmVuZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvciA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVEVTVCAtIHN3YXAgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FwIHBsYWNlaG9sZGVyIC0+IGVsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0ZW1wSG9sZGVyKS5iZWZvcmUoZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlYWwgZmllbGQgYWZ0ZXIgcmVuZGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtcmVuZGVyaW5nIik7CiAgICAgICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBmaWVsZCB0aGF0IG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAsIGRvIHNvIG5vdwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuX29sZEZpZWxkRWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmllbGQuX29sZEZpZWxkRWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZmllbGQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZpZWxkLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVuZGVyZWRDYWxsYmFjayA9IHJlbmRlcmVkQ2FsbGJhY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgY2FuIGJlIG51bGwgaWYgYW4gZXJyb3Igd2FzIHRocm93biBvciBpZiBhIHZpZXcgd2Fzbid0IGZvdW5kCiAgICAgICAgICAgIC8vIEFjdHVhbGx5IGl0J2QgYWx3YXlzIGJlIHVuZGVmaW5lZCBiZWNhdXNlIGZpZWxkIGlzIGluIGFub3RoZXIgc2NvcGUuCiAgICAgICAgICAgIC8vIHJldHVybiBmaWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGVsIFRoZSBkb20gZWxlbWVudCB0byBhY3QgYXMgdGhlIGNvbnRhaW5lciBvZiB0aGUgY29uc3RydWN0ZWQgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIGRhdGEgdG8gYmUgYm91bmQgaW50byB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIFRoZSBzY2hlbWEgZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgVGhlIHZpZXcgZm9yIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5jb25uZWN0b3J9IGNvbm5lY3RvciBUaGUgZmllbGQgY29ubmVjdG9yIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlRmllbGRJbnN0YW5jZSA6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG9wdGlvbnMgYW5kIHNjaGVtYSBhcmUgbm90IGVtcHR5CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eShvcHRpb25zLCB0cnVlKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eShzY2hlbWEsIHRydWUpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3B0aW9ucyBjYW4gYmUgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGZpZWxkIHRvIGNvbnN0cnVjdCAoaS5lLiAidGV4dCIpCiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIEFscGFjYS5pc1N0cmluZyhvcHRpb25zKSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSBmaWVsZFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIG5vdGhpbmcgcGFzc2VkIGluLCB3ZSBjYW4gdHJ5IHRvIG1ha2UgYSBndWVzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBkYXRhCiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSBBbHBhY2EuZ2V0U2NoZW1hVHlwZShkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBBbHBhY2EuaXNBcnJheShkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEudHlwZSA9ICJhcnJheSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEudHlwZSA9ICJvYmplY3QiOyAvLyBmYWxsYmFjawogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB1c2luZyB3aGF0IHdlIG5vdyBhYm91dCBzY2hlbWEsIHRyeSB0byBndWVzcyB0aGUgdHlwZQogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gQWxwYWNhLmd1ZXNzT3B0aW9uc1R5cGUoc2NoZW1hKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmaW5kIHRoZSBmaWVsZCBjbGFzcyByZWdpc3RlcmVkIGZvciB0aGlzIGZpZWxkIHR5cGUKICAgICAgICAgICAgdmFyIEZpZWxkQ2xhc3MgPSBBbHBhY2EuZ2V0RmllbGRDbGFzcyhvcHRpb25zLnR5cGUpOwogICAgICAgICAgICBpZiAoIUZpZWxkQ2xhc3MpIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGZpbmQgZmllbGQgY2xhc3MgZm9yIHR5cGU6ICIgKyBvcHRpb25zLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJGSUVMRF9JTlNUQU5USUFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGRhdGEsIGJpbmQgaXQgaW4KICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENsYXNzKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBmb3JtZXIgalF1ZXJ5IDEuOC4zIHBhcnNlSlNPTiBmdW5jdGlvbiAodGhpcyB3YXMgY2hhbmdlZAogICAgICAgICAqIGZvciBqUXVlcnkgMS45LjAgYW5kIGludHJvZHVjZXMgYWxsIGtpbmRzIG9mIGlzc3VlcykuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGV4dAogICAgICAgICAqLwogICAgICAgIHBhcnNlSlNPTjogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTih0ZXh0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyBhbGwgb2YgdGhlIHZpZXdzLCBub3JtYWxpemluZyB0aGVtIGZvciB1c2UgYnkgQWxwYWNhLgogICAgICAgICAqIEFsc28gY29tcGlsZXMgYW55IHRlbXBsYXRlcyB0aGF0IHRoZSB2aWV3cyBtYXkgcmVmZXJlbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbm5lY3RvciB0aGUgY29ubmVjdG9yCiAgICAgICAgICogQHBhcmFtIGNiIHRoZSBjYWxsYmFjayB0aGF0IGdldHMgZmlyZWQgb25jZSBjb21waWxhdGlvbiBoYXMgZW5kZWQKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBmaXJlZCBpZiB0aGUgY29tcGlsZSBmYWlscyBmb3IgYW55IHJlYXNvbgogICAgICAgICAqLwogICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGNvbm5lY3RvciwgY2IsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB2YXIgdDEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCiAgICAgICAgICAgIHZhciByZXBvcnQgPSB7CiAgICAgICAgICAgICAgICAiZXJyb3JzIjogW10sCiAgICAgICAgICAgICAgICAiY291bnQiOiAwLAogICAgICAgICAgICAgICAgInN1Y2Nlc3NDb3VudCI6IDAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaW5hbENhbGxiYWNrID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2YXIgdDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDb21waWxhdGlvbiBFeGl0ZWQgd2l0aCAiICsgcmVwb3J0LmVycm9ycy5sZW5ndGggKyAiIGVycm9ycyBpbjogIiArICh0Mi10MSkrICIgbXMiKTsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycy5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcyEKCiAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdXIgdmlld3MgaW50byB0aGUgbm9ybWFsaXplZCBzZXQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzW2tdID0gbm9ybWFsaXplZFZpZXdzW2tdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYihyZXBvcnQpOwogICAgICAgICAgICB9OwoKCgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVklFVyBURU1QTEFURSBDT01QSUxBVElPTgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIC8vIGZvciBhbGwgb2YgdGhlIHZpZXdzICh0aGUgb3JpZ2luYWwgb25lcywgbm90IHRoZSBjb21waWxlZCBvbmVzKSwgd2FsayB0aHJvdWdoIHRoZW0gYW5kIGZpbmQgYW55CiAgICAgICAgICAgIC8vIGFuZCBhbGwgdGVtcGxhdGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZCwgY29tcGlsZSB0aGVtLCBldGMuCgogICAgICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZpcmVkIHdoZW4gYSBjb21waWxhdGlvbiBlaXRoZXIgZmFpbHMgb3Igc3VjY2VlZHMKICAgICAgICAgICAgLy8gaWYgaXQgZmFpbHMsIGVyciBpcyBzZXQsIG90aGVyd2lzZSBjYWNoZUtleSBoYXMgdGhlCiAgICAgICAgICAgIHZhciB2aWV3Q29tcGlsZUNhbGxiYWNrID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKCiAgICAgICAgICAgICAgICByZXBvcnQuY291bnQrKzsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LmVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiB2aWV3SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IGNhY2hlS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyIjogZXJyCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LnN1Y2Nlc3NDb3VudCsrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChyZXBvcnQuY291bnQgPT0gdG90YWxDYWxscykgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluYWxDYWxsYmFjayhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNvbXBpbGVWaWV3VGVtcGxhdGUgPSBmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkKTsKCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaGFuZGxlYmFycyBhcyB0aGUgZW5naW5lIHdlJ2xsIHVzZQogICAgICAgICAgICAgICAgdmFyIGVuZ2luZVR5cGUgPSAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiOwoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhlIHRlbXBsYXRlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gb2JqZWN0IHRvIGV4cGxpY2l0bHkgZGVmaW5lIHRoZSB0eXBlIG9mIGVuZ2luZSB0byB1c2UuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSAmJiBBbHBhY2EuaXNPYmplY3QodGVtcGxhdGUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSB0ZW1wbGF0ZS50eXBlOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcHJlY29tcGlsZWQgdGVtcGxhdGUsIHN3YXAgY2FjaGUga2V5cwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5jYWNoZUtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSA9IHRlbXBsYXRlLmNhY2hlS2V5OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIElmIHRlbXBsYXRlIGlzIGEgc3RyaW5nLCB0aGVuIGl0IGlzIGVpdGhlciBzb21lIHRleHQgdGhhdCB3ZSBjYW4gdHJlYXQgYXMgYSB0ZW1wbGF0ZSBvciBpdCBpcwogICAgICAgICAgICAgICAgICogYSBVUkwgdGhhdCB3ZSBzaG91bGQgZHluYW1pY2FsbHkgbG9hZCBhbmQgdHJlYXQgdGhlIHJlc3VsdCBhcyBhIHRlbXBsYXRlLiAgSXQgbWF5IGFsc28gYmUgYQogICAgICAgICAgICAgICAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gbG9jYXRlIHNvbWV0aGluZyB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgd2Ugc2hvdWxkIGxvYWQgdGV4dCBmcm9tLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgdHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVcmkoeCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhpcyBpcyBhIFVSTCBhbmQgbGV0IHRoZSB0ZW1wbGF0ZSBlbmdpbmUgZGVhbCB3aXRoIGl0CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlICYmICgodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwKSB8fCAodGVtcGxhdGUuaW5kZXhPZigiLiIpID09PSAwKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBqUXVlcnkgc2VsZWN0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21FbCA9ICQodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lVHlwZSA9ICQoZG9tRWwpLmF0dHIoInR5cGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAkKGRvbUVsKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgcmVmZXJlbmNlZCBieSB0ZW1wbGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1RlbXBsYXRlID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBleGlzdGluZ1RlbXBsYXRlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZW5naW5lIHR5cGUgaGVyZSwgdGhyb3cKICAgICAgICAgICAgICAgIGlmICghZW5naW5lVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkVuZ2luZSB0eXBlIHdhcyBlbXB0eSIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb29rIHVwIHRoZSBlbmdpbmUKICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICAgICAgaWYgKCFlbmdpbmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgZm9yIHR5cGU6ICIgKyB0eXBlKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGVtcGxhdGUgPT09IHRydWUsIHRoZW4gdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGVtcGxhdGUgaXMgcHJlLWNvbXBpbGVkLgogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlID09PSB0cnVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUuaXNDYWNoZWQoY2FjaGVLZXkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGdvb2QKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG51bGwsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1aCBvaCwgY2xhaW1zIHRvIGJlIHByZWNvbXBpbGVkLCBidXQgdGhlIHRlbXBsYXRpbmcgZW5naW5lIGRvZXNuJ3Qga25vdyBhYm91dCBpdAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyaW5nID0gIlZpZXcgY29uZmlndXJhdGlvbiBmb3IgdmlldzogIiArIHZpZXcuaWQgKyAiIGNsYWltcyB0byBoYXZlIHByZWNvbXBpbGVkIHRlbXBsYXRlIGZvciBjYWNoZUtleTogIiArIGNhY2hlS2V5ICsgIiBidXQgaXQgY291bGQgbm90IGJlIGZvdW5kIjsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKGVyclN0cmluZyk7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgbmV3IEVycm9yKGVyclN0cmluZyksIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZW5naW5lIGFscmVhZHkgaGFzIHRoaXMgY2FjaGVkCiAgICAgICAgICAgICAgICAvLyB0aGlzIG1pZ2h0IGJlIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiBzdGVwCiAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBpbGVkLCBzbyBza2lwCiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG51bGwsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgICAgIGVuZ2luZS5jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgY29ubmVjdG9yLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29tcGlsZUNhbGxiYWNrKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVGVtcGxhdGVzID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG5vcm1hbGl6ZWQgdmlld3MgdGhhdCB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCBjb21waWxlIHRoZSB0ZW1wbGF0ZXMgd2l0aGluCiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25BcnJheSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdOwoKICAgICAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlSWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJ2aWV3Iiwgdmlldy5pZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgbGV2ZWwgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcGF0aCBpbiB2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImZpZWxkIiwgcGF0aCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGxheW91dCB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmxheW91dCAmJiB2aWV3LmxheW91dC50ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcubGF5b3V0LnRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAibGF5b3V0IiwgImxheW91dCIsICJsYXlvdXRUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5nbG9iYWxUZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXcuZ2xvYmFsVGVtcGxhdGU7CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJnbG9iYWwiLCAiZ2xvYmFsIiwgImdsb2JhbFRlbXBsYXRlIiwgdGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbm93IGludm9rZSBhbGwgb2YgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgLy8gdGhpcyB0ZWxscyBlYWNoIHRlbXBsYXRlIHRvIGNvbXBpbGUKICAgICAgICAgICAgICAgIHZhciB0b3RhbENhbGxzID0gZnVuY3Rpb25BcnJheS5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheVtpXSh0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBub3JtYWxpemVWaWV3cyA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhlIHZpZXdzIHRoYXQgd2UncmUgZ29pbmcgdG8gbm9ybWFsaXplCiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXdzID0ge307CiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXdDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgLy8gc29tZSBpbml0aWFsIHNlbGYtYXNzdXJhbmNlIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBub3JtYWxpemVkVmlld3MgbWFwIHNldCB1cAogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVkVmlld3MgPSBBbHBhY2Eubm9ybWFsaXplZFZpZXdzOwoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBhbGwgb2Ygb3VyIHZpZXdzCiAgICAgICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gc2VsZi52aWV3cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmlldyBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQgb24gdGhlIEFscGFjYSBnbG9iYWwsIHdlIGRvIG5vdCBib3RoZXIKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5ub3JtYWxpemVkVmlld3Nbdmlld0lkXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkVmlldyA9IG5ldyBBbHBhY2EuTm9ybWFsaXplZFZpZXcodmlld0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lm5vcm1hbGl6ZShzZWxmLnZpZXdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0gPSBub3JtYWxpemVkVmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBub3JtYWxpemF0aW9uIGZhaWxlZCwgY2Fubm90IGluaXRpYWxpemUgQWxwYWNhLiAgUGxlYXNlIGNoZWNrIHRoZSBlcnJvciBsb2dzLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlld0NvdW50ID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21waWxlVGVtcGxhdGVzKG5vcm1hbGl6ZWRWaWV3cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluYWxDYWxsYmFjayhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbm9ybWFsaXplVmlld3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb29rcyB1cCB0aGUgcHJvcGVyIHRlbXBsYXRlIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGEgcmVxdWVzdGVkIHRlbXBsYXRlIGlkIGZvciBhIHZpZXcgYW5kIGEgZmllbGQuCiAgICAgICAgICogUGVyZm9ybXMgYW4gb3ZlcnJpZGUgbG9va3VwIHRvIGZpbmQgdGhlIHByb3BlciB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEhhbmRzIGJhY2sgYSBkZXNjcmlwdG9yIG9mIGV2ZXJ5dGhpbmcgdGhhdCBpcyBrbm93biBhYm91dCB0aGUgcmVzb2x2ZWQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlldwogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUlkCiAgICAgICAgICogQHBhcmFtIGZpZWxkCiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odmlldywgdGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IG51bGw7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBGSUdVUkUgT1VUIFdIRVJFIFRIRSBURU1QTEFURSBJUyBJTiBUSEUgVklFVyBDT05GSUdVUkFUSU9OIChSRVNQRUNUSU5HIEZJRUxEIE9WRVJSSURFUykKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIHZhciBfZW5naW5lSWQgPSBudWxsOwogICAgICAgICAgICB2YXIgX2NhY2hlS2V5ID0gbnVsbDsKCiAgICAgICAgICAgIC8vIGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgdmlldyBsZXZlbD8KICAgICAgICAgICAgaWYgKHZpZXcudGVtcGxhdGVzICYmIHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlSWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJ2aWV3Iiwgdmlldy5pZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gaXMgdGhpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlPwogICAgICAgICAgICAgICAgdmFyIHQgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodCkgJiYgdC5jYWNoZUtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSB0LmNhY2hlS2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBvdmVycmlkZGVuIGF0IHRoZSBmaWVsZCBsZXZlbD8KICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoID0gZmllbGQucGF0aDsKCiAgICAgICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyB0cnkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgLy8gY29tYmluYXRpb25zIG9mIHBlcm11dGF0ZWQgYW5kIGdlbmVyYWxpemVkIGxvb2t1cHMgdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgYmVzdCBmaXQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCBpZiB0aGV5IHBhdGggaXM6IC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gbG9vayBmb3IgdGhlIGZvbGxvd2luZyBnZW5lcmFsaXplZCBwZXJtdXRhdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBhcHBsaWNhYmlsaXR5OgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0WzFdL3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3Qvc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZC90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgcGF0aC5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxlY3RNYXRjaGVzID0gZnVuY3Rpb24odG9rZW5zLCBpbmRleCwgbWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGFycmF5LCB3ZSdyZSBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdG9rZW5zLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VG9rZW5zID0gdG9rZW5zLnNsaWNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhcnJheSBpbiB0aGUgcGF0aCBhdCB0aGlzIGVsZW1lbnQsIHVwZGF0ZSBuZXdUb2tlbnMgdG8gcmVmbGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvZ2dsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeDEgPSB0b2tlbi5pbmRleE9mKCJbIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeDEgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cmluZygwLCB4MSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUb2tlbnNbaW5kZXhdID0gdG9rZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgbWF0Y2ggZm9yIHRoaXMgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXRoID0gbmV3VG9rZW5zLmpvaW4oIi8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5maWVsZHNbX3BhdGhdICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXMgJiYgdmlldy5maWVsZHNbX3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2NrID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBfcGF0aCwgdGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6IF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZWVkIGRvd24gdGhlIHRva2VuIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyh0b2tlbnMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgdG9nZ2xlZCwgcHJvY2VlZCB3aXRoIHRoYXQgYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyhuZXdUb2tlbnMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gcGF0aC5zcGxpdCgiLyIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hlcyh0b2tlbnMsIDAsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gbWF0Y2hlc1swXS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMgJiYgdmlldy5maWVsZHNbcGF0aF0gJiYgdmlldy5maWVsZHNbcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsVGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJnbG9iYWwiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJnbG9iYWwiLCAiZ2xvYmFsIiwgImdsb2JhbFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGxheW91dCBsZXZlbD8KICAgICAgICAgICAgaWYgKHRlbXBsYXRlSWQgPT09ICJsYXlvdXRUZW1wbGF0ZSIgfHwgdGVtcGxhdGVJZCA9PT0gImxheW91dCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKF9jYWNoZUtleSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aGljaCBlbmdpbmUgaGFzIHRoaXMKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZHMgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5pZHMoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5naW5lSWRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmVJZCA9IGVuZ2luZUlkc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUuaXNDYWNoZWQoX2NhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lbmdpbmVJZCA9IGVuZ2luZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKF9lbmdpbmVJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZW5naW5lIjogX2VuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBfY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlcyBhIHRlbXBsYXRlIGFuZCByZXR1cm5zIGEgRE9NIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVEZXNjcmlwdG9yCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICovCiAgICAgICAgdG1wbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBodG1sID0gQWxwYWNhLnRtcGxIdG1sKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5zYWZlRG9tUGFyc2UoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBIVE1MLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGxIdG1sOiBmdW5jdGlvbih0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFtb2RlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbW9kZWwgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZ2luZVR5cGUgPSB0ZW1wbGF0ZURlc2NyaXB0b3IuZW5naW5lOwoKICAgICAgICAgICAgdmFyIGVuZ2luZSA9IEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5LmZpbmQoZW5naW5lVHlwZSk7CiAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgZm9yIHR5cGU6ICIgKyBlbmdpbmVUeXBlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGVtcGxhdGVEZXNjcmlwdG9yLmNhY2hlS2V5OwogICAgICAgICAgICB2YXIgaHRtbCA9IGVuZ2luZS5leGVjdXRlKGNhY2hlS2V5LCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgdmFyIHN0ciA9IEpTT04uc3RyaW5naWZ5KGVycik7CiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICBzdHIgPSBlcnIubWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlRoZSBjb21waWxlZCB0ZW1wbGF0ZTogIiArIGNhY2hlS2V5ICsgIiBmYWlsZWQgdG8gZXhlY3V0ZTogIiArIHN0cik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfQoKICAgIH0pOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gTE9HR0VSCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5ERUJVRyA9IDA7CiAgICBBbHBhY2EuSU5GTyA9IDE7CiAgICBBbHBhY2EuV0FSTiA9IDI7CiAgICBBbHBhY2EuRVJST1IgPSAzOwoKICAgIC8vIGJ5IGRlZmF1bHQsIGxvZ2dpbmcgb25seSBzaG93cyB3YXJuaW5ncyBhbmQgYWJvdmUKICAgIC8vIHRvIGRlYnVnLCBzZXQgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLkRFQlVHCiAgICBBbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuV0FSTjsKCiAgICBBbHBhY2EubG9nRGVidWcgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5ERUJVRywgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nSW5mbyA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIEFscGFjYS5sb2coQWxwYWNhLklORk8sIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ1dhcm4gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5XQVJOLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dFcnJvciA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIEFscGFjYS5sb2coQWxwYWNhLkVSUk9SLCBvYmopOwogICAgfTsKCiAgICBBbHBhY2EuTE9HX01FVEhPRF9NQVAgPSB7CiAgICAgICAgMDogJ2RlYnVnJywKICAgICAgICAxOiAnaW5mbycsCiAgICAgICAgMjogJ3dhcm4nLAogICAgICAgIDM6ICdlcnJvcicKICAgIH07CgogICAgQWxwYWNhLmxvZyA9IGZ1bmN0aW9uKGxldmVsLCBvYmopIHsKCiAgICAgICAgaWYgKEFscGFjYS5sb2dMZXZlbCA8PSBsZXZlbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtZXRob2QgPSBBbHBhY2EuTE9HX01FVEhPRF9NQVBbbGV2ZWxdOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlW21ldGhvZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgiZGVidWciID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiaW5mbyIgPT09IG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIndhcm4iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJlcnJvciIgPT09IG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Iob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5jaGVja2VkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJjaGVja2VkIiwgdmFsdWUpOwogICAgfTsKCiAgICBBbHBhY2EuZGlzYWJsZWQgPSBmdW5jdGlvbihlbCwgdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIEFscGFjYS5hdHRyUHJvcChlbCwgImRpc2FibGVkIiwgdmFsdWUpOwogICAgfTsKCiAgICBBbHBhY2EuYXR0clByb3AgPSBmdW5jdGlvbihlbCwgbmFtZSwgdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgLy8galF1ZXJ5IDEuNisKICAgICAgICAgICAgaWYgKCQoZWwpLnByb3ApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLnByb3AobmFtZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuYXR0cihuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoZWwpLnJlbW92ZUF0dHIobmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIG5vdyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUKCiAgICAgICAgLy8galF1ZXJ5IDEuNisKICAgICAgICBpZiAoJChlbCkucHJvcCkgewogICAgICAgICAgICByZXR1cm4gJChlbCkucHJvcChuYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkKGVsKS5hdHRyKG5hbWUpOwogICAgfTsKCiAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnMgPSBmdW5jdGlvbih0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgY2FsbGJhY2spCiAgICB7CiAgICAgICAgdmFyIGZucyA9IFtdOwoKICAgICAgICAvLyBob2xkcyByZXNvbHV0aW9uIGluZm9ybWF0aW9uCiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB7fTsKCiAgICAgICAgLy8gc2NoZW1hIGxvYWRpbmcgZnVuY3Rpb24KICAgICAgICB2YXIgZm4xID0gZnVuY3Rpb24oc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihkb25lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYVJlZmVyZW5jZUlkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYVJlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5zY2hlbWEgPSBzY2hlbWE7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYVJlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUmVmZXJlbmNlSWQgPSBzY2hlbWFSZWZlcmVuY2VJZC5zdWJzdHJpbmcoMik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0IGludG8gdG9rZW5zCiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNjaGVtYVJlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZTY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2hlbWEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZlNjaGVtYVt0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlNjaGVtYSA9IGRlZlNjaGVtYVt0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmU2NoZW1hLnByb3BlcnRpZXMgJiYgZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEucHJvcGVydGllc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmU2NoZW1hLmRlZmluaXRpb25zICYmIGRlZlNjaGVtYS5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlNjaGVtYSA9IGRlZlNjaGVtYS5kZWZpbml0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gZGVmU2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHdpdGggb3Igd2l0aG91dCBhICIjIiBpbiBpdCB0byBwb2ludCB0byBhIHNwZWNpZmljIGxvY2F0aW9uIGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzY2hlbWEKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVBhcnRzID0gQWxwYWNhLnBhdGhQYXJ0cyhzY2hlbWFSZWZlcmVuY2VJZCk7CgogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkLmNvbm5lY3Rvci5sb2FkUmVmZXJlbmNlU2NoZW1hKHJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChzY2hlbWEpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VQYXJ0cy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkU2NoZW1hID0gQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2Uoc2NoZW1hLCByZWZlcmVuY2VQYXJ0cy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5zY2hlbWEgPSByZXNvbHZlZFNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMSh0b3BGaWVsZC5zY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkLCByZXNvbHV0aW9uKSk7CgogICAgICAgIHZhciBmbjIgPSBmdW5jdGlvbihvcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zUmVmZXJlbmNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zUmVmZXJlbmNlSWQgPT09ICIjIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zUmVmZXJlbmNlSWQuaW5kZXhPZigiIy8iKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcHJvcGVydHkgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBzY2hlbWEKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBvcHRpb25zUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBvcHRpb25zUmVmZXJlbmNlSWQuc3BsaXQoIi8iKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZk9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmT3B0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZPcHRpb25zLmZpZWxkcyAmJiBkZWZPcHRpb25zLmZpZWxkc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmZpZWxkc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5kZWZpbml0aW9ucyAmJiBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmT3B0aW9ucyA9IGRlZk9wdGlvbnMuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmT3B0aW9ucyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gZGVmT3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBJRCBvZiBhIG5vZGUgaW4gdGhlIGN1cnJlbnQgc2NoZW1hIGRvY3VtZW50CgogICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhlIGN1cnJlbnQgZG9jdW1lbnQgc2NoZW1hIHVudGlsIHdlIGZpbmQgdGhlIHJlZmVyZW5jZWQgbm9kZSAodXNpbmcgaWQgcHJvcGVydHkpCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShvcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZE9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHdpdGggb3Igd2l0aG91dCBhICIjIiBpbiBpdCB0byBwb2ludCB0byBhIHNwZWNpZmljIGxvY2F0aW9uIGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzY2hlbWEKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvblJlZmVyZW5jZVBhcnRzID0gQWxwYWNhLnBhdGhQYXJ0cyhvcHRpb25zUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZU9wdGlvbnMob3B0aW9uUmVmZXJlbmNlUGFydHMucGF0aCwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25SZWZlcmVuY2VQYXJ0cy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkT3B0aW9ucyA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShvcHRpb25zLCBvcHRpb25SZWZlcmVuY2VQYXJ0cy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IHJlc29sdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgZm5zLnB1c2goZm4yKHRvcEZpZWxkLm9wdGlvbnMsIG9wdGlvbnNSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICAvLyBydW4gbG9hZHMgaW4gcGFyYWxsZWwKICAgICAgICBBbHBhY2EucGFyYWxsZWwoZm5zLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2socmVzb2x1dGlvbi5zY2hlbWEsIHJlc29sdXRpb24ub3B0aW9ucyk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIEFscGFjYS5ERUZBVUxUX0VSUk9SX0NBTExCQUNLID0gZnVuY3Rpb24oZXJyb3IpCiAgICB7CiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2cgdG8gZGVidWcKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7CgogICAgICAgICAgICAvLyBlcnJvciBvdXQKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbHBhY2EgY2F1Z2h0IGFuIGVycm9yIHdpdGggdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcjogIiArIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7CgogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGVycm9yIGNhbGxiYWNrIGhhbmRsZXIgZm9yIEFscGFjYS4KICAgICAqCiAgICAgKiBUaGlzIGVycm9yIGhhbmRsZXIgd2lsbCBiZSB1c2VkIGlmIGFuICJlcnJvciIgYXJndW1lbnQgaXNuJ3QgcGFzc2VkIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgYW4gQWxwYWNhIGZpZWxkLgogICAgICoKICAgICAqIEBwYXJhbSBlcnJvcgogICAgICovCiAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2sgPSBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSzsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGEgZ2VuZXJhbCBlcnJvciBhbmQgZGlzcGF0Y2hlcyB0byB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyLgogICAgICoKICAgICAqIEBwYXJhbSBtZXNzYWdlCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpCiAgICB7CiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgQWxwYWNhLmlzT2JqZWN0KG1lc3NhZ2UpKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGVyciA9IHsKICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlCiAgICAgICAgfTsKCiAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICB9OwoKICAgIC8qKgogICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCB0aHJvd3MgYW4gZXJyb3IgYmFjayB0byB0aGUgZ2l2ZW4gY2FsbGJhY2sgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAqLwogICAgQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2sgPSBmdW5jdGlvbihtZXNzYWdlLCBlcnJvckNhbGxiYWNrKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIGlmIChlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYSBzY2hlbWEgcGF0aCByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIHN1Yi1zY2hlbWEuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtYQogICAgICogQHBhcmFtIHJlZmVyZW5jZUlkCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2UgPSBmdW5jdGlvbihzY2hlbWEsIHJlZmVyZW5jZUlkKQogICAgewogICAgICAgIGlmICgoc2NoZW1hLmlkID09PSByZWZlcmVuY2VJZCkgfHwgKCgiIyIgKyBzY2hlbWEuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2NoZW1hLml0ZW1zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5pdGVtczsKCiAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVTY2hlbWFSZWZlcmVuY2Uoc3ViU2NoZW1hLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIHJlZmVyZW5jZUlkKQogICAgewogICAgICAgIGlmICgob3B0aW9ucy5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgb3B0aW9ucy5pZCkgPT09IHJlZmVyZW5jZUlkKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmZpZWxkcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGZpZWxkSWQgaW4gb3B0aW9ucy5maWVsZHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gb3B0aW9ucy5maWVsZHNbZmllbGRJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uoc3ViT3B0aW9ucywgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gb3B0aW9ucy5pdGVtczsKCiAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgJC5hbHBhY2EgPSB3aW5kb3cuQWxwYWNhID0gQWxwYWNhOwoKICAgIC8qKgogICAgICogalF1ZXJ5IGZyaWVuZGx5IG1ldGhvZCBmb3IgYmluZGluZyBhIGZpZWxkIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgICQuZm4uYWxwYWNhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CgogICAgICAgIC8vIGFwcGVuZCB0aGlzIGludG8gdGhlIGZyb250IG9mIGFyZ3MKICAgICAgICB2YXIgbmV3QXJncyA9IFtdLmNvbmNhdCh0aGlzLCBhcmdzKTsKCiAgICAgICAgLy8gaW52b2tlIEFscGFjYSBhZ2FpbnN0IGN1cnJlbnQgZWxlbWVudAogICAgICAgIHZhciByZXQgPSBBbHBhY2EuYXBwbHkodGhpcywgbmV3QXJncyk7CiAgICAgICAgaWYgKHR5cGVvZihyZXQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAvLyBhcyBwZXIgalF1ZXJ5J3MgcGF0dGVybiwgYXNzdW1lIHdlIGhhbmQgYmFjayAkZWwKICAgICAgICAgICAgcmV0ID0gJCh0aGlzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9OwoKICAgIC8qKgogICAgICogQGlnbm9yZQogICAgICogQHBhcmFtIG5vY2xvbmluZwogICAgICovCiAgICAkLmZuLm91dGVySFRNTCA9IGZ1bmN0aW9uKG5vY2xvbmluZykgewogICAgICAgIGlmIChub2Nsb25pbmcpIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMpLmh0bWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJCgiPGRpdj48L2Rpdj4iKS5hcHBlbmQodGhpcy5jbG9uZSgpKS5odG1sKCk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSB0bwogICAgICovCiAgICAkLmZuLnN3YXBXaXRoID0gZnVuY3Rpb24odG8pIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY29weV90byA9ICQodG8pLmNsb25lKCk7CiAgICAgICAgICAgIHZhciBjb3B5X2Zyb20gPSAkKHRoaXMpLmNsb25lKCk7CiAgICAgICAgICAgICQodG8pLnJlcGxhY2VXaXRoKGNvcHlfZnJvbSk7CiAgICAgICAgICAgICQodGhpcykucmVwbGFjZVdpdGgoY29weV90byk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgICQuZm4uYXR0clByb3AgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoJCh0aGlzKSwgbmFtZSwgdmFsdWUpOwogICAgfTsKCiAgICAvKioKICAgICAqIFdoZW4gZG9tIGVsZW1lbnRzIGFyZSByZW1vdmVkLCB3ZSBmaXJlIHRoZSBzcGVjaWFsICJkZXN0cm95ZWQiIGV2ZW50IHRvIGFsbG93IGZvciBsYXRlIGNsZWFudXAgb2YgYW55IEFscGFjYSBjb2RlCiAgICAgKiB0aGF0IG1pZ2h0IGJlIGluLW1lbW9yeSBhbmQgbGlua2VkIHRvIHRoZSBkb20gZWxlbWVudC4KICAgICAqCiAgICAgKiBAdHlwZSB7T2JqZWN0fQogICAgICovCiAgICAkLmV2ZW50LnNwZWNpYWwuZGVzdHJveWVkID0gewogICAgICAgIHJlbW92ZTogZnVuY3Rpb24obykgewogICAgICAgICAgICBpZiAoby5oYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBvLmhhbmRsZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgQWxwYWNhLnBhdGhQYXJ0cyA9IGZ1bmN0aW9uKHJlc291cmNlKQogICAgewogICAgICAgIGlmICh0eXBlb2YocmVzb3VyY2UpICE9PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgICB9CgogICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRvIG9iamVjdAogICAgICAgIHZhciByZXNvdXJjZVBhdGggPSByZXNvdXJjZTsKICAgICAgICB2YXIgcmVzb3VyY2VJZCA9IG51bGw7CiAgICAgICAgdmFyIGkgPSByZXNvdXJjZVBhdGguaW5kZXhPZigiIyIpOwogICAgICAgIGlmIChpID4gLTEpCiAgICAgICAgewogICAgICAgICAgICByZXNvdXJjZUlkID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZyhpICsgMSk7CiAgICAgICAgICAgIHJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgaSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQWxwYWNhLmVuZHNXaXRoKHJlc291cmNlUGF0aCwgIi8iKSkgewogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIHJlc291cmNlUGF0aC5sZW5ndGggLSAxKTsKICAgICAgICB9CgogICAgICAgIHZhciBwYXJ0cyA9IHt9OwogICAgICAgIHBhcnRzLnBhdGggPSByZXNvdXJjZVBhdGg7CgogICAgICAgIGlmIChyZXNvdXJjZUlkKQogICAgICAgIHsKICAgICAgICAgICAgcGFydHMuaWQgPSByZXNvdXJjZUlkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgZmllbGQgYnkgaXRzIHByb3BlcnR5IGlkLgogICAgICoKICAgICAqIEBwYXJhbSBjb250YWluZXJGaWVsZAogICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAqIEByZXR1cm5zIHtudWxsfQogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkID0gZnVuY3Rpb24oY29udGFpbmVyRmllbGQsIHByb3BlcnR5SWRPclJlZmVyZW5jZUlkKQogICAgewogICAgICAgIHZhciByZXNvbHZlZEZpZWxkID0gbnVsbDsKCiAgICAgICAgaWYgKHR5cGVvZihwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkgPT09ICJzdHJpbmciKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDAgJiYgcHJvcGVydHlJZC5sZW5ndGggPiAyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXRoIGJhc2VkIGxvb2t1cD8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMiIHx8IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkID09PSAiIy8iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaWQgbG9va3VwCgogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgdG9wIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgdG9wRmllbGQgPSBjb250YWluZXJGaWVsZDsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gcHJvcGVydHlJZE9yUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDEpOwoKICAgICAgICAgICAgICAgIHJlc29sdmVkRmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UodG9wRmllbGQsIHJlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBsb29rdXAKICAgICAgICAgICAgICAgIHJlc29sdmVkRmllbGQgPSBjb250YWluZXJGaWVsZC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNvbHZlZEZpZWxkOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgZmllbGQgYmFzZWQgb24gaXRzICJyZWZlcmVuY2UgaWQiIHJlbGF0aXZlIHRvIGEgdG9wIGxldmVsIGZpZWxkLiAgVGhpcyB3YWxrcyBkb3duIHRoZSBmaWVsZCB0cmVlIGFuZAogICAgICogbG9va3MgZm9yIG1hdGNoaW5nIHNjaGVtYS5pZCByZWZlcmVuY2VzIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGZpZWxkLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZAogICAgICogQHBhcmFtIHJlZmVyZW5jZUlkCiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlRmllbGRCeVJlZmVyZW5jZSA9IGZ1bmN0aW9uKGZpZWxkLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoZmllbGQuc2NoZW1hICYmIGZpZWxkLnNjaGVtYS5pZCA9PSByZWZlcmVuY2VJZCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmllbGQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UoY2hpbGQsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgZmlyc3QgYXJndW1lbnQgYXJlIGVxdWFsIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgogICAgICoKICAgICAqIEBwYXJhbSBmaXJzdCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcGFyYW0gc2Vjb25kIGVpdGhlciBhIHNjYWxhciB2YWx1ZSBvciBhIGNvbnRhaW5lciAob2JqZWN0IG9yIGFycmF5KSBvZiB2YWx1ZXMKICAgICAqIEByZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG1hdGNoIGlzIGZvdW5kCiAgICAgKi8KICAgIEFscGFjYS5hbnlFcXVhbGl0eSA9IGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpCiAgICB7CiAgICAgICAgLy8gY29weSB2YWx1ZXMgZnJvbSBmaXJzdCBpbnRvIGEgdmFsdWVzIGxvb2t1cCBtYXAKICAgICAgICB2YXIgdmFsdWVzID0ge307CiAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KGZpcnN0KSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlc1tmaXJzdFtrXV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlc1tmaXJzdF0gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlOwoKICAgICAgICAvLyBjaGVjayB2YWx1ZXMgZnJvbSBzZWNvbmQgYWdhaW5zdCB0aGUgbG9va3VwIG1hcAogICAgICAgIGlmICh0eXBlb2Yoc2Vjb25kKSA9PT0gIm9iamVjdCIgfHwgQWxwYWNhLmlzQXJyYXkoc2Vjb25kKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2Vjb25kKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHNlY29uZFtrXTsKCiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW3ZdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVzW3NlY29uZF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKCiAgICBBbHBhY2Euc2VyaWVzID0gQWxwYWNhLnNlcmlhbCA9IGZ1bmN0aW9uKGZ1bmNzLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBhc3luYy5zZXJpZXMoZnVuY3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EucGFyYWxsZWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMucGFyYWxsZWwoZnVuY3MsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EubmV4dFRpY2sgPSBmdW5jdGlvbihmKQogICAgewogICAgICAgIGFzeW5jLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ29tcGlsZXMgdGhlIHZhbGlkYXRpb24gY29udGV4dCBmb3IgdGhlIGNoYWluIG9mIGZpZWxkcyBmcm9tIHRoZSB0b3AtbW9zdCBkb3duIHRvIHRoZSBnaXZlbiBmaWVsZC4KICAgICAqIEVhY2ggdmFsaWRhdGlvbiBjb250ZXh0IGVudHJ5IGlzIGEgZmllbGQgaW4gdGhlIGNoYWluIHdoaWNoIGRlc2NyaWJlcyB0aGUgZm9sbG93aW5nOgogICAgICoKICAgICAqICAgIHsKICAgICAqICAgICAgICJmaWVsZCI6IHRoZSBmaWVsZCBpbnN0YW5jZSwKICAgICAqICAgICAgICJiZWZvcmUiOiB0aGUgYmVmb3JlIHZhbHVlIChib29sZWFuKQogICAgICogICAgICAgImFmdGVyIjogdGhlIGFmdGVyIHZhbHVlIChib29sZWFuKQogICAgICogICAgICAgInZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIHZhbGlkYXRlZCAoc3dpdGNoZXMgc3RhdGUgZnJvbSBpbnZhbGlkIHRvIHZhbGlkKQogICAgICogICAgICAgImludmFsaWRhdGVkIjogKG9wdGlvbmFsKSBpZiB0aGUgZmllbGQgaW52YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gdmFsaWQgdG8gaW52YWxpZCkKICAgICAqICAgIH0KICAgICAqCiAgICAgKiBUaGlzIGhhbmRzIGJhY2sgYW4gYXJyYXkgb2YgZW50cmllcyB3aXRoIHRoZSBjaGlsZCBmaWVsZCBmaXJzdCBhbmQgY29udGludWluZyB1cCB0aGUgcGFyZW50IGNoYWluLgogICAgICogVGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5IGlzIHRoZSB0b3AgbW9zdCBwYXJlbnQgZmllbGQuCiAgICAgKgogICAgICogVGhlIGNhbGxiYWNrIGlzIGZpcmVkIHdpdGggdGhlIGFzc2VtYmxlZCBjb250ZXh0LCBhbGxvd2luZyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gdG8gcnVuLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZAogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge0FycmF5fQogICAgICovCiAgICBBbHBhY2EuY29tcGlsZVZhbGlkYXRpb25Db250ZXh0ID0gZnVuY3Rpb24oZmllbGQsIGNhbGxiYWNrKQogICAgewogICAgICAgIC8vIHdhbGsgdXAgdGhlIHBhcmVudCB0cmVlIHVudGlsIHdlIGZpbmQgdGhlIHRvcC1tb3N0IGNvbnRyb2wKICAgICAgICAvLyB0aGlzIHNlcnZlcyBhcyBvdXIgc3RhcnRpbmcgcG9pbnQgZm9yIGRvd253YXJkIHZhbGlkYXRpb24KICAgICAgICB2YXIgY2hhaW4gPSBbXTsKICAgICAgICB2YXIgcGFyZW50ID0gZmllbGQ7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzVmFsaWRhdGlvblBhcnRpY2lwYW50KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2gocGFyZW50KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAocGFyZW50KTsKCiAgICAgICAgLy8gcmV2ZXJzZSBzbyB0b3AgbW9zdCBwYXJlbnQgaXMgZmlyc3QKICAgICAgICBjaGFpbi5yZXZlcnNlKCk7CgogICAgICAgIC8vIGNvbXBpbGF0aW9uIGNvbnRleHQKICAgICAgICB2YXIgY29udGV4dCA9IFtdOwoKICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdGhhdCBzZXRzIHZhbGlkYXRpb24gZm9yIGEgc2luZ2xlIGZpZWxkCiAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihjaGFpbiwgY29udGV4dCwgZG9uZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY2hhaW4gfHwgY2hhaW4ubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY3VycmVudCA9IGNoYWluWzBdOwoKICAgICAgICAgICAgdmFyIGVudHJ5ID0ge307CiAgICAgICAgICAgIGVudHJ5LmlkID0gY3VycmVudC5nZXRJZCgpOwogICAgICAgICAgICBlbnRyeS5maWVsZCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjdXJyZW50LnBhdGg7CgogICAgICAgICAgICAvLyBCRUZPUkUgZmllbGQgdmFsaWRhdGlvbiBzdGF0dXMKICAgICAgICAgICAgdmFyIGJlZm9yZVN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICBpZiAoY3VycmVudC5pc0NvbnRhaW5lcigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVudHJ5LmJlZm9yZSA9IGJlZm9yZVN0YXR1czsKCiAgICAgICAgICAgIHZhciBvdXJzZWx2ZXNIYW5kbGVyID0gZnVuY3Rpb24oY3VycmVudCwgZW50cnksIHdlRmluaXNoZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c2x5VmFsaWRhdGVkID0gY3VycmVudC5fcHJldmlvdXNseVZhbGlkYXRlZDsKCiAgICAgICAgICAgICAgICAvLyBub3cgcnVuIHRoZSB2YWxpZGF0aW9uIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICBjdXJyZW50LnZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgY3VzdG9tIHZhbGlkYXRpb24gKGlmIGV4aXN0cykgZm9yIGp1c3QgdGhpcyBvbmUgZmllbGQKICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoaXMganVzdCBmaXJlcyB0aGUgY2FsbGJhY2sKICAgICAgICAgICAgICAgIGN1cnJlbnQuX3ZhbGlkYXRlQ3VzdG9tVmFsaWRhdG9yKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBBRlRFUiBmaWVsZCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuYWZ0ZXIgPSBhZnRlclN0YXR1czsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBmaWVsZCdzIHZhbGlkYXRpb24gc3RhdHVzIGZsaXBwZWQsIGZpcmUgdHJpZ2dlcnMKICAgICAgICAgICAgICAgICAgICBlbnRyeS52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmICghYmVmb3JlU3RhdHVzICYmIGFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmVmb3JlU3RhdHVzICYmICFhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBmaWVsZHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiB2YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcHJldmlvdXNseVZhbGlkYXRlZCAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb250YWluZXIgPSBjdXJyZW50LmlzQ29udGFpbmVyKCk7CiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWQgPSBlbnRyeS5hZnRlcjsKCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXNoKGVudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgd2VGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdGVwIGRvd24gaW50byBjaGFpbgogICAgICAgICAgICAvLyB3ZSBkbyBjaGlsZHJlbiBiZWZvcmUgb3Vyc2VsdmVzCiAgICAgICAgICAgIGlmIChjaGFpbi5sZW5ndGggPiAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjb3B5IGFycmF5CiAgICAgICAgICAgICAgICB2YXIgY2hpbGRDaGFpbiA9IGNoYWluLnNsaWNlKDApOwogICAgICAgICAgICAgICAgY2hpbGRDaGFpbi5zaGlmdCgpOwogICAgICAgICAgICAgICAgZihjaGlsZENoYWluLCBjb250ZXh0LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBvdXJzZWx2ZXNIYW5kbGVyKGN1cnJlbnQsIGVudHJ5LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvdXJzZWx2ZXNIYW5kbGVyKGN1cnJlbnQsIGVudHJ5LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZihjaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRleHQpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EudXBkYXRlVmFsaWRhdGlvblN0YXRlRm9yQ29udGV4dCA9IGZ1bmN0aW9uKHZpZXcsIGNvbnRleHQpCiAgICB7CiAgICAgICAgLy8gd2FsayB0aHJvdWdoIGVhY2ggYW5kIGZsaXAgYW55IERPTSBVSSBiYXNlZCBvbiBlbnRyeSBzdGF0ZQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dC5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbnRyeSA9IGNvbnRleHRbaV07CiAgICAgICAgICAgIHZhciBmaWVsZCA9IGVudHJ5LmZpZWxkOwoKICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIHZhbGlkYXRpb24gVUkgbWFya2VycwogICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkucmVtb3ZlQ2xhc3MoImFscGFjYS1pbnZhbGlkIGFscGFjYS1pbnZhbGlkLWhpZGRlbiBhbHBhY2EtdmFsaWQiKTsKICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJjbGVhclZhbGlkaXR5Iik7CgogICAgICAgICAgICAvLyB2YWxpZD8KICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC12YWxpZCIpOwogICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJ2YWxpZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbWFya3VwIGludmFsaWRhdGlvbiBzdGF0ZSBmb3IgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5maXJlQ2FsbGJhY2soImludmFsaWQiLCBoaWRkZW4pOwoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGRlbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLWludmFsaWQtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZmllbGQgaXMgaW52YWxpZCBhbmQgaXMgYWxzbyByZWFkLW9ubHksIHNvIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBpbmZvcm0gdGhlIGVuZC11c2VyCiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBVSSAoc2luY2UgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQpCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSwgd2UgbG9nIGEgbWVzc2FnZSB0byBkZWJ1ZyB0byBpbmZvcm0gdGhlIGRldmVsb3BlcgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJUaGUgZmllbGQgKGlkPSIgKyBmaWVsZC5nZXRJZCgpICsgIiwgdGl0bGU9IiArIGZpZWxkLmdldFRpdGxlKCkgKyAiLCBwYXRoPSIgKyBmaWVsZC5wYXRoICsgIikgaXMgaW52YWxpZCBhbmQgYWxzbyByZWFkLW9ubHkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVFJJR0dFUlMKICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJ2YWxpZGF0ZWQiKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnRyaWdnZXIoImludmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWxsb3cgZm9yIHRoZSBtZXNzYWdlIHRvIGNoYW5nZQogICAgICAgICAgICBpZiAoZmllbGQub3B0aW9ucy5zaG93TWVzc2FnZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaW5pdGlhbGl6aW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQub3B0aW9ucy5yZWFkb25seSB8fCBBbHBhY2Euc2hvd1JlYWRPbmx5SW52YWxpZFN0YXRlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBmaWVsZC52YWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLnZhbGlkYXRpb25bbWVzc2FnZUlkXVsic3RhdHVzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IG1lc3NhZ2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bIm1lc3NhZ2UiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kaXNwbGF5TWVzc2FnZShtZXNzYWdlcywgZmllbGQudmFsaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBvdmVyIHRoZSBmaWVsZCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiByZWN1cnNpdmVseS4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBmbgogICAgICovCiAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4gPSBmdW5jdGlvbihmaWVsZCwgZm4pCiAgICB7CiAgICAgICAgZm4oZmllbGQpOwoKICAgICAgICAvLyBpZiB0aGUgZmllbGQgaGFzIGNoaWxkcmVuLCBnbyBkZXB0aCBmaXJzdAogICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLmNoaWxkcmVuW2ldLCBmbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgc3RyaW5nIDxmaW5kPiB3aXRoIHRoZSByZXBsYWNlbWVudCB0ZXh0IDxyZXBsYWNlPi4KICAgICAqCiAgICAgKiBAcGFyYW0gdGV4dAogICAgICogQHBhcmFtIGZpbmQKICAgICAqIEBwYXJhbSByZXBsYWNlCiAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAqLwogICAgQWxwYWNhLnJlcGxhY2VBbGwgPSBmdW5jdGlvbih0ZXh0LCBmaW5kLCByZXBsYWNlKQogICAgewogICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChmaW5kLCAnZycpLCByZXBsYWNlKTsKICAgIH07CgogICAgQWxwYWNhLmFzQXJyYXkgPSBmdW5jdGlvbih0aGluZykKICAgIHsKICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHRoaW5nKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwogICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGluZzsKICAgIH07CgoKCgoKCgoKCgoKCgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBBU1lOQwogICAgLy8KICAgIC8vIEhlcmUgd2UgcHJvdmlkZSBhIHJlZHVjZWQgdmVyc2lvbiBvZiB0aGUgd29uZGVyZnVsIGFzeW5jIGxpYnJhcnkuICBUaGlzIGlzIGVudGlyZWx5IGlubGluZSBhbmQKICAgIC8vIHdpbGwgaGF2ZSBubyBiZWFyaW5nIG9uIGFueSBleHRlcm5hbCBkZXBlbmRlbmNpZXMgb24gYXN5bmMuCiAgICAvLwogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nhb2xhbi9hc3luYwogICAgLy8gQ29weXJpZ2h0IChjKSAyMDEwIENhb2xhbiBNY01haG9uCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8qZ2xvYmFsIHNldEltbWVkaWF0ZTogZmFsc2UsIHNldFRpbWVvdXQ6IGZhbHNlLCBjb25zb2xlOiBmYWxzZSAqLwogICAgKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgdmFyIGFzeW5jID0ge307CgogICAgICAgIC8vIGdsb2JhbCBvbiB0aGUgc2VydmVyLCB3aW5kb3cgaW4gdGhlIGJyb3dzZXIKICAgICAgICB2YXIgcm9vdCwgcHJldmlvdXNfYXN5bmM7CgogICAgICAgIHJvb3QgPSB0aGlzOwogICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKICAgICAgICAgICAgcHJldmlvdXNfYXN5bmMgPSByb290LmFzeW5jOwogICAgICAgIH0KCiAgICAgICAgYXN5bmMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcm9vdC5hc3luYyA9IHByZXZpb3VzX2FzeW5jOwogICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gb25seV9vbmNlKGZuKSB7CiAgICAgICAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkLiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZuLmFwcGx5KHJvb3QsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLy8vIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsaXR5IGZ1bmN0aW9ucyAvLy8vCgogICAgICAgIHZhciBfZWFjaCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yKSB7CiAgICAgICAgICAgIGlmIChhcnIuZm9yRWFjaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5mb3JFYWNoKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2ldLCBpLCBhcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9tYXAgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLm1hcCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5tYXAoaXRlcmF0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvcih4LCBpLCBhKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICB9OwoKICAgICAgICB2YXIgX3JlZHVjZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtZW1vKSB7CiAgICAgICAgICAgIGlmIChhcnIucmVkdWNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLnJlZHVjZShpdGVyYXRvciwgbWVtbyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkgewogICAgICAgICAgICAgICAgbWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHgsIGksIGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG1lbW87CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9rZXlzID0gZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBrZXlzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBrZXlzOwogICAgICAgIH07CgogICAgICAgIC8vLy8gZXhwb3J0ZWQgYXN5bmMgbW9kdWxlIGZ1bmN0aW9ucyAvLy8vCgogICAgICAgIC8vLy8gbmV4dFRpY2sgaW1wbGVtZW50YXRpb24gd2l0aCBicm93c2VyLWNvbXBhdGlibGUgZmFsbGJhY2sgLy8vLwogICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIShwcm9jZXNzLm5leHRUaWNrKSkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhc3luYy5uZXh0VGljayA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZm4sIDApOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrOwogICAgICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGRpcmVjdCBhbGlhcyBmb3IgSUUxMCBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGZuKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYXN5bmMuZWFjaCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBvbmx5X29uY2UoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZvckVhY2ggPSBhc3luYy5lYWNoOwoKICAgICAgICBhc3luYy5lYWNoU2VyaWVzID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CiAgICAgICAgICAgIHZhciBpdGVyYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2NvbXBsZXRlZF0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoU2VyaWVzID0gYXN5bmMuZWFjaFNlcmllczsKCiAgICAgICAgYXN5bmMuZWFjaExpbWl0ID0gZnVuY3Rpb24gKGFyciwgbGltaXQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgZm4gPSBfZWFjaExpbWl0KGxpbWl0KTsKICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgW2FyciwgaXRlcmF0b3IsIGNhbGxiYWNrXSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoTGltaXQgPSBhc3luYy5lYWNoTGltaXQ7CgogICAgICAgIHZhciBfZWFjaExpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7CgogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ZWQgPSAwOwogICAgICAgICAgICAgICAgdmFyIHJ1bm5pbmcgPSAwOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbiByZXBsZW5pc2ggKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nIDwgbGltaXQgJiYgc3RhcnRlZCA8IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltzdGFydGVkIC0gMV0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsZW5pc2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIHZhciBkb1BhcmFsbGVsID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2FzeW5jLmVhY2hdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICB2YXIgZG9QYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24obGltaXQsIGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW19lYWNoTGltaXQobGltaXQpXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvU2VyaWVzID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2FzeW5jLmVhY2hTZXJpZXNdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIHZhciBfYXN5bmNNYXAgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKGVyciwgdikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbeC5pbmRleF0gPSB2OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5tYXAgPSBkb1BhcmFsbGVsKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwU2VyaWVzID0gZG9TZXJpZXMoX2FzeW5jTWFwKTsKICAgICAgICBhc3luYy5tYXBMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgcmV0dXJuIF9tYXBMaW1pdChsaW1pdCkoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwTGltaXQgPSBmdW5jdGlvbihsaW1pdCkgewogICAgICAgICAgICByZXR1cm4gZG9QYXJhbGxlbExpbWl0KGxpbWl0LCBfYXN5bmNNYXApOwogICAgICAgIH07CgogICAgICAgIC8vIHJlZHVjZSBvbmx5IGhhcyBhIHNlcmllcyB2ZXJzaW9uLCBhcyBkb2luZyByZWR1Y2UgaW4gcGFyYWxsZWwgd29uJ3QKICAgICAgICAvLyB3b3JrIGluIG1hbnkgc2l0dWF0aW9ucy4KICAgICAgICBhc3luYy5yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMuZWFjaFNlcmllcyhhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IobWVtbywgeCwgZnVuY3Rpb24gKGVyciwgdikgewogICAgICAgICAgICAgICAgICAgIG1lbW8gPSB2OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBtZW1vKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBpbmplY3QgYWxpYXMKICAgICAgICBhc3luYy5pbmplY3QgPSBhc3luYy5yZWR1Y2U7CiAgICAgICAgLy8gZm9sZGwgYWxpYXMKICAgICAgICBhc3luYy5mb2xkbCA9IGFzeW5jLnJlZHVjZTsKCiAgICAgICAgYXN5bmMucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJldmVyc2VkID0gX21hcChhcnIsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfSkucmV2ZXJzZSgpOwogICAgICAgICAgICBhc3luYy5yZWR1Y2UocmV2ZXJzZWQsIG1lbW8sIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICAvLyBmb2xkciBhbGlhcwogICAgICAgIGFzeW5jLmZvbGRyID0gYXN5bmMucmVkdWNlUmlnaHQ7CgogICAgICAgIHZhciBfZmlsdGVyID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZmlsdGVyID0gZG9QYXJhbGxlbChfZmlsdGVyKTsKICAgICAgICBhc3luYy5maWx0ZXJTZXJpZXMgPSBkb1NlcmllcyhfZmlsdGVyKTsKICAgICAgICAvLyBzZWxlY3QgYWxpYXMKICAgICAgICBhc3luYy5zZWxlY3QgPSBhc3luYy5maWx0ZXI7CiAgICAgICAgYXN5bmMuc2VsZWN0U2VyaWVzID0gYXN5bmMuZmlsdGVyU2VyaWVzOwoKICAgICAgICB2YXIgX3JlamVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICghdikgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CiAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5yZWplY3QgPSBkb1BhcmFsbGVsKF9yZWplY3QpOwogICAgICAgIGFzeW5jLnJlamVjdFNlcmllcyA9IGRvU2VyaWVzKF9yZWplY3QpOwoKICAgICAgICB2YXIgX2RldGVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHgpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZGV0ZWN0ID0gZG9QYXJhbGxlbChfZGV0ZWN0KTsKICAgICAgICBhc3luYy5kZXRlY3RTZXJpZXMgPSBkb1NlcmllcyhfZGV0ZWN0KTsKCiAgICAgICAgYXN5bmMuc29tZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8vIGFueSBhbGlhcwogICAgICAgIGFzeW5jLmFueSA9IGFzeW5jLnNvbWU7CgogICAgICAgIGFzeW5jLmV2ZXJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8vIGFsbCBhbGlhcwogICAgICAgIGFzeW5jLmFsbCA9IGFzeW5jLmV2ZXJ5OwoKICAgICAgICBhc3luYy5zb3J0QnkgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgYXN5bmMubWFwKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAoZXJyLCBjcml0ZXJpYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHt2YWx1ZTogeCwgY3JpdGVyaWE6IGNyaXRlcmlhfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgX21hcChyZXN1bHRzLnNvcnQoZm4pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLmF1dG8gPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIHZhciBrZXlzID0gX2tleXModGFza3MpOwogICAgICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CgogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gW107CiAgICAgICAgICAgIHZhciBhZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoZm4pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHRhc2tDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF9lYWNoKGxpc3RlbmVycy5zbGljZSgwKSwgZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgYWRkTGlzdGVuZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKF9rZXlzKHJlc3VsdHMpLmxlbmd0aCA9PT0ga2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIF9lYWNoKGtleXMsIGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICB2YXIgdGFzayA9ICh0YXNrc1trXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSA/IFt0YXNrc1trXV06IHRhc2tzW2tdOwogICAgICAgICAgICAgICAgdmFyIHRhc2tDYWxsYmFjayA9IGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhZmVSZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKF9rZXlzKHJlc3VsdHMpLCBmdW5jdGlvbihya2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlUmVzdWx0c1tya2V5XSA9IHJlc3VsdHNbcmtleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBzYWZlUmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc2FmZVJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHN1YnNlcXVlbnQgZXJyb3JzIGhpdHRpbmcgY2FsbGJhY2sgbXVsdGlwbGUgdGltZXMKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUodGFza0NvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVzID0gdGFzay5zbGljZSgwLCBNYXRoLmFicyh0YXNrLmxlbmd0aCAtIDEpKSB8fCBbXTsKICAgICAgICAgICAgICAgIHZhciByZWFkeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZHVjZShyZXF1aXJlcywgZnVuY3Rpb24gKGEsIHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChhICYmIHJlc3VsdHMuaGFzT3duUHJvcGVydHkoeCkpOwogICAgICAgICAgICAgICAgICAgIH0sIHRydWUpICYmICFyZXN1bHRzLmhhc093blByb3BlcnR5KGspOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChyZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrW3Rhc2subGVuZ3RoIC0gMV0odGFza0NhbGxiYWNrLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy53YXRlcmZhbGwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICh0YXNrcy5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IHRvIHdhdGVyZmFsbCBtdXN0IGJlIGFuIGFycmF5IG9mIGZ1bmN0aW9ucycpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0YXNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3cmFwSXRlcmF0b3IgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh3cmFwSXRlcmF0b3IobmV4dCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHdyYXBJdGVyYXRvcihhc3luYy5pdGVyYXRvcih0YXNrcykpKCk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9wYXJhbGxlbCA9IGZ1bmN0aW9uKGVhY2hmbiwgdGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIGlmICh0YXNrcy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgIGVhY2hmbi5tYXAodGFza3MsIGZ1bmN0aW9uIChmbiwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgZXJyLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICAgIGVhY2hmbi5lYWNoKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5wYXJhbGxlbCA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBhc3luYy5tYXAsIGVhY2g6IGFzeW5jLmVhY2ggfSwgdGFza3MsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5wYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24odGFza3MsIGxpbWl0LCBjYWxsYmFjaykgewogICAgICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IF9tYXBMaW1pdChsaW1pdCksIGVhY2g6IF9lYWNoTGltaXQobGltaXQpIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuc2VyaWVzID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBhc3luYy5tYXBTZXJpZXModGFza3MsIGZ1bmN0aW9uIChmbiwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgZXJyLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoX2tleXModGFza3MpLCBmdW5jdGlvbiAoaywgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICB0YXNrc1trXShmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLml0ZXJhdG9yID0gZnVuY3Rpb24gKHRhc2tzKSB7CiAgICAgICAgICAgIHZhciBtYWtlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzW2luZGV4XS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4ubmV4dCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZuLm5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA8IHRhc2tzLmxlbmd0aCAtIDEpID8gbWFrZUNhbGxiYWNrKGluZGV4ICsgMSk6IG51bGw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gbWFrZUNhbGxiYWNrKDApOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLmFwcGx5ID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSgKICAgICAgICAgICAgICAgICAgICBudWxsLCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX2NvbmNhdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByID0gW107CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYikgewogICAgICAgICAgICAgICAgZm4oeCwgZnVuY3Rpb24gKGVyciwgeSkgewogICAgICAgICAgICAgICAgICAgIHIgPSByLmNvbmNhdCh5IHx8IFtdKTsKICAgICAgICAgICAgICAgICAgICBjYihlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuY29uY2F0ID0gZG9QYXJhbGxlbChfY29uY2F0KTsKICAgICAgICBhc3luYy5jb25jYXRTZXJpZXMgPSBkb1NlcmllcyhfY29uY2F0KTsKCiAgICAgICAgYXN5bmMud2hpbHN0ID0gZnVuY3Rpb24gKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBpZiAodGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMud2hpbHN0KHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5kb1doaWxzdCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgICAgIGFzeW5jLmRvV2hpbHN0KGl0ZXJhdG9yLCB0ZXN0LCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy51bnRpbCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKCF0ZXN0KCkpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy51bnRpbCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9VbnRpbCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1VudGlsKGl0ZXJhdG9yLCB0ZXN0LCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5xdWV1ZSA9IGZ1bmN0aW9uICh3b3JrZXIsIGNvbmN1cnJlbmN5KSB7CiAgICAgICAgICAgIGlmIChjb25jdXJyZW5jeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2luc2VydChxLCBkYXRhLCBwb3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpZihkYXRhLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEudGFza3MudW5zaGlmdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAocS5zYXR1cmF0ZWQgJiYgcS50YXNrcy5sZW5ndGggPT09IGNvbmN1cnJlbmN5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEuc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShxLnByb2Nlc3MpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB3b3JrZXJzID0gMDsKICAgICAgICAgICAgdmFyIHEgPSB7CiAgICAgICAgICAgICAgICB0YXNrczogW10sCiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeTogY29uY3VycmVuY3ksCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgX2luc2VydChxLCBkYXRhLCBmYWxzZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVuc2hpZnQ6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgdHJ1ZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2VycyA8IHEuY29uY3VycmVuY3kgJiYgcS50YXNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBxLnRhc2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmVtcHR5ICYmIHEudGFza3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VycyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5jYWxsYmFjay5hcHBseSh0YXNrLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEuZHJhaW4gJiYgcS50YXNrcy5sZW5ndGggKyB3b3JrZXJzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5kcmFpbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5wcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYiA9IG9ubHlfb25jZShuZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyKHRhc2suZGF0YSwgY2IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS50YXNrcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXJzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gcTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5jYXJnbyA9IGZ1bmN0aW9uICh3b3JrZXIsIHBheWxvYWQpIHsKICAgICAgICAgICAgdmFyIHdvcmtpbmcgICAgID0gZmFsc2UsCiAgICAgICAgICAgICAgICB0YXNrcyAgICAgICA9IFtdOwoKICAgICAgICAgICAgdmFyIGNhcmdvID0gewogICAgICAgICAgICAgICAgdGFza3M6IHRhc2tzLAogICAgICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCwKICAgICAgICAgICAgICAgIHNhdHVyYXRlZDogbnVsbCwKICAgICAgICAgICAgICAgIGVtcHR5OiBudWxsLAogICAgICAgICAgICAgICAgZHJhaW46IG51bGwsCiAgICAgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXJnby5zYXR1cmF0ZWQgJiYgdGFza3MubGVuZ3RoID09PSBwYXlsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5zYXR1cmF0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShjYXJnby5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5kcmFpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdHMgPSB0eXBlb2YgcGF5bG9hZCA9PT0gJ251bWJlcicgPwogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5zcGxpY2UoMCwgcGF5bG9hZCkgOgogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5zcGxpY2UoMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IF9tYXAodHMsIGZ1bmN0aW9uICh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGlmKGNhcmdvLmVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHdvcmtlcihkcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2godHMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2FsbGJhY2suYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JraW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gY2FyZ287CiAgICAgICAgfTsKCiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqLwogICAgICAgIHZhciBfY29uc29sZV9mbiA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc29sZVtuYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2goYXJncywgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW25hbWVdKHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi8KCiAgICAgICAgYXN5bmMubG9nID0gX2NvbnNvbGVfZm4oJ2xvZycpOwogICAgICAgIGFzeW5jLmRpciA9IF9jb25zb2xlX2ZuKCdkaXInKTsKICAgICAgICAvKmFzeW5jLmluZm8gPSBfY29uc29sZV9mbignaW5mbycpOwogICAgICAgICBhc3luYy53YXJuID0gX2NvbnNvbGVfZm4oJ3dhcm4nKTsKICAgICAgICAgYXN5bmMuZXJyb3IgPSBfY29uc29sZV9mbignZXJyb3InKTsqLwoKICAgICAgICBhc3luYy5tZW1vaXplID0gZnVuY3Rpb24gKGZuLCBoYXNoZXIpIHsKICAgICAgICAgICAgdmFyIG1lbW8gPSB7fTsKICAgICAgICAgICAgdmFyIHF1ZXVlcyA9IHt9OwogICAgICAgICAgICBoYXNoZXIgPSBoYXNoZXIgfHwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmdzLnBvcCgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IGhhc2hlci5hcHBseShudWxsLCBhcmdzKTsKICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gbWVtbykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIG1lbW9ba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgaW4gcXVldWVzKSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0ucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBxdWV1ZXNba2V5XSA9IFtjYWxsYmFja107CiAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncy5jb25jYXQoW2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtb1trZXldID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcXVldWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH1dKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG1lbW9pemVkLm1lbW8gPSBtZW1vOwogICAgICAgICAgICBtZW1vaXplZC51bm1lbW9pemVkID0gZm47CiAgICAgICAgICAgIHJldHVybiBtZW1vaXplZDsKICAgICAgICB9OwoKICAgICAgICBhc3luYy51bm1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoZm4udW5tZW1vaXplZCB8fCBmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy50aW1lcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBjb3VudGVyID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhc3luYy5tYXAoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy50aW1lc1NlcmllcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBjb3VudGVyID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhc3luYy5tYXBTZXJpZXMoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5jb21wb3NlID0gZnVuY3Rpb24gKC8qIGZ1bmN0aW9ucy4uLiAqLykgewogICAgICAgICAgICB2YXIgZm5zID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIGFzeW5jLnJlZHVjZShmbnMsIGFyZ3MsIGZ1bmN0aW9uIChuZXdhcmdzLCBmbiwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgbmV3YXJncy5jb25jYXQoW2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoZXJyLCBuZXh0YXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1dKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoYXQsIFtlcnJdLmNvbmNhdChyZXN1bHRzKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9hcHBseUVhY2ggPSBmdW5jdGlvbiAoZWFjaGZuLCBmbnMgLyphcmdzLi4uKi8pIHsKICAgICAgICAgICAgdmFyIGdvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCBmdW5jdGlvbiAoZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MuY29uY2F0KFtjYl0pKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICAgICAgICAgICAgICByZXR1cm4gZ28uYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ287CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGFzeW5jLmFwcGx5RWFjaCA9IGRvUGFyYWxsZWwoX2FwcGx5RWFjaCk7CiAgICAgICAgYXN5bmMuYXBwbHlFYWNoU2VyaWVzID0gZG9TZXJpZXMoX2FwcGx5RWFjaCk7CgogICAgICAgIGFzeW5jLmZvcmV2ZXIgPSBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmbihuZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgfTsKCiAgICAgICAgLyoKICAgICAgICAvLyBBTUQgLyBSZXF1aXJlSlMKICAgICAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVmaW5lLmFtZCkgewogICAgICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhc3luYzsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIE5vZGUuanMKICAgICAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGFzeW5jOwogICAgICAgIH0KICAgICAgICAvLyBpbmNsdWRlZCBkaXJlY3RseSB2aWEgPHNjcmlwdD4gdGFnCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgcm9vdC5hc3luYyA9IGFzeW5jOwoKCgoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIEVRVUlWIEFORCBIT09aSVQKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8vIERldGVybWluZSB3aGF0IGlzIG8uCiAgICAgICAgZnVuY3Rpb24gaG9veml0KG8pIHsKICAgICAgICAgICAgaWYgKG8uY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChvLmNvbnN0cnVjdG9yID09PSBCb29sZWFuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChvLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpIHsKCiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5hbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInVuZGVmaW5lZCI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IHR5cGVvZiBudWxsID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgW10gPT09IG9iamVjdAogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IHR5cGVvZiBuZXcgRGF0ZSgpID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogLy4vIGluc3RhbmNlb2YgT2JqZWN0OwogICAgICAgICAgICAgICAgLy8gICAgICAgICAgIC8uLyBpbnN0YW5jZW9mIFJlZ0V4cDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHR5cGVvZiAvLi8gPT09ICJmdW5jdGlvbiI7IC8vID0+IGZhbHNlIGluIElFIGFuZCBPcGVyYSwKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBpbiBGRiBhbmQgU2FmYXJpCiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJlZ0V4cCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJyZWdleHAiOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbyA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENhbGwgdGhlIG8gcmVsYXRlZCBjYWxsYmFjayB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCiAgICAgICAgZnVuY3Rpb24gYmluZENhbGxiYWNrcyhvLCBjYWxsYmFja3MsIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIHByb3AgPSBob296aXQobyk7CiAgICAgICAgICAgIGlmIChwcm9wKSB7CiAgICAgICAgICAgICAgICBpZiAoaG9veml0KGNhbGxiYWNrc1twcm9wXSkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdLmFwcGx5KGNhbGxiYWNrcywgYXJncyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFja3NbcHJvcF07IC8vIG9yIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUZXN0IGZvciBlcXVhbGl0eSBhbnkgSmF2YVNjcmlwdCB0eXBlLgogICAgICAgIHZhciBlcXVpdiA9IHJvb3QuZXF1aXYgPSBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlubmVyRXF1aXY7IC8vIHRoZSByZWFsIGVxdWl2IGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBjYWxsZXJzID0gW107IC8vIHN0YWNrIHRvIGRlY2lkZSBiZXR3ZWVuIHNraXAvYWJvcnQgZnVuY3Rpb25zCgogICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIC8vIGZvciBzdHJpbmcsIGJvb2xlYW4sIG51bWJlciBhbmQgbnVsbAogICAgICAgICAgICAgICAgZnVuY3Rpb24gdXNlU3RyaWN0RXF1YWxpdHkoYiwgYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgYS5jb25zdHJ1Y3RvciB8fCBhIGluc3RhbmNlb2YgYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaCBzaG9ydCBhbm5vdGFpb24gVlMgJ25ldycgYW5ub3RhdGlvbiBvZiBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gdmFyIGkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIHZhciBqID0gbmV3IE51bWJlcigxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT0gYjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA9PT0gYjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RyaW5nIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iOiB1c2VTdHJpY3RFcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAibnVtYmVyIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bGwiOiB1c2VTdHJpY3RFcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkIjogdXNlU3RyaWN0RXF1YWxpdHksCgogICAgICAgICAgICAgICAgICAgICJuYW4iOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4oYik7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgImRhdGUiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9veml0KGIpID09PSAiZGF0ZSIgJiYgYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJyZWdleHAiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9veml0KGIpID09PSAicmVnZXhwIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zb3VyY2UgPT09IGIuc291cmNlICYmIC8vIHRoZSByZWdleCBpdHNlbGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJiAvLyBhbmQgaXRzIG1vZGlmZXJzIChnbWkpIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAvLyAtIHNraXAgd2hlbiB0aGUgcHJvcGVydHkgaXMgYSBtZXRob2Qgb2YgYW4gaW5zdGFuY2UgKE9PUCkKICAgICAgICAgICAgICAgICAgICAvLyAtIGFib3J0IG90aGVyd2lzZSwKICAgICAgICAgICAgICAgICAgICAvLyAgIGluaXRpYWwgPT09IHdvdWxkIGhhdmUgY2F0Y2ggaWRlbnRpY2FsIHJlZmVyZW5jZXMgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGVyID0gY2FsbGVyc1tjYWxsZXJzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGVyICE9PSBPYmplY3QgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjYWxsZXIgIT09ICJ1bmRlZmluZWQiOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJhcnJheSI6IGZ1bmN0aW9uIChiLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYiBjb3VsZCBiZSBhbiBvYmplY3QgbGl0ZXJhbCBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoaG9veml0KGIpID09PSAiYXJyYXkiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBhLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiAhPT0gYi5sZW5ndGgpIHsgLy8gc2FmZSBhbmQgZmFzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggISBpbm5lckVxdWl2KGFbaV0sIGJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJvYmplY3QiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVxID0gdHJ1ZTsgLy8gdW5sZXNzIHdlIGNhbiBwcm9vdmUgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFQcm9wZXJ0aWVzID0gW10sIGJQcm9wZXJ0aWVzID0gW107IC8vIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIGNvbnN0cnVjdG9ycyBpcyBtb3JlIHN0cmljdCB0aGFuIHVzaW5nIGluc3RhbmNlb2YKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrIGNvbnN0cnVjdG9yIGJlZm9yZSB0cmF2ZXJzaW5nIHByb3BlcnRpZXMKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycy5wdXNoKGEuY29uc3RydWN0b3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGEpIHsgLy8gYmUgc3RyaWN0OiBkb24ndCBlbnN1cmVzIGhhc093blByb3BlcnR5IGFuZCBnbyBkZWVwCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBhJ3MgcHJvcGVydGllcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBpbm5lckVxdWl2KGFbaV0sIGJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycy5wb3AoKTsgLy8gdW5zdGFjaywgd2UgYXJlIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvcGVydGllcy5wdXNoKGkpOyAvLyBjb2xsZWN0IGIncyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZXMgaWRlbnRpY2FsIHByb3BlcnRpZXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXEgJiYgaW5uZXJFcXVpdihhUHJvcGVydGllcy5zb3J0KCksIGJQcm9wZXJ0aWVzLnNvcnQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSgpOwoKICAgICAgICAgICAgaW5uZXJFcXVpdiA9IGZ1bmN0aW9uICgpIHsgLy8gY2FuIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBlbmQgdHJhbnNpdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY2F0Y2ggdGhlIG1vc3QgeW91IGNhbgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsIHx8IHR5cGVvZiBhID09PSAidW5kZWZpbmVkIiB8fCB0eXBlb2YgYiA9PT0gInVuZGVmaW5lZCIgfHwgaG9veml0KGEpICE9PSBob296aXQoYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkb24ndCBsb3NlIHRpbWUgd2l0aCBlcnJvciBwcm9uZSBjYXNlcwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kQ2FsbGJhY2tzKGEsIGNhbGxiYWNrcywgW2IsIGFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gd2l0aCAoMS4ubikgYXJndW1lbnRzCiAgICAgICAgICAgICAgICB9KShhcmdzWzBdLCBhcmdzWzFdKSAmJiBhcmd1bWVudHMuY2FsbGVlLmFwcGx5KHRoaXMsIGFyZ3Muc3BsaWNlKDEsIGFyZ3MubGVuZ3RoIC0xKSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gaW5uZXJFcXVpdjsKCiAgICAgICAgfSgpOwoKICAgIH0oKSk7CgogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UUk9MX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udHJvbC1maWVsZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRhaW5lci1maWVsZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNID0gImFscGFjYS1tYXJrZXItY29udHJvbC1maWVsZC1pdGVtIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgPSAiZGF0YS1hbHBhY2EtY29udGFpbmVyLWZpZWxkLWl0ZW0ta2V5IjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWZvcm0taXRlbXMtZmllbGQiOwogICAgQWxwYWNhLkNMQVNTX0NPTlRBSU5FUiA9ICJhbHBhY2EtY29udGFpbmVyIjsKICAgIEFscGFjYS5DTEFTU19DT05UUk9MID0gImFscGFjYS1jb250cm9sIjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUID0gImFscGFjYS1tYXJrZXItaW5zZXJ0IjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZID0gImRhdGEtYWxwYWNhLW1hcmtlci1pbnNlcnQta2V5IjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLXRvb2xiYXIiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX1RPT0xCQVJfRklFTERfSUQgPSAiZGF0YS1hbHBhY2EtYXJyYXktZmllbGQtdG9vbGJhci1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSID0gImFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1hY3Rpb25iYXIiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgPSAiZGF0YS1hbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tcGFyZW50LWZpZWxkLWlkIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLWZpZWxkLWlkIjsKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQtaXRlbS1maWVsZCI7CgogICAgQWxwYWNhLm1ha2VDYWNoZUtleSA9IGZ1bmN0aW9uKHZpZXdJZCwgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkKQogICAgewogICAgICAgIHJldHVybiB2aWV3SWQgKyAiOiIgKyBzY29wZVR5cGUgKyAiOiIgKyBzY29wZUlkICsgIjoiICsgdGVtcGxhdGVJZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBjYWNoZSBrZXkgaW50byBpdHMgcGFydHMgLSB2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCBhbmQgdGVtcGxhdGVJZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAqIEByZXR1cm5zIHt7fX0KICAgICAqLwogICAgQWxwYWNhLnNwbGl0Q2FjaGVLZXkgPSBmdW5jdGlvbihjYWNoZUtleSkKICAgIHsKICAgICAgICB2YXIgcGFydHMgPSB7fTsKCiAgICAgICAgdmFyIHggPSBjYWNoZUtleS5pbmRleE9mKCI6Iik7CiAgICAgICAgdmFyIHkgPSBjYWNoZUtleS5sYXN0SW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy52aWV3SWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoMCwgeCk7CiAgICAgICAgcGFydHMudGVtcGxhdGVJZCA9IGNhY2hlS2V5LnN1YnN0cmluZyh5ICsgMSk7CgogICAgICAgIHZhciBzY29wZUlkZW50aWZpZXIgPSBjYWNoZUtleS5zdWJzdHJpbmcoeCArIDEsIHkpOwoKICAgICAgICB2YXIgeiA9IHNjb3BlSWRlbnRpZmllci5pbmRleE9mKCI6Iik7CgogICAgICAgIHBhcnRzLnNjb3BlVHlwZSA9IHNjb3BlSWRlbnRpZmllci5zdWJzdHJpbmcoMCwgeik7CiAgICAgICAgcGFydHMuc2NvcGVJZCA9IHNjb3BlSWRlbnRpZmllci5zdWJzdHJpbmcoeisxKTsKCiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgfTsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgZGF0YSBvYmplY3QgZm9yIGEgZ2l2ZW4gSlNPTiBzY2hlbWEuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtYQogICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAqLwogICAgQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlID0gZnVuY3Rpb24oc2NoZW1hKQogICAgewogICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICAvKioKICAgICAqIFN3YXBzIHR3byBkaXZzIHZpc3VhbGx5IGFuZCB0aGVuIGZpcmVzIGEgY2FsbGJhY2suCiAgICAgKgogICAgICogQHBhcmFtIHNvdXJjZQogICAgICogQHBhcmFtIHRhcmdldAogICAgICogQHBhcmFtIGR1cmF0aW9uCiAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAqLwogICAgQWxwYWNhLmFuaW1hdGVkU3dhcCA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spCiAgICB7CiAgICAgICAgaWYgKHR5cGVvZihkdXJhdGlvbikgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkdXJhdGlvbjsKICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgfQoKICAgICAgICB2YXIgX2FuaW1hdGUgPSBmdW5jdGlvbihhLCBiLCBkdXJhdGlvbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZnJvbSA9ICQoYSksCiAgICAgICAgICAgICAgICBkZXN0ID0gJChiKSwKICAgICAgICAgICAgICAgIGZyb21fcG9zID0gZnJvbS5vZmZzZXQoKSwKICAgICAgICAgICAgICAgIGRlc3RfcG9zID0gZGVzdC5vZmZzZXQoKSwKICAgICAgICAgICAgICAgIGZyb21fY2xvbmUgPSBmcm9tLmNsb25lKCksCiAgICAgICAgICAgICAgICBkZXN0X2Nsb25lID0gZGVzdC5jbG9uZSgpLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfdmVydGljYWwgICA9IGRlc3RfcG9zLnRvcCArIGRlc3QuaGVpZ2h0KCkgLSBmcm9tX3Bvcy50b3AsCiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgICAgPSAwLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfaG9yaXpvbnRhbCA9IGRlc3RfcG9zLmxlZnQgKyBkZXN0LndpZHRoKCkgLSBmcm9tX3Bvcy5sZWZ0LAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgID0gMDsKCiAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMCk7CiAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmluc2VydEFmdGVyKGZyb20pLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBmcm9tLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBmcm9tLm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZnJvbV9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKICAgICAgICAgICAgZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgZGVzdF9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sIGR1cmF0aW9uICsgMSk7CiAgICAgICAgfTsKCiAgICAgICAgX2FuaW1hdGUoc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogQW5pbWF0ZXMgdGhlIG1vdmVtZW50IG9mIGEgZGl2IHZpc3VhbGx5IGFuZCB0aGVuIGZpcmVzIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZE1vdmUgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lID0gZGVzdC5jbG9uZSgpLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfdmVydGljYWwgICA9IGRlc3RfcG9zLnRvcCArIGRlc3QuaGVpZ2h0KCkgLSBmcm9tX3Bvcy50b3AsCiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgICAgPSAwLAogICAgICAgICAgICAgICAgdG90YWxfcm91dGVfaG9yaXpvbnRhbCA9IGRlc3RfcG9zLmxlZnQgKyBkZXN0LndpZHRoKCkgLSBmcm9tX3Bvcy5sZWZ0LAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgID0gMDsKCiAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMCk7CiAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmluc2VydEFmdGVyKGZyb20pLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBmcm9tLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBmcm9tLm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZnJvbV9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKICAgICAgICAgICAgLy9kZXN0X2Nsb25lLmluc2VydEFmdGVyKGRlc3QpLmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIHdpZHRoOiBkZXN0Lm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBkZXN0Lm91dGVySGVpZ2h0KCl9KS5vZmZzZXQoZGVzdF9wb3MpLmNzcygiei1pbmRleCIsICI5OTkiKTsKCiAgICAgICAgICAgIGlmKGZyb21fcG9zLnRvcCAhPT0gZGVzdF9wb3MudG9wKSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBmcm9tLmhlaWdodCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGRlc3QuaGVpZ2h0KCk7CiAgICAgICAgICAgIGlmKGZyb21fcG9zLmxlZnQgIT09IGRlc3RfcG9zLmxlZnQpIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBmcm9tLndpZHRoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGRlc3Qud2lkdGgoKTsKCiAgICAgICAgICAgIGZyb21fY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICIrPSIgKyByb3V0ZV9mcm9tX3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICIrPSIgKyByb3V0ZV9mcm9tX2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZGVzdC5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgZGVzdF9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIi09IiArIHJvdXRlX2Rlc3RfdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIi09IiArIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZyb21fY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAvL2Rlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCgogICAgQWxwYWNhLmZpcmVSZWFkeSA9IGZ1bmN0aW9uKF9maWVsZCkKICAgIHsKICAgICAgICBpZiAoX2ZpZWxkLmNoaWxkcmVuICYmIF9maWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBnKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoX2ZpZWxkLmNoaWxkcmVuW2ddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgX2ZpZWxkLnRyaWdnZXIoInJlYWR5Iik7CiAgICB9OwoKICAgIEFscGFjYS5yZWFkQ29va2llID0gZnVuY3Rpb24obmFtZSkKICAgIHsKICAgICAgICBmdW5jdGlvbiBfcmVhZENvb2tpZShuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG5hbWVFUSA9IG5hbWUgKyAiPSI7CiAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IGNhW2ldOwogICAgICAgICAgICAgICAgd2hpbGUgKGMuY2hhckF0KDApPT0nICcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYyA9IGMuc3Vic3RyaW5nKDEsYy5sZW5ndGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YnN0cmluZyhuYW1lRVEubGVuZ3RoLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlID0gX3JlYWRDb29raWUobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwoKICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkgPSBmdW5jdGlvbihiYXNlT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlcykgewoKICAgICAgICBpZiAodHlwZW9mKGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSkgPT09ICJ1bmRlZmluZWQiIHx8IGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXSA9IFtdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLnB1c2godmFsdWVzW2ldKTsKICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5pbkFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gKCQuaW5BcnJheSh2YWwsIGFycmF5KSA+IC0xKTsKICAgIH07CgogICAgQWxwYWNhLmluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwgdmFsKQogICAgewogICAgICAgIHJldHVybiAkLmluQXJyYXkodmFsLCBhcnJheSk7CiAgICB9OwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIE1vbWVudC5qcyBzdGF0aWMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EubW9tZW50ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5tb21lbnQpIHsKICAgICAgICAgICAgICAgIEFscGFjYS5fbW9tZW50ID0gd2luZG93Lm1vbWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFBbHBhY2EuX21vbWVudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBtb21lbnQuanMgbGlicmFyeSBoYXMgbm90IGJlZW4gaW5jbHVkZWQsIGNhbm5vdCBwcm9kdWNlIG1vbWVudCBvYmplY3QiKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBbHBhY2EuX21vbWVudC5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIENTUkYgU3VwcG9ydAogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5DU1JGX1RPS0VOID0gbnVsbDsKICAgIEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUyA9IFsiQ1NSRi1UT0tFTiIsICJYU1JGLVRPS0VOIl07CiAgICBBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRSA9ICJYLUNTUkYtVE9LRU4iOwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIFNUQVRJQyBERUZBVUxUUwogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8vIHVzZSB0aGlzIHRvIHNldCB0aGUgZGVmYXVsdCAic3RpY2t5IiB0b29sYmFyIGJlaGF2aW9yCiAgICAvLyBzZXQgdG8gdHJ1ZSB0byBoYXZlIHRvb2xiYXJzIGFsd2F5cyBzdGljayBvciB1bmRlZmluZWQgdG8gaGF2ZSB0aGVtIGFwcGVhciBvbiBob3ZlcgogICAgQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5ID0gdW5kZWZpbmVkOwoKICAgIC8vIHVzZSB0aGlzIHRvIGhhdmUgaW52YWxpZCBtZXNzYWdlcyBzaG93IHVwIGZvciByZWFkLW9ubHkgZmllbGRzCiAgICBBbHBhY2Euc2hvd1JlYWRPbmx5SW52YWxpZFN0YXRlID0gZmFsc2U7CgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIENBQ0hFIElNUExFTUVOVEFUSU9OUwogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIEFscGFjYS5jYWNoZXMgPSB7fTsKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlID0gZnVuY3Rpb24oaWQsIGNhY2hlRm4pCiAgICB7CiAgICAgICAgQWxwYWNhLmNhY2hlc1tpZF0gPSBjYWNoZUZuOwogICAgfTsKICAgIEFscGFjYS5nZXRDYWNoZSA9IGZ1bmN0aW9uKGlkKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuY2FjaGVzW2lkXTsKICAgIH07CgoKfSkoalF1ZXJ5KTsKCi8qanNoaW50IC1XMDE0ICovIC8vIGJhZCBsaW5lIGJyZWFraW5nCi8qanNoaW50IC1XMDA0ICovIC8vIGR1cGxpY2F0ZSB2YXJpYWJsZXMKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EubGlzdGVuZXJJZCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgeCA9IDA7CgogICAgICAgIHJldHVybiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImxpc3RlbmVyLSIgKyAoeCsrKTsKICAgICAgICB9OwogICAgfSgpOwoKICAgIC8qKgogICAgICogU3Vic2NyaWJlcyBhIGZ1bmN0aW9uIGhhbmRsZXIgdG8gYW4gb2JzZXJ2YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrRnVuY3Rpb24gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKgogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS5zdWJzY3JpYmUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CgogICAgICAgIHZhciBzY29wZSA9IG51bGw7CiAgICAgICAgdmFyIGlkID0gbnVsbDsKICAgICAgICB2YXIgbGlzdGVuZXIgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lciA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lciA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIHN1YnNjcmliZSBpZDogIiArIGlkKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBmdW5jdGlvbiBpZGVudGlmaWVyCiAgICAgICAgdmFyIGxpc3RlbmVySWQgPSBsaXN0ZW5lci5fbGZpZDsKICAgICAgICBpZiAoIWxpc3RlbmVySWQpIHsKICAgICAgICAgICAgbGlzdGVuZXJJZCA9IEFscGFjYS5saXN0ZW5lcklkKCk7CiAgICAgICAgICAgIGxpc3RlbmVyLl9sZmlkID0gbGlzdGVuZXJJZDsKICAgICAgICB9CgogICAgICAgIC8vIHdyYXAgZnVuY3Rpb24gaW50byBhIGNsb3N1cmUKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKHRoYXQpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSh0aGlzKTsKICAgICAgICBmdW5jLl9sZmlkID0gbGlzdGVuZXIuX2xmaWQ7CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIC8vIHRlbGwgdGhlIG9ic2VydmFibGUgdG8gc3Vic2NyaWJlCiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUobGlzdGVuZXJJZCwgZnVuYyk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBVbnN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIGZyb20gYW4gb2JzZXJ2YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBsaXN0ZW5lciBlaXRoZXIgdGhlIGZ1bmN0aW9uIG9yIGxpc3RlbmVyIGlkCiAgICAgKiBAcmV0dXJuIGRlc2NyaXB0b3IKICAgICAqLwogICAgQWxwYWNhLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyT3JJZCA9IG51bGw7CgogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXJPcklkID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxpc3RlbmVySWQgPSBsaXN0ZW5lck9ySWQ7CiAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGxpc3RlbmVySWQpKQogICAgICAgIHsKICAgICAgICAgICAgbGlzdGVuZXJJZCA9IGxpc3RlbmVySWQuX2xmaWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIGlkKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHVuc3Vic2NyaWJlCiAgICAgICAgb2JzZXJ2YWJsZS51bnN1YnNjcmliZShsaXN0ZW5lcklkKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInNjb3BlIjogc2NvcGUsCiAgICAgICAgICAgICJpZCI6IGlkLAogICAgICAgICAgICAibGlzdGVuZXJJZCI6IGxpc3RlbmVySWQKICAgICAgICB9OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldHMgb3Igc2V0cyBhbiBvYnNlcnZhYmxlIGluIHRoZSBnaXZlbiBzY29wZS4KICAgICAqCiAgICAgKiBAcGFyYW0gW1N0cmluZ10gc2NvcGUgb3B0aW9uYWwgc2NvcGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgdmFyaWFibGUgaWQKICAgICAqLwogICAgQWxwYWNhLm9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlOwogICAgICAgIHZhciBpZDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7CiAgICB9OwoKICAgIEFscGFjYS5jbGVhck9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlOwogICAgICAgIHZhciBpZDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgb2JzZXJ2YWJsZS5jbGVhcigpOwogICAgfTsKCiAgICAvKioKICAgICAqIERlY2xhcmVzIGFuZCBnZXRzIGEgZGVwZW5kZW50IG9ic2VydmFibGUgaW4gYSBnaXZlbiBzY29wZQogICAgICoKICAgICAqIEBwYXJhbSBzY29wZQogICAgICogQHBhcmFtIGlkCiAgICAgKiBAcGFyYW0gZnVuYwogICAgICovCiAgICBBbHBhY2EuZGVwZW5kZW50T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGZ1bmMgPSBudWxsOwoKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBmdW5jID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBmdW5jID0gYXJncy5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EuZXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBKU09OLnN0cmluZ2lmeShhcmdzKSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKCiAgICAgICAgcmV0dXJuIG9ic2VydmFibGVzLmRlcGVuZGVudE9ic2VydmFibGUoaWQsIGZ1bmMpOwogICAgfTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBDb2xsZWN0aW9uIG9mIG9ic2VydmFibGVzLgogICAgICovCiAgICBBbHBhY2EuT2JzZXJ2YWJsZXMgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKCiAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSB7fTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlOiBmdW5jdGlvbihpZCwgaW5pdGlhbFZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9ic2VydmFibGVzW2lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgQWxwYWNhLk9ic2VydmFibGUodGhpcy5zY29wZSwgaWQpOwoKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsVmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXQoaW5pdGlhbFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzW2lkXSA9IG9ic2VydmFibGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmQgYmFjayBmcm9tIG1hcAogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9ic2VydmFibGVzW2lkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSB0aGlzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAgICAgICAgIC8vIHdyYXAgdGhlIG1vZGVsCiAgICAgICAgICAgICAgICB2YXIgbSA9IG5ldyBBbHBhY2EuT2JzZXJ2YWJsZXModGhpcy5zY29wZSk7CiAgICAgICAgICAgICAgICBtLm9ic2VydmFibGUgPSBmdW5jdGlvbih4LCB5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vUmF0Y2hldC5kZWJ1ZygiT2JzZXJ2YWJsZTogIiArIG9ic2VydmFibGUuaWQgKyAiIGRlcGVuZHMgb24gb2JzZXJ2YWJsZTogIiArIHgpOwogICAgICAgICAgICAgICAgICAgIHZhciBvID0gX3RoaXMub2JzZXJ2YWJsZSh4LCB5KTsKICAgICAgICAgICAgICAgICAgICBvLm1hcmtEZXBlbmRlbnRPblVzKG9ic2VydmFibGUpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB2YWx1ZSBmdW5jdGlvbiAod2hlcmUgInRoaXMiID0gdGhlIG1vZGVsKQogICAgICAgICAgICAgICAgdmFyIHZhbHVlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKG0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzW2lkXTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXM7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuT2JzZXJ2YWJsZSA9IEJhc2UuZXh0ZW5kKAogICAgewogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihzY29wZSwgaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gc2NvcGUgKyAiLSIgKyBpZDsKCiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0ge307CgogICAgICAgICAgICAvLyBhcnJheSB0aGF0IGNvbnRhaW5zIG9ic2VydmFibGUgd2hvc2UgdmFsdWUgaXMgZGVwZW5kZW50IG9uIG91ciB2YWx1ZQogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXMgPSB7fTsKCgogICAgICAgICAgICAvLyBwcml2aWxlZ2VkIGZ1bmN0aW9ucwoKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLnN1YnNjcmliZXJzLCBmdW5jdGlvbihpZCwgaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoX3RoaXMudmFsdWUsIHByaW9yKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzID0gZnVuY3Rpb24ocHJpb3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLmRlcGVuZGVudE9uVXMsIGZ1bmN0aW9uKGtleSwgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkRlcGVuZGVuY3lDaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYXNzdW1lIG51bGwgdmFsdWUgZnVuY3Rpb24KICAgICAgICAgICAgdGhpcy52YWx1ZUZ1bmN0aW9uID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZUZ1bmN0aW9uOiBmdW5jdGlvbih2YWx1ZUZ1bmN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52YWx1ZUZ1bmN0aW9uID0gdmFsdWVGdW5jdGlvbjsKICAgICAgICAgICAgdGhpcy5vbkRlcGVuZGVuY3lDaGFuZ2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIHdoaWNoIGFjdHMgYXMgYSBzdWJzY3JpYmVyLiAgV2hlbiB0aGlzIG9ic2VydmFibGUgdmFsdWUgY2hhbmdlcywKICAgICAgICAgKiB0aGUgaGFuZGxlciBtZXRob2QgaXMgcmFpc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGYKICAgICAgICAgKi8KICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKGlkLCBoYW5kbGVyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3Vic2NyaWJlZChpZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnNbaWRdID0gaGFuZGxlcjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN1YnNjcmliZXJzW2lkXTsKICAgICAgICB9LAoKICAgICAgICBpc1N1YnNjcmliZWQ6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLnN1YnNjcmliZXJzW2lkXSA/IHRydWU6IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBtYXJrRGVwZW5kZW50T25VczogZnVuY3Rpb24ob2JzZXJ2YWJsZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW50T25Vc1tvYnNlcnZhYmxlLmlkXSA9IG9ic2VydmFibGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiBvbmUgb2Ygb3VyIGRlcGVuZGVudHMgaGFzIGNoYW5nZWQgaXRzIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW5jeUNoYW5nZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHByaW9yID0gdGhpcy5nZXQoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSB2YWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiwgZmlyZSBpdAogICAgICAgICAgICBpZiAodGhpcy52YWx1ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMudmFsdWVGdW5jdGlvbigpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkLCBub3RpZnkKICAgICAgICAgICAgICAgIGlmIChwcmlvciAhPSBjdXJyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGN1cnJlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0OiBmdW5jdGlvbihfZGVmYXVsdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2ID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgaWYgKCF2KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2ID0gX2RlZmF1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgLy8gbm90aWZ5IGFsbCBkZXBlbmRlbnRzIChvYnNlcnZlcnMgdGhhdCBkZXBlbmQgb24gb3VyIHZhbHVlKQogICAgICAgICAgICB0aGlzLm5vdGlmeURlcGVuZGVudHMocHJpb3IpOwoKICAgICAgICAgICAgLy8gbm90aWZ5IGFsbCBzdWJzY3JpYmVycyBvZiB0aGUgdXBkYXRlZCB2YWx1ZQogICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKHByaW9yKTsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcyA9IHt9OwogICAgQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcCA9IHt9OwoKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQgPSBmdW5jdGlvbihzY29wZSkKICAgIHsKICAgICAgICBpZiAoIUFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHNjb3BlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXTsKICAgIH07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCkKewogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciByZWdpc3RyeSA9IHt9OwoKICAgICAgICByZXR1cm4gewoKICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGlkLCBlbmdpbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlZ2lzdHJ5W2lkXSA9IGVuZ2luZTsKCiAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmluZDogZnVuY3Rpb24oaWRPclR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeVtpZE9yVHlwZV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRPclR5cGVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc3BlY3QgYnkgdHlwZQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1cHBvcnRlZE1pbWV0eXBlcyA9IHJlZ2lzdHJ5W2lkXS5zdXBwb3J0ZWRNaW1ldHlwZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBwb3J0ZWRNaW1ldHlwZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZE9yVHlwZS50b0xvd2VyQ2FzZSgpID09PSBzdXBwb3J0ZWRNaW1ldHlwZXNbaV0udG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUgPSByZWdpc3RyeVtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGlkczogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaWRzID0gW107CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gcmVnaXN0cnkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goaWQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBpZHM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoKTsKCn0pKCk7CgooZnVuY3Rpb24oJCkKewogICAgQWxwYWNhLkFic3RyYWN0VGVtcGxhdGVFbmdpbmUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKCiAgICAgICAgICAgIHRoaXMuY2xlYW51cCA9IGZ1bmN0aW9uKGh0bWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChodG1sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGlmIHN0YXJ0cyB3aXRoIGEgc2NyaXB0IHRhZywgdGhlbiB3ZSBzdHJpcCB0aGF0IG91dAogICAgICAgICAgICAgICAgICAgIGlmICgkKGh0bWwpLmxlbmd0aCA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGh0bWwpWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJzY3JpcHQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChodG1sKS5odG1sKCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiB0ZW1wbGF0ZSAob3IgVVJJIG9yIGRvbSBzZWxlY3RvcikKICAgICAgICAgKgogICAgICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCBvbmNlIHRoZSBjb21waWxlIGNvbXBsZXRlcyBhbmQgaGFzIHNpZ25hdHVyZSBjYWxsYmFjayhlcnIpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgY29ubmVjdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBiZWluZyBjb21waWxlZCBjYW4gYmUKICAgICAgICAgICAgLy8gICBIVE1MCiAgICAgICAgICAgIC8vICAgVVJMIChodHRwLCAuLyBvciAvKQogICAgICAgICAgICAvLyAgIGRvbSBzZWxlY3RvciAoI2FiYywgLmNsYXNzbmFtZSkKICAgICAgICAgICAgLy8gICBkb20gZWxlbWVudAoKICAgICAgICAgICAgLy8gaGVyZSB3ZSB0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB2YWx1ZSBpdCBpcwogICAgICAgICAgICB2YXIgdHlwZSA9ICJodG1sIjsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh0ZW1wbGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsYyA9IHRlbXBsYXRlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKGxjKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInVyaSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZS5pbmRleE9mKCIjIikgPT09IDAgfHwgdGVtcGxhdGUuaW5kZXhPZigiLiIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIlsiKSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdG9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkb20gZWxlbWVudCwgd2UgZmxvdyB0aHJvdWdoCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG5vdyBleHRyYWN0IGh0bWwgYW5kIGNvbXBpbGUKICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzZWxlY3RvciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIHRlbXBsYXRlLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gInVyaSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmaWxlRXh0ZW5zaW9uID0gc2VsZi5maWxlRXh0ZW5zaW9uKCk7CgogICAgICAgICAgICAgICAgdmFyIHVybCA9IHRlbXBsYXRlOwogICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCIuIiArIGZpbGVFeHRlbnNpb24pID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHVybCArPSAiLiIgKyBmaWxlRXh0ZW5zaW9uOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIHRlbXBsYXRlIHVzaW5nIHRoZSBjb25uZWN0b3IKICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkVGVtcGxhdGUodXJsLCBmdW5jdGlvbihodG1sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgaHRtbAogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBzZWxmLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogdXJsLAogICAgICAgICAgICAgICAgICAgICJkYXRhVHlwZSI6ICJodG1sIiwKICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyI6IGZ1bmN0aW9uKGh0bWwsIGNvZGUsIHhocikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgaHRtbAogICAgICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29tcGlsZShjYWNoZUtleSwgaHRtbCwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKHhociwgY29kZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogeGhyLnJlc3BvbnNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHIiOiB4aHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZSI6IGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJodG1sIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmIChodG1sIGluc3RhbmNlb2YgalF1ZXJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSAkKGh0bWwpLm91dGVySFRNTCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcigiVGVtcGxhdGUgZW5naW5lIGNhbm5vdCBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0eXBlOiAiICsgdHlwZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGZvciBudWxsIHRlbXBsYXRlcywgc2V0IHRvIGVtcHR5IHN0cmluZwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoaHRtbCkpIHsKICAgICAgICAgICAgICAgIGh0bWwgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJpbSB0aGUgaHRtbAogICAgICAgICAgICBodG1sID0gQWxwYWNhLnRyaW0oaHRtbCk7CgogICAgICAgICAgICBpZiAoaHRtbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIjxzY3JpcHQiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXMgc2NyaXB0IHRhZwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXBwbHkgc2NyaXB0IHRhZwogICAgICAgICAgICAgICAgaHRtbCA9ICI8c2NyaXB0IHR5cGU9JyIgKyB0aGlzLnN1cHBvcnRlZE1pbWV0eXBlcygpWzBdICsgIic+IiArIGh0bWwgKyAiPC9zY3JpcHQ+IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJDb21waWxpbmcgdGVtcGxhdGU6ICIgKyB0aGlzLmlkICsgIiwgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIsIHRlbXBsYXRlOiAiICsgaHRtbCk7CgogICAgICAgICAgICB0aGlzLmRvQ29tcGlsZShjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBleHRlbnNpb25fcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSBodG1sCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgZG9Db21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRXhlY3V0aW5nIHRlbXBsYXRlIGZvciBjYWNoZSBrZXk6ICIgKyBjYWNoZUtleSk7CgogICAgICAgICAgICB2YXIgaHRtbCA9IHRoaXMuZG9FeGVjdXRlKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjayk7CgogICAgICAgICAgICAvLyByZW1vdmVzIHdyYXBwaW5nIDxzY3JpcHQvPiB0YWcKICAgICAgICAgICAgaHRtbCA9IHRoaXMuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGUgYSB0ZW1wbGF0ZSBhbmQgaGFuZCBiYWNrIGEgdGV4dCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvRXhlY3V0ZTogZnVuY3Rpb24oY2FjaGVLZXksIG1vZGVsLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgZXhwZWN0ZWQgZmlsZSBleHRlbnNpb24gZm9yIHRlbXBsYXRlcyBsb2FkZWQgdmlhIFVSSS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kcyBiYWNrIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc2NyaXB0IHRhZyB0eXBlcyBmb3IgdGVtcGxhdGVzIGxvYWRlZCBmcm9tIHRoZSBET00uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhpc3RpbmcgdGVtcGxhdGUgaXMgYWxyZWFkeSBpbiBjYWNoZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqLwogICAgICAgIGlzQ2FjaGVkOiBmdW5jdGlvbihjYWNoZUtleSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBY3F1aXJlcyBhbiBhcnJheSBvZiBjYWNoZSBrZXlzIG1hdGNoaW5nIHRoZSB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXdJZAogICAgICAgICAqLwogICAgICAgIGZpbmRDYWNoZUtleXM6IGZ1bmN0aW9uKHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQsIEhhbmRsZWJhcnMsIEhhbmRsZWJhcnNQcmVjb21waWxlZCkKewogICAgLy8gcnVudGltZSBjYWNoZSBvZiBwcmVjb21waWxlZCB0ZW1wbGF0ZXMga2V5ZWQgYnkgY2FjaGVLZXkKICAgIHZhciBDT01QSUxFRF9URU1QTEFURVMgPSB7fTsKCiAgICB2YXIgaGVscGVycyA9IHt9OwogICAgaGVscGVyc1siY29tcGFyZSJdID0gZnVuY3Rpb24obHZhbHVlLCBydmFsdWUsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSGFuZGxlcmJhcnMgSGVscGVyICdjb21wYXJlJyBuZWVkcyAyIHBhcmFtZXRlcnMiKTsKICAgICAgICB9CgogICAgICAgIHZhciBvcGVyYXRvciA9IG9wdGlvbnMuaGFzaC5vcGVyYXRvciB8fCAiPT0iOwoKICAgICAgICB2YXIgb3BlcmF0b3JzID0gewogICAgICAgICAgICAnPT0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT0gcjsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICc9PT0nOiAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA9PT0gcjsgfSwKICAgICAgICAgICAgJyE9JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnIT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgIT09IHI7IH0sCiAgICAgICAgICAgICc8JzogICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA8IHI7IH0sCiAgICAgICAgICAgICc+JzogICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA+IHI7IH0sCiAgICAgICAgICAgICc8PSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCA8PSByOyB9LAogICAgICAgICAgICAnPj0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPj0gcjsgfSwKICAgICAgICAgICAgJ3R5cGVvZic6ICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiB0eXBlb2YgbCA9PSByOyB9IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIH07CgogICAgICAgIGlmICghb3BlcmF0b3JzW29wZXJhdG9yXSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgZG9lc24ndCBrbm93IHRoZSBvcGVyYXRvciAiK29wZXJhdG9yKTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBvcGVyYXRvcnNbb3BlcmF0b3JdKGx2YWx1ZSxydmFsdWUpOwoKICAgICAgICBpZiggcmVzdWx0ICkgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpOwogICAgICAgIH0KICAgIH07CiAgICBoZWxwZXJzWyJpZm5vdCJdID0gZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpOwogICAgICAgIH0KICAgIH07CiAgICBoZWxwZXJzWyJ0aW1lcyJdID0gZnVuY3Rpb24obiwgYmxvY2spIHsKICAgICAgICB2YXIgYWNjdW0gPSAnJzsKICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgYWNjdW0gKz0gYmxvY2suZm4oaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bTsKICAgIH07CiAgICBoZWxwZXJzWyJjb250cm9sIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJpdGVtIl0gPSBmdW5jdGlvbih0YWcsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0YWcpKQogICAgICAgIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHRhZzsKICAgICAgICAgICAgdGFnID0gImRpdiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIjwiICsgdGFnICsgIiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU0gKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0tFWSArICI9JyIgKyB0aGlzLm5hbWUgKyAiJz48LyIgKyB0YWcgKyAiPiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbUZpZWxkIl0gPSBmdW5jdGlvbih0YWcsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0YWcpKQogICAgICAgIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHRhZzsKICAgICAgICAgICAgdGFnID0gImRpdiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIjwiICsgdGFnICsgIiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQgKyAiJz48LyIgKyB0YWcgKyAiPiI7CiAgICB9OwogICAgaGVscGVyc1siZm9ybUl0ZW1zIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaW5zZXJ0Il0gPSBmdW5jdGlvbihrZXkpCiAgICB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19JTlNFUlQgKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0lOU0VSVF9LRVkgKyAiPSciICsga2V5ICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJzdHIiXSA9IGZ1bmN0aW9uKGRhdGEpCiAgICB7CiAgICAgICAgaWYgKGRhdGEgPT09IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmYWxzZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRhdGEgPT09IHRydWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gInRydWUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIwIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mKGRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAiICAiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSA9IGZ1bmN0aW9uKG9wdGlvbnMpCiAgICB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9UT09MQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHRoaXMuaWQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHZhciBodG1sID0gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyB0aGlzLm5hbWUgKyAiJyI7CiAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIiciOwogICAgICAgIGlmICh0aGlzLnBhcmVudEZpZWxkSWQpCiAgICAgICAgewogICAgICAgICAgICBodG1sICs9ICIgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX1BBUkVOVF9GSUVMRF9JRCArICI9JyIgKyB0aGlzLnBhcmVudEZpZWxkSWQgKyAiJyIKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAiPjwvZGl2PiI7CgogICAgICAgIHJldHVybiBodG1sOwogICAgfTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImFycmF5VG9vbGJhciIsIGhlbHBlcnNbImFycmF5VG9vbGJhciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImFycmF5QWN0aW9uYmFyIiwgaGVscGVyc1siYXJyYXlBY3Rpb25iYXIiXSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigic2V0SW5kZXgiLCBmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgdGhpcy5pbmRleCA9IE51bWJlcih2YWx1ZSk7CiAgICB9KTsKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJlYWNoUHJvcGVydHkiLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHJldCA9ICIiOwogICAgICAgIGZvcih2YXIgcHJvcCBpbiBjb250ZXh0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gcmV0ICsgb3B0aW9ucy5mbih7a2V5OnByb3AsdmFsdWU6Y29udGV4dFtwcm9wXX0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfSk7CgoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInVwbG9hZEVycm9yTWVzc2FnZSIsIGZ1bmN0aW9uKGVycm9yKSB7CgogICAgICAgIHZhciBtZXNzYWdlID0gZXJyb3I7CgogICAgICAgIGlmIChlcnJvciA9PT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBleGNlZWRzIHVwbG9hZF9tYXhfZmlsZXNpemUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gMikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBleGNlZWRzIE1BWF9GSUxFX1NJWkUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gMykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB3YXMgb25seSBwYXJ0aWFsbHkgdXBsb2FkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNCkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTm8gRmlsZSB3YXMgdXBsb2FkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTWlzc2luZyBhIHRlbXBvcmFyeSBmb2xkZXIiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIHdyaXRlIGZpbGUgdG8gZGlzayI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSA3KQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxlIHVwbG9hZCBzdG9wcGVkIGJ5IGV4dGVuc2lvbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4RmlsZVNpemUiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxlIGlzIHRvbyBiaWciOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1pbkZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gc21hbGwiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gImFjY2VwdEZpbGVUeXBlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGV0eXBlIG5vdCBhbGxvd2VkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtYXhOdW1iZXJPZkZpbGVzIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiTWF4IG51bWJlciBvZiBmaWxlcyBleGNlZWRlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAidXBsb2FkZWRCeXRlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIlVwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gImVtcHR5UmVzdWx0IikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRW1wdHkgZmlsZSB1cGxvYWQgcmVzdWx0IjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZGlzZ3Vpc2UiLCBmdW5jdGlvbih0ZXh0LCBjaGFyYWN0ZXIpIHsKCiAgICAgICAgdmFyIHJlcGxhY2VkID0gIiI7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlcGxhY2VkICs9IGNoYXJhY3RlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXBsYWNlZDsKCiAgICB9KTsKCgoKICAgIC8vSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaCIsIGhlbHBlcnNbImVhY2giXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb21wYXJlIiwgaGVscGVyc1siY29tcGFyZSJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRyb2wiLCBoZWxwZXJzWyJjb250cm9sIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29udGFpbmVyIiwgaGVscGVyc1siY29udGFpbmVyIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbSIsIGhlbHBlcnNbIml0ZW0iXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJpdGVtRmllbGQiLCBoZWxwZXJzWyJpdGVtRmllbGQiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJmb3JtSXRlbXMiLCBoZWxwZXJzWyJmb3JtSXRlbXMiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ0aW1lcyIsIGhlbHBlcnNbInRpbWVzIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigic3RyIiwgaGVscGVyc1sic3RyIl0pOwoKICAgIC8vIHdpdGgKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7CiAgICB9KTsKCiAgICAvLyBpZm5vdAogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaWZub3QiLCBoZWxwZXJzWyJpZm5vdCJdKTsKCiAgICB2YXIgcGFydGlhbHMgPSB7fTsKCiAgICBBbHBhY2EuSGFuZGxlYmFyc1RlbXBsYXRlRW5naW5lID0gQWxwYWNhLkFic3RyYWN0VGVtcGxhdGVFbmdpbmUuZXh0ZW5kKAogICAgewogICAgICAgIGZpbGVFeHRlbnNpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImh0bWwiOwogICAgICAgIH0sCgogICAgICAgIHN1cHBvcnRlZE1pbWV0eXBlczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdG1wbCIKICAgICAgICAgICAgXTsKICAgICAgICB9LAoKICAgICAgICBpbml0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhdXRvIGRpc2NvdmVyIGFueSBwcmVjb21waWxlZCB0ZW1wbGF0ZXMgYW5kIHN0b3JlIHRoZW0gYnkgY2FjaGUga2V5IGhlcmUKICAgICAgICAgICAgaWYgKEhhbmRsZWJhcnNQcmVjb21waWxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIEhhbmRsZWJhcnNQcmVjb21waWxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlcyA9IEhhbmRsZWJhcnNQcmVjb21waWxlZFt2aWV3SWRdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdmlld1RlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHZpZXdUZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGVtcGxhdGUpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlld0lkLCAidmlldyIsIHZpZXdJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVEX1RFTVBMQVRFU1tjYWNoZUtleV0gPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvblN0cmluZyA9IEhhbmRsZWJhcnMucHJlY29tcGlsZShodG1sKTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXZhbCgiKCIgKyBmdW5jdGlvblN0cmluZyArICIpIik7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZnVuY3Rpb24gLSBmbihtb2RlbCkKICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh0ZW1wbGF0ZSk7CgogICAgICAgICAgICAgICAgLy8gQ0FDSEU6IHdyaXRlCiAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvRXhlY3V0ZTogZnVuY3Rpb24oY2FjaGVLZXksIG1vZGVsLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gQ0FDSEU6IHJlYWQKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRnVuY3Rpb24gPSBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldOwogICAgICAgICAgICBpZiAoIXRlbXBsYXRlRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sobmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBoYW5kbGViYXJzIGNhY2hlZCB0ZW1wbGF0ZSBmb3Iga2V5OiAiICsgY2FjaGVLZXkpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcmVuZGVyIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBodG1sID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGh0bWwgPSB0ZW1wbGF0ZUZ1bmN0aW9uKG1vZGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKENPTVBJTEVEX1RFTVBMQVRFU1tjYWNoZUtleV0gPyB0cnVlICA6IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2FjaGVLZXlzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBjYWNoZUtleSBpbiBDT01QSUxFRF9URU1QTEFURVMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZUtleS5pbmRleE9mKHZpZXdJZCArICI6IikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXlzLnB1c2goY2FjaGVLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY2FjaGVLZXlzOwogICAgICAgIH0KCiAgICB9KTsKCiAgICAvLyBhdXRvIHJlZ2lzdGVyCiAgICBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5yZWdpc3RlcigiaGFuZGxlYmFycyIsIG5ldyBBbHBhY2EuSGFuZGxlYmFyc1RlbXBsYXRlRW5naW5lKCJoYW5kbGViYXJzIikpOwoKfSkoalF1ZXJ5LCAoKHR5cGVvZihIYW5kbGViYXJzKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzIDogd2luZG93LkhhbmRsZWJhcnMpLCAoKHR5cGVvZihIYW5kbGViYXJzUHJlY29tcGlsZWQpICE9ICJ1bmRlZmluZWQiKSA/IEhhbmRsZWJhcnNQcmVjb21waWxlZCA6IHdpbmRvdy5IYW5kbGViYXJzUHJlY29tcGlsZWQpKTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Ob3JtYWxpemVkVmlldyA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3LnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogT25jZSBhbGwgb2YgdGhlIEFscGFjYSB2aWV3cyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmcmFtZXdvcmssIGVhY2ggaXMgbm9ybWFsaXplZCBzbyB0aGF0IHBhcmVudC1jaGFpbgogICAgICAgICAqIHJlZmVyZW5jZXMgYW5kIG92ZXJyaWRlcyBhcmUgbm9ybWFsaXplZCBpbnRvIGEgc2luZ2xlLCBmYXN0IGxvb2t1cCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIE5vcm1hbGl6ZWQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbih2aWV3SWQpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBOb3JtYWxpemF0aW9uIG9jY3VycyBvbmNlIHBlciB2aWV3IHVwb24gc3RhcnR1cCBvZiBBbHBhY2EuCiAgICAgICAgICovCiAgICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbih2aWV3cykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGxvYWQgdGhlIHZpZXcgb2JqZWN0CiAgICAgICAgICAgIHZhciB2aWV3T2JqZWN0ICA9IHZpZXdzW3RoaXMuaWRdOwogICAgICAgICAgICBpZiAoIXZpZXdPYmplY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSB2aWV3IG5vdCBmb3VuZDogIiArIHRoaXMuaWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb2xsZWN0IHRoZSBpbmhlcml0YW5jZSBjaGFpbgogICAgICAgICAgICB2YXIgY2hhaW4gPSBbXTsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB2aWV3T2JqZWN0OwogICAgICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICAgICAgY2hhaW4ucHVzaChjdXJyZW50KTsKCiAgICAgICAgICAgICAgICB2YXIgcGFyZW50SWQgPSBjdXJyZW50LnBhcmVudDsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSB2aWV3c1tjdXJyZW50LnBhcmVudF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJWaWV3IGNvbXBpbGF0aW9uIGZhaWxlZCAtIGNhbm5vdCBmaW5kIHBhcmVudCB2aWV3OiAiICsgcGFyZW50SWQgKyAiIGZvciB2aWV3OiAiICsgY3VycmVudC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcmV2ZXJzZSB0aGUgY2hhaW4KICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi5yZXZlcnNlKCk7CgogICAgICAgICAgICB2YXIgc2V0U2NhbGFyID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIHByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSAmJiAhQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkICsgIiBhbHJlYWR5IGhhcyB2YWx1ZTogIiArIGN1cnJlbnRWYWx1ZSArICIgYW5kIG92ZXJ3cml0aW5nIHRvOiAiICsgdmFsdWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eUlkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHNldEZ1bmN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UsIHByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSAmJiAhQWxwYWNhLmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkICsgIiBhbHJlYWR5IGhhcyBmdW5jdGlvbiwgb3ZlcndyaXRpbmciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBtZXJnZU1hcCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwID0gc291cmNlW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZU1hcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFtwcm9wZXJ0eUlkXSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eUlkXSA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0Mihzb3VyY2VNYXAsIHRhcmdldFtwcm9wZXJ0eUlkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQgYW5kIGFwcGx5CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gY2hhaW5baV07CgogICAgICAgICAgICAgICAgLy8gY29yZSBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInR5cGUiKTsgLy8gdmlldywgZWRpdCwgY3JlYXRlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInVpIik7IC8vIGJvb3RzdHJhcCwganF1ZXJ5dWksIGpxdWVyeW1vYmlsZSwgd2ViCgogICAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGUgdmlldyBpcyByZWFkb25seQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJkaXNwbGF5UmVhZG9ubHkiKTsKCiAgICAgICAgICAgICAgICAvLyBsb2NhbGUKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibG9jYWxlIik7CgogICAgICAgICAgICAgICAgLy8gZnVuY3Rpb25zCiAgICAgICAgICAgICAgICBzZXRGdW5jdGlvbih0aGlzLCBlbGVtZW50LCAicmVuZGVyIik7CiAgICAgICAgICAgICAgICBzZXRGdW5jdGlvbih0aGlzLCBlbGVtZW50LCAicG9zdFJlbmRlciIpOwoKICAgICAgICAgICAgICAgIC8vIHZpZXcgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAidGVtcGxhdGVzIik7CgogICAgICAgICAgICAgICAgLy8gZmllbGQgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAiZmllbGRzIik7CgogICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibGF5b3V0Iik7CgogICAgICAgICAgICAgICAgLy8gc3R5bGVzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAic3R5bGVzIik7CgogICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAiY2FsbGJhY2tzIik7CgogICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgIG1lcmdlTWFwKHRoaXMsIGVsZW1lbnQsICJtZXNzYWdlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWwKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiaG9yaXpvbnRhbCIpOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBzb21lIG9mIHRoZXNlPwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJsZWdlbmRTdHlsZSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0b29sYmFyU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiYnV0dG9uU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0aWNreSIpOwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJnbG9iYWxUZW1wbGF0ZSIpOwoKICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB3aXphcmQ/CiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAid2l6YXJkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVmlldyBjb21waWxhdGlvbiBjb21wbGV0ZSBmb3IgdmlldzogIiArIHRoaXMuaWQpOwogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpbmFsIHZpZXc6ICIpOwogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcywgbnVsbCwgIiAgICIpKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0pOwp9KShqUXVlcnkpOwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5SdW50aW1lVmlldyA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLlJ1bnRpbWVWaWV3LnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogUnVudGltZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpZXcgYXMgYXBwbGllZCB0byBhIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhY2Nlc3NvcnMgaW50byB0aGUgbmVzdGVkIGJlaGF2aW9ycyBvZiB2aWV3cyBhbmQgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgZmllbGQtbGV2ZWwgYXR0cmlidXRlcwogICAgICAgICAqIG9mIHRoZSBjdXJyZW50bHkgcmVuZGVyaW5nIGRvbSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDbGFzcyBmb3IgbWFuYWdpbmcgdmlldyBjb21wb25lbnRzIHN1Y2ggYXMgbGF5b3V0LCB0ZW1wbGF0ZSwgbWVzc2FnZSBldGMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGQgdGhlIGZpZWxkIGNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkLCBmaWVsZCkgewogICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CiAgICAgICAgICAgIHRoaXMuc2V0Vmlldyh2aWV3SWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZpZXcgdGhhdCB0aGlzIHJ1bnRpbWUgdmlldyBhZGFwdGVycyBzaG91bGQgY29uc3VsdCBkdXJpbmcgcmVuZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgc2V0VmlldzogZnVuY3Rpb24gKHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBmaWVsZCBjbGFzc2VzIGV2ZXIgcmVhbGx5IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseT8KICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBsZWZ0IGluIHRvIHN1cHBvcnQgQWxwYWNhIGRvY3MgZ2VuZXJhdGlvbiAobmVlZCB0byBjbGVhbiB0aGlzIHVwKXMKICAgICAgICAgICAgLy8gaWYgYSB2aWV3IGlzIG5vdCBzZXQgYXQgdGhpcyBwb2ludCBpdCBwcm9iYWJseSBtZWFucyB0aGV5IGluc3RhbnRpYXRlZCBhIGZpZWxkIGRpcmVjdGx5CiAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UsIHdlJ2xsIGp1c3QgcGljayB0aGUgZGVmYXVsdCB2aWV3CiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAgIndlYi1lZGl0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIG5vcm1hbGl6ZWQgdmlldwogICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBBbHBhY2EuZ2V0Tm9ybWFsaXplZFZpZXcodmlld0lkKTsKICAgICAgICAgICAgaWYgKCFub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgdGhlIGNhc2UKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUnVudGltZSB2aWV3IGZvciB2aWV3IGlkOiAiICsgdmlld0lkICsgIiBjb3VsZCBub3QgZmluZCBhIG5vcm1hbGl6ZWQgdmlldyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IGNvbXBpbGVkIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKHZhciBrIGluIG5vcm1hbGl6ZWRWaWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXcuaGFzT3duUHJvcGVydHkoaykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW2tdID0gbm9ybWFsaXplZFZpZXdba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVmlldyB3aXphcmQgc2V0dGluZ3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0V2l6YXJkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRWaWV3UGFyYW0oIndpemFyZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGdsb2JhbCBsYXlvdXQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fFN0cmluZ30gR2xvYmFsIGxheW91dCB0ZW1wbGF0ZSBzZXR0aW5nIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGdldEdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImdsb2JhbFRlbXBsYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBsYXlvdXQgdGVtcGxhdGUgYW5kIGJpbmRpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gTGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncyBzZXR0aW5nIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGdldExheW91dDogZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAidGVtcGxhdGVEZXNjcmlwdG9yIjogdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImxheW91dFRlbXBsYXRlIiwgc2VsZiksCiAgICAgICAgICAgICAgICAiYmluZGluZ3MiOiB0aGlzLmdldFZpZXdQYXJhbShbImxheW91dCIsImJpbmRpbmdzIl0sIHRydWUpCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgY29tcGlsZWQgdGVtcGxhdGUgaWQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZCAob3B0aW9uYWwpCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbih0ZW1wbGF0ZUlkLCBmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRoaXMsIHRlbXBsYXRlSWQsIGZpZWxkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBpZAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VJZCBNZXNzYWdlIGlkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBsb2NhbGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IE1lc3NhZ2UgbWFwcGVkIHRvIHRoZSBnaXZlbiBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRNZXNzYWdlIDogZnVuY3Rpb24gKG1lc3NhZ2VJZCwgbG9jYWxlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHsKICAgICAgICAgICAgICAgIGxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbWVzc2FnZUZvckxvY2FsZSA9IHRoaXMuZ2V0Vmlld1BhcmFtKFsibWVzc2FnZXMiLCBsb2NhbGUsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobWVzc2FnZUZvckxvY2FsZSkpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbWVzc2FnZUlkXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlRm9yTG9jYWxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB2aWV3IHBhcmFtZXRlciBiYXNlZCBvbiBjb25maWd1cmF0aW9uIElkIG9yIElkIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGNvbmZpZ0lkIENvbmZpZ3VyYXRpb24gaWQgb3IgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSBWaWV3IHBhcmFtZXRlciBtYXBwZWQgdG8gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBnZXRWaWV3UGFyYW06IGZ1bmN0aW9uIChjb25maWdJZCwgdG9wTGV2ZWxPbmx5KSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb29rIGZvciBleGFjdCBtYXRjaAogICAgICAgICAgICB2YXIgZmllbGRQYXRoID0gdGhpcy5maWVsZC5wYXRoOwogICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbZmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tmaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhcnJheSByZWxhdGVkIGZpZWxkIHBhdGggKHVzaW5nIFsqXSBzeW50YXgpICBpLmUuICAvYS9iWypdL2MvZFsqXS9lCiAgICAgICAgICAgIGlmIChmaWVsZFBhdGggJiYgZmllbGRQYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEgJiYgZmllbGRQYXRoLmluZGV4T2YoJ10nKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdGaWVsZFBhdGggPSBmaWVsZFBhdGgucmVwbGFjZSgvXFtcZCtcXS9nLCJbKl0iKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhcnJheSByZWxhdGVkIGZpZWxkIHBhdGggKHVzaW5nIHB1cmUgcGF0aCBzeW50YXgpICAgaS5lLiAvYS9iL2MvZC9lCiAgICAgICAgICAgIGlmIChmaWVsZFBhdGggJiYgZmllbGRQYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEgJiYgZmllbGRQYXRoLmluZGV4T2YoJ10nKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdGaWVsZFBhdGggPSBmaWVsZFBhdGgucmVwbGFjZSgvXFtcZCtcXS9nLCIiKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkcyAmJiB0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZ1ZhbCA9IHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLmZpZWxkc1tuZXdGaWVsZFBhdGhdLCBjb25maWdJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRvcExldmVsT25seSkgJiYgdG9wTGV2ZWxPbmx5ICYmIHRoaXMuZmllbGQucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbmZpZ1ZhbCh0aGlzLCBjb25maWdJZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBnZXR0aW5nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGNvbmZpZ1ZhbCBjb25maWd1cmF0aW9uIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWdJZCBjb25maWd1cmF0aW9uIGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gY29uZmlndXJhdGlvbiBtYXBwaW5nIHRvIHRoZSBnaXZlbiBpZAogICAgICAgICAqLwogICAgICAgIF9nZXRDb25maWdWYWwgOiBmdW5jdGlvbiAoY29uZmlnVmFsLCBjb25maWdJZCkgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZmlnSWQpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZ0lkLmxlbmd0aCAmJiAhQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnVmFsID0gY29uZmlnVmFsW2NvbmZpZ0lkW2ldXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICB9LAoKICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGZpZWxkLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyAmJiB0aGlzLmNhbGxiYWNrc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXS5jYWxsKGZpZWxkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5U3R5bGU6IGZ1bmN0aW9uKGlkLCBmaWVsZE9yRWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZWwgPSBmaWVsZE9yRWw7CiAgICAgICAgICAgIGlmIChlbCAmJiBlbC5nZXRGaWVsZEVsKSB7CiAgICAgICAgICAgICAgICBlbCA9IGVsLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGVsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHlsZXMgJiYgdGhpcy5zdHlsZXNbaWRdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKHRoaXMuc3R5bGVzW2lkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTdHlsZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXNbaWRdID8gdGhpcy5zdHlsZXNbaWRdIDogIiI7CiAgICAgICAgfQoKCiAgICB9KTsKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZCA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBBYnN0cmFjdCBjbGFzcyB0aGF0IHNlcnZlZCBhcyBiYXNlIGZvciBhbGwgQWxwYWNhIGZpZWxkIGNsYXNzZXMgdGhhdCBwcm92aWRlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21FbCBUaGUgZG9tIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBmaWVsZCBpcyB1bHRpbWF0ZWx5IHJlbmRlcmluZy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmlld0lkIHZpZXcgaWQKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZG9tRWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlld0lkLCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vIGRvbUVsCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICAvLyBjb25maWcKICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOwogICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdEVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBmaWVsZCByZW5kZXJpbmcgaXMgc2luZ2xlLWxldmVsIG9yIG5vdAogICAgICAgICAgICB0aGlzLnNpbmdsZUxldmVsUmVuZGVyaW5nID0gZmFsc2U7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gdGhpbmdzIHdlIGNhbiBkcmF3IG9mZiB0aGUgb3B0aW9ucwogICAgICAgICAgICB2YXIgbm9PcHRpb25zID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgIG5vT3B0aW9ucyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5pZDsKICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5vcHRpb25zLnR5cGU7CgogICAgICAgICAgICAvLyBzZXR1cCBkZWZhdWx0cwogICAgICAgICAgICBpZiAoIXRoaXMuaWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBub1NjaGVtYSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgbm9TY2hlbWEgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmxhYmVsICYmIHRoaXMuc2NoZW1hLnRpdGxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB0aGlzLnNjaGVtYS50aXRsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVyICYmIHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVyID0gdGhpcy5zY2hlbWEuZGVzY3JpcHRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0OiBvcHRpb25zLmhlbHBlciAtPiBjb252ZXJ0IHRvIG9wdGlvbnMuaGVscGVycwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5oZWxwZXJzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHRoaXMub3B0aW9ucy5oZWxwZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMucHVzaCh0aGlzLm9wdGlvbnMuaGVscGVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuaGVscGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcltpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsZWdhY3kgdmFsdWUKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuaGVscGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLnJlYWRvbmx5KSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEucmVhZG9ubHkpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVhZG9ubHkgPSB0aGlzLnNjaGVtYS5yZWFkb25seTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgZGF0YSBpcyBlbXB0eSwgdGhlbiB3ZSBjaGVjayB3aGV0aGVyIHdlIGNhbiBmYWxsIGJhY2sgdG8gYSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLmRhdGEpICYmICFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYVsiZGVmYXVsdCJdKSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5zY2hlbWFbImRlZmF1bHQiXTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd2luZ0RlZmF1bHREYXRhID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBwYXRoCiAgICAgICAgICAgIHRoaXMucGF0aCA9ICIvIjsKCiAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbiA9IHt9OwoKICAgICAgICAgICAgLy8gZXZlbnRzCiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9OwoKCgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIGluIGEgZGlzcGxheS1vbmx5IG1vZGUKICAgICAgICAgICAgdGhpcy5pc0Rpc3BsYXlPbmx5ID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmlldy50eXBlID09PSAidmlldyIgfHwgc2VsZi52aWV3LnR5cGUgPT0gImRpc3BsYXkiKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNjaGVtYSBpZCBjbGVhbnVwCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5pZCAmJiB0aGlzLnNjaGVtYS5pZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLmlkID0gdGhpcy5zY2hlbWEuaWQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYXMgdGhpcyBmaWVsZCBiZWVuIHByZXZpb3VzbHkgdmFsaWRhdGVkPwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gZmFsc2U7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvYnNlcnZhYmxlCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLnNldCh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmdldE9ic2VydmFibGVTY29wZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoIXRvcC5pc1RvcCgpKSB7CiAgICAgICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZVNjb3BlID0gdG9wLm9ic2VydmFibGVTY29wZTsKICAgICAgICAgICAgICAgIGlmICghb2JzZXJ2YWJsZVNjb3BlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGVTY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmVuc3VyZVByb3BlclR5cGUgPSBmdW5jdGlvbih2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgX2Vuc3VyZSA9IGZ1bmN0aW9uKHYsIHR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh2KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAibnVtYmVyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlRmxvYXQodik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImludGVnZXIiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gcGFyc2VJbnQodik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gIiIgfHwgdi50b0xvd2VyQ2FzZSgpID09PSAiZmFsc2UiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAiIiArIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gLTEgfHwgdiA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLml0ZW1zICYmIHNlbGYuc2NoZW1hLml0ZW1zLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gX2Vuc3VyZSh2YWxbaV0sIHNlbGYuc2NoZW1hLml0ZW1zLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh2YWwpIHx8IEFscGFjYS5pc051bWJlcih2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IF9lbnN1cmUodmFsLCBzZWxmLnNjaGVtYS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5vbkNvbnN0cnVjdCgpOwogICAgICAgIH0sCgogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBpc1RvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIGlkIG9mIHRoZSBvdXRlciBmaWVsZCB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEZvciBjb250cm9sIGZpZWxkcywgdGhpcyBpcyAiY29udHJvbCIuCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHRoaXMgaXMgImNvbnRhaW5lciIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGVtcGxhdGUgZGVzY3JpcHRvciBJRCB3YXMgbm90IHNwZWNpZmllZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdXAgZGVmYXVsdCByZW5kaXRpb24gdGVtcGxhdGUgZnJvbSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGluaXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLmdldFRlbXBsYXRlRGVzY3JpcHRvcklkKCksIHRoaXMpOwogICAgICAgICAgICB2YXIgZ2xvYmFsVGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldEdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcigpOwogICAgICAgICAgICB2YXIgbGF5b3V0ID0gdGhpcy52aWV3LmdldExheW91dCgpOwoKICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyB0aGUgZ2xvYmFsIG9yIGxheW91dCB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIHRvIHRoZSB0b3AtbW9zdCBmaWVsZAogICAgICAgICAgICB2YXIgdHJpcCA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcGxhdGVEZXNjcmlwdG9yKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXQgJiYgbGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihsYXlvdXQudGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICB0cmlwID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0cmlwICYmIHZpZXdUZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcGxhdGVEZXNjcmlwdG9yKHZpZXdUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlbnN1cmUgd2UgaGF2ZSBhIHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmdldFRlbXBsYXRlRGVzY3JpcHRvcigpOwogICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBmaWVsZCBpbnN0YW5jZSBpcyBjcmVhdGVkLiBJdCB3aWxsIGluaXRpYWxpemUKICAgICAgICAgKiB0aGUgZmllbGQgdG8gZ2V0IGl0IHJlYWR5IGZvciByZW5kaXRpb24uCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSBhIHRlbXBsYXRlIGRlc2NyaXB0b3IgcGlja2VkIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGVzY3JpcHRvcigpOwoKICAgICAgICAgICAgLy8gSlNPTiBTQ0hFTUEKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLnNjaGVtYS5yZXF1aXJlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnJlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZBTElEQVRJT04KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudmFsaWRhdGUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsaWRhdGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPUFRJT05TCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmRpc2FibGVkKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1FU1NBR0VTCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnNob3dNZXNzYWdlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXBGaWVsZDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGZuCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgb246IGZ1bmN0aW9uKG5hbWUsIGZuKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJBZGRpbmcgbGlzdGVuZXIgZm9yIGV2ZW50OiAiICsgbmFtZSk7CgogICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c1tuYW1lXSkgewogICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5wdXNoKGZuKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVW5yZWdpc3RlcnMgYWxsIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqLwogICAgICAgIG9mZjogZnVuY3Rpb24obmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXS5sZW5ndGggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQgYW5kIHByb3BhZ2F0ZXMgdGhlIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGJlaGF2aW9yIGlzIHRvIHByb3BhZ2F0ZSB1cCB0byB0aGUgcGFyZW50IGNoYWluIChidWJibGUgdXApLgogICAgICAgICAqCiAgICAgICAgICogSWYgImRpcmVjdGlvbiIgaXMgc2V0IHRvICJkb3duIiBhbmQgdGhlIGZpZWxkIGlzIGEgY29udGFpbmVyLCB0aGVuIHRoZSBldmVudCBpcyBwcm9wYWdhdGVkIGRvd24KICAgICAgICAgKiB0byBjaGlsZHJlbiAodHJpY2tsZSBkb3duKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiYm90aCIsIHRoZW4gYm90aCB1cCBhbmQgZG93biBhcmUgdHJpZ2dlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKiBAcGFyYW0gZXZlbnQKICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIChvcHRpb25hbCkgc2VlIGFib3ZlCiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcldpdGhQcm9wYWdhdGlvbjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGRpcmVjdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YoZXZlbnQpID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gZXZlbnQ7CiAgICAgICAgICAgICAgICBldmVudCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAidXAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAidXAiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB3ZSB0cmlnZ2VyIG91cnNlbHZlcyBmaXJzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwoKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgdHJpZ2dlciBwYXJlbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKHRoaXMucGFyZW50LCBuYW1lLCBldmVudCwgZGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICJkb3duIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZG8gYW55IGNoaWxkcmVuIGZpcnN0CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbChjaGlsZCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRvIG91cnNlbHZlcyBsYXN0CiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIuY2FsbCh0aGlzLCBuYW1lLCBldmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiYm90aCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCAiZG93biIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB0aGVuIGRvIG91cnNlbHZlcwogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwoKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgdHJpZ2dlciBwYXJlbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKHRoaXMucGFyZW50LCBuYW1lLCBldmVudCwgInVwIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbiBldmVudAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKiBAcGFyYW0gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIFJlbWFpbmRlciBvZiBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBldmVudCwgYXJnMSwgYXJnMiwgYXJnMykKICAgICAgICB7CiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgPT0gY29udHJvbAoKICAgICAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW25hbWVdOwogICAgICAgICAgICBpZiAoaGFuZGxlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihoYW5kbGVyKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiRmlyaW5nIGV2ZW50OiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlRoZSBldmVudCBoYW5kbGVyIGNhdWdodCBhbiBleGNlcHRpb246ICIgKyBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIHRoZSBkYXRhIGludG8gdGhlIGZpZWxkLiAgQ2FsbGVkIGF0IHRoZSB2ZXJ5IGVuZCBvZiBjb25zdHJ1Y3Rpb24uCiAgICAgICAgICovCiAgICAgICAgYmluZERhdGE6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgbWV0aG9kIGludG8gdGhlIGZpZWxkLiAgSXQgaXMgY2FsbGVkIGJ5IEFscGFjYSBmb3IgZWFjaCBmaWVsZCBiZWluZyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIFJlbmRlcnMgdGhpcyBmaWVsZCBpbnRvIHRoZSBjb250YWluZXIgYW5kIGNyZWF0ZXMgYSBET00gZWxlbWVudCB3aGljaCBpcyBib3VuZCBpbnRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgVmlldyB0byBiZSB1c2VkIGZvciByZW5kZXJpbmcgZmllbGQgKG9wdGlvbmFsKS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBQb3N0LVJlbmRlciBjYWxsYmFjayAob3B0aW9uYWwpLgogICAgICAgICAqLwogICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmlldywgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodmlldyAmJiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpIHx8IEFscGFjYS5pc09iamVjdCh2aWV3KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlldy5zZXRWaWV3KHZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGNhbGxiYWNrKSAmJiBBbHBhY2EuaXNGdW5jdGlvbih2aWV3KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHZpZXc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxhc3QgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gcG9wdWxhdGUgdGhlIGxhYmVsIGZyb20gcHJvcGVydHlJZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhYmVsID09PSBudWxsICYmIHRoaXMucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5wcm9wZXJ0eUlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiBuYW1lIGZpZWxkCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5zZXR1cCgpOwoKICAgICAgICAgICAgdGhpcy5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHNlbGYuX3JlbmRlcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB0aGUgcmVuZGVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJyZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY2FsY3VsYXRlTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm5hbWUgfHwgKHRoaXMubmFtZSAmJiB0aGlzLm5hbWVDYWxjdWxhdGVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGFzIHBhdGg/CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQubmFtZSAmJiB0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdGhpcy5wYXRoLnN1YnN0cmluZyh0aGlzLnBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgIT09IC0xICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudCA9IGxhc3RTZWdtZW50LnN1YnN0cmluZyhsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgKyAxLCBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5wYXJlbnQubmFtZSArICJfIiArIGxhc3RTZWdtZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgbmFtZSBmcm9tIHRoZSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGF0aC5yZXBsYWNlKC9cLy9nLCIiKS5yZXBsYWNlKC9cWy9nLCJfIikucmVwbGFjZSgvXF0vZywiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgcHJvY2Vzc2luZyB0aGUgcmVuZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBQb3N0LXJlbmRlciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gYSBmb3JtCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZm9ybSAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmZvcm0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZm9ybS52aWV3VHlwZSA9IHRoaXMudmlldy50eXBlOwoKICAgICAgICAgICAgICAgIHZhciBmb3JtID0gc2VsZi5mb3JtOwogICAgICAgICAgICAgICAgaWYgKCFmb3JtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSBuZXcgQWxwYWNhLkZvcm0oc2VsZi5kb21FbCwgdGhpcy5vcHRpb25zLmZvcm0sIHNlbGYudmlldy5pZCwgc2VsZi5jb25uZWN0b3IsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JtLnJlbmRlcihmdW5jdGlvbihmb3JtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcm0gaXMgdGhlIGZvcm0gaW5zdGFuY2UgKG5vdCB0aGUganF1ZXJ5IGVsZW1lbnQpCgogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRmllbGRIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyIGl0CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzc1JlbmRlcih0ZW1wRmllbGRIb2xkZXIsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBmaWVsZCBiZWZvcmUgb3VyIGZvcm0gZmllbGRzIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZvcm1GaWVsZHNDb250YWluZXIuYmVmb3JlKHNlbGYuZmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmb3JtRmllbGRzQ29udGFpbmVyIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmZvcm1GaWVsZHNDb250YWluZXIucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW5kIHRoZSB0b3AgZmllbGQgdG8gdGhlIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sID0gc2VsZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0gPSBmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWUgPSBzZWxmOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgYW55IHBvc3QtcmVuZGVyaW5nIGZhY2lsaXRpZXMgdG8ga2ljayBpbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRpYWxpemluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGZvciBmb3JtIHRvIGRvIHNvbWUgbGF0ZSB1cGRhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0uYWZ0ZXJJbml0aWFsaXplKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmllbGQgcmVtb3ZlcywgcmVtb3ZlIHRoZSBmb3JtIGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBBbHBhY2EuaXNGdW5jdGlvbihjYWxsYmFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1JlbmRlcihzZWxmLmRvbUVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkICJmaWVsZCIgZWxlbWVudCB0byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgICAgICAvLyQoc2VsZi5maWVsZCkuYXBwZW5kVG8oc2VsZi5kb21FbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCBpbml0aWFsaXppbmcKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBBbHBhY2EuaXNGdW5jdGlvbihjYWxsYmFjaykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoZSBmaWVsZCBpbnRvIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgY2FsbGJhY2sgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIF9wcm9jZXNzUmVuZGVyOiBmdW5jdGlvbihwYXJlbnRFbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkIChvdXRlciBlbGVtZW50KQogICAgICAgICAgICBzZWxmLnJlbmRlckZpZWxkKHBhcmVudEVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImZpZWxkIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImZpZWxkIik7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyIGFueSBmaWVsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZEVsZW1lbnRzKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICByZW5kZXJGaWVsZERvbUVsZW1lbnQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGVtcGxhdGVEZXNjcmlwdG9yID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgZmllbGQKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB0aGlzLm9wdGlvbnMsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICAgICAidmlldyI6IHRoaXMudmlldywKICAgICAgICAgICAgICAgICJwYXRoIjogdGhpcy5wYXRoLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgImZpZWxkIiBvdXRlciBlbGVtZW50LiAgVGhpcyBpcyB1c3VhbGx5IHRoZSBjb250cm9sIG9yIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwYXJlbnRFbAogICAgICAgICAqIEBwYXJhbSBvblN1Y2Nlc3MKICAgICAgICAgKi8KICAgICAgICByZW5kZXJGaWVsZDogZnVuY3Rpb24ocGFyZW50RWwsIG9uU3VjY2VzcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIHRoZSBkYXRhIHdlJ2xsIHJlbmRlcgogICAgICAgICAgICB2YXIgdGhlRGF0YSA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCBhbmQgdGhlRGF0YSBpcyBhbiBvYmplY3QsIGNvbnZlcnQgdG8gc3RyaW5nCiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YodGhlRGF0YSkgPT09ICJvYmplY3QiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGVEYXRhID0gSlNPTi5zdHJpbmdpZnkodGhlRGF0YSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZW5kZXJlZERvbUVsZW1lbnQgPSBzZWxmLnJlbmRlckZpZWxkRG9tRWxlbWVudCh0aGVEYXRhKTsKCiAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBiYWNrIG11bHRpcGxlIGVsZW1lbnRzLCB0cnkgdG8gcGljayBhdCB0aGUgZmlyc3QgRElWCiAgICAgICAgICAgIGlmICgkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNpbmdsZSA9IG51bGw7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQocmVuZGVyZWREb21FbGVtZW50KS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9ICQocmVuZGVyZWREb21FbGVtZW50KVtpXS5ub2RlTmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoImRpdiIgPT09IG5hbWUgfHwgInNwYW4iID09PSBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2luZ2xlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNpbmdsZSA9ICQoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxhc3QoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRG9tRWxlbWVudCA9IHNpbmdsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5maWVsZCA9IHJlbmRlcmVkRG9tRWxlbWVudDsKICAgICAgICAgICAgdGhpcy5maWVsZC5hcHBlbmRUbyhwYXJlbnRFbCk7CgogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGFueSBmaWVsZCBlbGVtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEZvciBjb250cm9scyBvciBjb250YWluZXJzLCB0aGlzIGhvb2sgaXMgdXNlZCB0byBpbmplY3QgYWRkaXRpb25hbCBkb20gZWxlbWVudHMgaW50byB0aGUgb3V0ZXIgZmllbGQKICAgICAgICAgKiBkb20gZWxlbWVudC4gIFNpbXBsZSBmaWVsZCB0eXBlcyBtYXkgY2hvb3NlIG5vdCB0byBpbXBsZW1lbnQgdGhpcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgdHlwaWNhbGx5IG9uY2UgcGVyIHJlbmRlci4gIElmIGEgRE9NIGVsZW1lbnQgaXMgbW92ZWQgd2l0aGluIGEgY29udGFpbmVyIGFuZCBpdCdzIGluZGV4aW5nCiAgICAgICAgICogY2hhbmdlcywgdGhpcyB3aWxsIGdldCBjYWxsZWQgYWdhaW5zdCB0byBlbnN1cmUgdGhhdCBET00gcHJvcGVydGllcyBhcmUga2VwdCBpbiBzeW5jLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIHBhdGgKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1wYXRoIiwgdGhpcy5nZXRQYXRoKCkpOwoKICAgICAgICAgICAgLy8gYWxsIGZpZWxkcyBnZXQgdGhlaXIgbmFtZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLW5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CgogICAgICAgICAgICAvLyBuYW1lIHNob3VsZCBub3QgYXBwZWFyIG9uIGZpZWxkCiAgICAgICAgICAgIHRoaXMuZmllbGQucmVtb3ZlQXR0cigibmFtZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBmaWVsZCByZW5kaXRpb24gaXMgY29tcGxldGUuIEl0IGlzIHNlcnZlZCBhcyBhIHdheSB0byBtYWtlIGZpbmFsCiAgICAgICAgICogbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9tIGVsZW1lbnRzIHRoYXQgd2VyZSBwcm9kdWNlZC4KICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZSAiYWxwYWNhLWZpZWxkIiBjbGFzcyB3aGljaCBtYXJrcyB0aGUgb3V0ZXIgZWxlbWVudAogICAgICAgICAgICB0aGlzLmZpZWxkLmFkZENsYXNzKCJhbHBhY2EtZmllbGQiKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IG1hcmtlZCBieSB0eXBlIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLSIgKyB0aGlzLmdldEZpZWxkVHlwZSgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IGZpZWxkIGlkIGRhdGEgYXR0cmlidXRlCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiLCB0aGlzLmdldElkKCkpOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVET01FbGVtZW50KCk7CgogICAgICAgICAgICAvLyB0cnkgdG8gYXZvaWQgYWRkaW5nIHVubmVjZXNzYXJ5IGluamVjdGlvbnMgZm9yIGRpc3BsYXkgdmlldy4KICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICE9PSAndmlldycpIHsKCiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZXF1aXJlZCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJyZXF1aXJlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1vcHRpb25hbCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogIm9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJvcHRpb25hbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBkb0Rpc2FibGVGaWVsZCA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYXJrICJkaXNhYmxlZCIgYXR0cmlidXRlIG9udG8gdW5kZXJseWluZyBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJ2lucHV0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdzZWxlY3QnLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpyYWRpbycsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnOmNoZWNrYm94Jywgc2VsZi5maWVsZCksIHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHJhZGlvIGJ1dHRvbnMgKHByZXZlbnQgY2xpY2tzKQogICAgICAgICAgICAgICAgICAgICQoIjpyYWRpbyIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCgiLnJhZGlvIGxhYmVsIiwgc2VsZi5maWVsZCkub2ZmKCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIChpbnB1dCBmaWVsZCkKICAgICAgICAgICAgICAgICAgICAkKCJpbnB1dCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgZGlzYWJsZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRpc2FibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcmVhZG9ubHkKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLXJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgICAgICQoJ2lucHV0JywgdGhpcy5maWVsZCkuYXR0cigncmVhZG9ubHknLCAncmVhZG9ubHknKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlYWRvbmx5IgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJyZWFkb25seSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1kaXNhYmxlZCIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGRvRGlzYWJsZUZpZWxkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZGlzYWJsZWQiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYWxsb3cgc2luZ2xlIG9yIG11bHRpcGxlIGZpZWxkIGNsYXNzZXMgdG8gYmUgc3BlY2lmaWVkIHZpYSB0aGUgImZpZWxkQ2xhc3MiCiAgICAgICAgICAgICAgICAvLyBvciAiZmllbGRDbGFzc2VzIiBvcHRpb25zCiAgICAgICAgICAgICAgICB2YXIgYXBwbHlGaWVsZENsYXNzID0gZnVuY3Rpb24oZWwsIHRoaW5nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGluZykgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGluZy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRoaW5nW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5pbmRleE9mKCIsIikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRoaW5nLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0b2tlbnNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpbmcuaW5kZXhPZigiICIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXBwbHlGaWVsZENsYXNzKHRoaXMuZmllbGQsIHRoaXMub3B0aW9uc1siZmllbGRDbGFzcyJdKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3IgY3VzdG9tIHN0eWxlcyBwcm92aWRlZCBieSBjdXN0b20gdmlldwogICAgICAgICAgICAgICAgdmFyIGN1c3RvbVN0eWxlcyA9IHRoaXMudmlldy5nZXRTdHlsZXMoKTsKICAgICAgICAgICAgICAgIGlmIChjdXN0b21TdHlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgc3R5bGVDbGFzcyBpbiBjdXN0b21TdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHN0eWxlQ2xhc3MsIHRoaXMuZG9tRWwpLmNzcyhjdXN0b21TdHlsZXNbc3R5bGVDbGFzc10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgLy8gYWZ0ZXIgcmVuZGVyCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGUiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGUiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBiaW5kIGRhdGEgaWYgd2UncmUgaW4gImVkaXQiIG1vZGUKICAgICAgICAgICAgICAgIC8vIHR5cGljYWxseSwgd2UgZG9uJ3QgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJjcmVhdGUiIG9yIGFueSBvdGhlciBtb2RlCiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgJiYgdGhpcy52aWV3LnR5cGUgPT09ICdlZGl0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvbnRyb2wgaXMgc2hvd2luZyBkZWZhdWx0IGRhdGEsIHRoZW4gd2UgcmVuZGVyIHRoZSBjb250cm9sIGFueXdheQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZERhdGEoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGxvZ2dpbmcgdG8gYmUgdXNlZnVsCiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgPT09ICJjcmVhdGUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiU2tpcHBpbmcgZGF0YSBiaW5kaW5nIGZvciBmaWVsZDogIiArIHRoaXMuaWQgKyAiIHNpbmNlIHZpZXcgbW9kZSBpcyAnY3JlYXRlJyIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZG9tLWxldmVsIGV2ZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGRlbgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkZWZhdWx0SGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSAodGhpcy52aWV3LnR5cGUgPT09ICdjcmVhdGUnKSAmJiAhdGhpcy5yZWZyZXNoZWQ7CiAgICAgICAgICAgIHRoaXMuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLm9wdGlvbnMuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpID8gZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yIDogdGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yOwoKICAgICAgICAgICAgLy8gZm9yIGNyZWF0ZSB2aWV3LCBoaWRlIGFsbCByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXcuZGlzcGxheVJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtcmVhZG9ubHkiKS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHBvc3QgcmVuZGVyCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zdFJlbmRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc3RSZW5kZXIuY2FsbCh0aGlzLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWRyYXdzIHRoZSBmaWVsZCB1c2luZyB0aGUgY3VycmVudGx5IGJvdW5kIERPTSBlbGVtZW50IGFuZCB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGRhdGEKICAgICAgICAgICAgdmFyIF9kYXRhID0gc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhpcyBzdHVmZgogICAgICAgICAgICB2YXIgb2xkRG9tRWwgPSBzZWxmLmRvbUVsOwogICAgICAgICAgICB2YXIgb2xkRmllbGQgPSBzZWxmLmZpZWxkOwogICAgICAgICAgICAvL3ZhciBvbGRDb250cm9sID0gc2VsZi5jb250cm9sOwogICAgICAgICAgICAvL3ZhciBvbGRDb250YWluZXIgPSBzZWxmLmNvbnRhaW5lcjsKICAgICAgICAgICAgLy92YXIgb2xkRm9ybSA9IHNlbGYuZm9ybTsKCiAgICAgICAgICAgIC8vIGluc2VydCBtYXJrZXIgZWxlbWVudCBiZWZvcmUgY3VycmVudCBmaWVsZCB0byBtYXJrIHdoZXJlIHdlJ2xsIHJlbmRlcgogICAgICAgICAgICB2YXIgbWFya2VyRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAkKG9sZEZpZWxkKS5iZWZvcmUobWFya2VyRWwpOwoKICAgICAgICAgICAgLy8gdGVtcCBkb21FbAogICAgICAgICAgICBzZWxmLmRvbUVsID0gJCgiPGRpdiBzdHlsZT0nZGlzcGxheTogbm9uZSc+PC9kaXY+Iik7CiAgICAgICAgICAgIC8vIGNsZWFyIHRoaXMgc3R1ZmYgb3V0CiAgICAgICAgICAgIHNlbGYuZmllbGQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udHJvbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuZm9ybSA9IHVuZGVmaW5lZDsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgYWxsIGJ1dHRvbnMgb24gb3VyIGN1cnJlbnQgZmllbGQKICAgICAgICAgICAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIHJlcGVhdGVkIGNsaWNrcyBjb3VsZCBjYXVzZSB0cm91YmxlIHdoaWxlIHRoZSBmaWVsZCBpcyBpbiBzb21lIGhhbGYtc3RhdGUKICAgICAgICAgICAgLy8gZHVyaW5nIHJlZnJlc2gKICAgICAgICAgICAgJChvbGRGaWVsZCkuZmluZCgiYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKCiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vIHJlLXNldHVwIHRoZSBmaWVsZAogICAgICAgICAgICBzZWxmLnNldHVwKCk7CgogICAgICAgICAgICBzZWxmLnNldHVwRmllbGQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWhlYWQgb2YgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkuYmVmb3JlKHNlbGYuZmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgZG9tRWwKICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbUVsID0gb2xkRG9tRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgY2xhc3NlcyBmcm9tIG9sZEZpZWxkIG9udG8gZmllbGQKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkQ2xhc3NlcyA9ICQob2xkRmllbGQpLmF0dHIoImNsYXNzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENsYXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9sZENsYXNzZXMuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgIXYuaW5kZXhPZigiYWxwYWNhLSIpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcyh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBvbGQgZmllbGQKICAgICAgICAgICAgICAgICAgICAkKG9sZEZpZWxkKS5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAkKG1hcmtlckVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGF0IHdlJ3JlIHJlZnJlc2hlZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhcHBhcmVudGx5IG5lZWRlZCBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihfZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdChfZGF0YSkgfHwgQWxwYWNhLmlzQXJyYXkoX2RhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKF9kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZmlyZSB0aGUgInJlYWR5IiBldmVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoc2VsZik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndhcmRzLi4uCgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyBjbGVhbiB1cCBvbGQgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyaWdnZXIgdGhlIGJvdW5kICJkZXN0cm95ZWQiIGV2ZW50IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIG9sZCBkb20gZWwuCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhc29uIGlzIHRoYXQgd2UgaGF2ZSBvbGRGb3JtIC0+IEZpZWxkICh3aXRoIG9sZERvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZvcm0gLT4gRmllbGQgKHdpdGggZG9tRWwpCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmluZyB1cCAib2xkRG9tRWwiIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJvbGRGb3JtIiB0byBjbGVhbnVwCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY2F1c2VzICJGaWVsZCIgdG8gY2xlYW51cCB3aGljaCBjYXVzZXMgImRvbUVsIiB0byBjbGVhbiB1cCAoYW5kIGFsc28gImZvcm0iKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBqdXN0IHdhbnQgdG8gcmVtb3ZlIHRoZSBkb20gZWxlbWVudHMgZm9yICJvbGREb21FbCIgYW5kICJvbGRGb3JtIiB3aXRob3V0IHRyaWdnZXJpbmcKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lhbCBkZXN0cm95ZXIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcnMgdGhhdCB3ZSBjYW4gZG8gdGhpcyB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50Li4uPwogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkucmVtb3ZlKHVuZGVmaW5lZCwgewogICAgICAgICAgICAgICAgICAgICAgICAibm9kZXN0cm95IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbGllcyBhIHZpZXcgc3R5bGUgdG8gYSBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAgICAgKi8KICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmFwcGx5U3R5bGUoaWQsIHRhcmdldCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgYSB2aWV3IGNhbGxiYWNrIGZvciB0aGUgY3VycmVudCBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSBhcmcxCiAgICAgICAgICogQHBhcmFtIGFyZzIKICAgICAgICAgKiBAcGFyYW0gYXJnMwogICAgICAgICAqIEBwYXJhbSBhcmc0CiAgICAgICAgICogQHBhcmFtIGFyZzUKICAgICAgICAgKi8KICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGlkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmZpcmVDYWxsYmFjayh0aGlzLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBvdXRlciAiZmllbGQiIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRyb2wgZmllbGQgb3IgYSBjb250YWluZXIgZmllbGQsIHRoaXMgRE9NIGVsZW1lbnQgd2lsbCB3cmFwIHRoZSBpbm5lciAiY29udHJvbCIKICAgICAgICAgKiBhbmQgImNvbnRhaW5lciIgZWxlbWVudHMgcmVzcGVjdGl2ZWx5LiAgSW4gc29tZSBjYXNlcywgdGhlIHdyYXBwaW5nIG1pZ2h0IG5vdCBleGlzdCBpbiB3aGljaCBjYXNlIHRoaXMKICAgICAgICAgKiBmaWVsZCBtYXkgYmUgdGhlICJjb250cm9sIiBvciAiY29udGFpbmVyIiBmaWVsZCBpdHNlbGYuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVuZGVyZWQgRE9NIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRFbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIEZpZWxkIGlkLgogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGlzIGZpZWxkJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgcGFyZW50LgogICAgICAgICAqLwogICAgICAgIGdldFBhcmVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50IGluIHRoZSBncmFwaCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0aCB0byB0aGlzIGVsZW1lbnQKICAgICAgICAgKi8KICAgICAgICBnZXRQYXRoOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50IGF0IHRoZSBjdXJyZW50IGxldmVsIG9mIEpTT04gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldE5hbWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoaXMgZmllbGQgaXMgdG9wIGxldmVsLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhpcyBmaWVsZCBpcyB0aGUgdG9wIGxldmVsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVG9wTGV2ZWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzRW1wdHkodGhpcy5wYXJlbnQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdhbGtzIHVwIHRoZSBwYXJlbnQgY2hhaW4gYW5kIHJldHVybnMgdGhlIHRvcCBtb3N0IGNvbnRyb2wuICBJZiBubyBwYXJlbnRzLCB0aGVuIGN1cnJlbnQgY29udHJvbCBpcyB0b3AgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtDb250cm9sfSB0b3AgbW9zdCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgdG9wOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9wID0gdGhpczsKCiAgICAgICAgICAgIHdoaWxlICh0b3AucGFyZW50KSB7CiAgICAgICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdG9wOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIHZhbCA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0LgogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgLSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXkgbW9kZSBhbmQgbm90IGZpcnN0IHJlbmRlciwgdGhlbiBkbyBhIHJlZnJlc2ggaGVyZQogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgIXRoaXMuaW5pdGlhbGl6aW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50b3AgJiYgdGhpcy50b3AoKSAmJiB0aGlzLnRvcCgpLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSByZW5kZXJpbmcgdW5kZXIgYSB0b3AgbW9zdCBjb250cm9sIHRoYXQgaXNuJ3QgZmluaXNoZWQgaW5pdGlhbGl6aW5nLCB0aGVuIGRvbid0IHJlZnJlc2gKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB2YWx1ZSB0byBkZWZhdWx0LgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGZpZWxkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGZpZWxkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIHNldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yKSB7CiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVEZXNjcmlwdG9yID0gdGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZhbGlkYXRpb24gc3RhdGUgbWVzc2FnZXMgdG8gc2hvdyBmb3IgYSBnaXZlbiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBtZXNzYWdlcyBlaXRoZXIgYSBtZXNzYWdlIG9iamVjdCB7aWQsIG1lc3NhZ2V9IG9yIGFuIGFycmF5IG9mIG1lc3NhZ2Ugb2JqZWN0cwogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYmVmb3JlU3RhdHVzIFByZXZpb3VzIHZhbGlkYXRpb24gc3RhdHVzLgogICAgICAgICAqLwogICAgICAgIGRpc3BsYXlNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlcywgYmVmb3JlU3RhdHVzKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiBvYmplY3QsIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gW21lc3NhZ2VzXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgc3RyaW5nLCBjb252ZXJ0CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNTdHJpbmcobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFt7CiAgICAgICAgICAgICAgICAgICAgImlkIjogImN1c3RvbSIsCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlcwogICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgYWxwYWNhIG1lc3NhZ2VzIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLmNoaWxkcmVuKCIuYWxwYWNhLW1lc3NhZ2UiKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIG1heE1lc3NhZ2UKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcyAmJiBBbHBhY2EuaXNOdW1iZXIodGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKSAmJiB0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc2xpY2UoMCx0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDQUxMQkFDSzogInJlbW92ZU1lc3NhZ2VzIgogICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVtb3ZlTWVzc2FnZXMiKTsKCiAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIGFuZCBnZW5lcmF0ZSBpdAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgbWVzc2FnZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKG1lc3NhZ2VzLCBmdW5jdGlvbihpbmRleCwgbWVzc2FnZU9iamVjdCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG1lc3NhZ2UgdG8gdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJtZXNzYWdlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZUVsZW1lbnQgPSBBbHBhY2EudG1wbChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlT2JqZWN0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYWRkQ2xhc3MoImFscGFjYS1tZXNzYWdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZS1oaWRkZW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5hcHBlbmQobWVzc2FnZUVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJhZGRNZXNzYWdlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhZGRNZXNzYWdlIiwgaW5kZXgsIG1lc3NhZ2VPYmplY3QuaWQsIG1lc3NhZ2VPYmplY3QubWVzc2FnZSwgaGlkZGVuKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2VzIHRoZSB2YWxpZGF0aW9uIGZvciBhIGZpZWxkIHRvIGJlIHJlZnJlc2hlZCBvciByZWRyYXduIHRvIHRoZSBzY3JlZW4uCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0b2xkIHRvIGNoZWNrIGNoaWxkcmVuLCB0aGVuIGFsbCBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyIGZpZWxkIHdpbGwgYmUgcmVmcmVzaGVkIGFzIHdlbGwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZhbGlkYXRlQ2hpbGRyZW4gd2hldGhlciB0byByZWZyZXNoIHZhbGlkYXRpb24gZm9yIGNoaWxkcmVuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hlbiB2YWxpZGF0aW9uIGNvbXBsZXRlcwogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4sIGNiKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkNhbGwgcmVmcmVzaFZhbGlkYXRpb25TdGF0ZTogIiArIHRoaXMucGF0aCk7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBydW4gdmFsaWRhdGlvbiBjb250ZXh0IGNvbXBpbGF0aW9uIGZvciBvdXJzZWx2ZXMgYW5kIG9wdGlvbmFsbHkgYW55IGNoaWxkcmVuCiAgICAgICAgICAgIHZhciBjb250ZXh0cyA9IFtdOwogICAgICAgICAgICB2YXIgZnVuY3Rpb25zID0gW107CgogICAgICAgICAgICAvLyBjb25zdHJ1Y3RzIGFuIGFzeW5jIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZmllbGQKICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQnVpbGRlciA9IGZ1bmN0aW9uKGZpZWxkLCBjb250ZXh0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbiB0aGUgbmV4dCB0aWNrCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY29tcGlsZVZhbGlkYXRpb25Db250ZXh0KGZpZWxkLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcCB1cCBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gaW50byBhc3luYyBjYWxsYmFjayBtZXRob2RzCiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUNoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkZXB0aCBmaXJzdCBjcmF3bCBhY3Jvc3MgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICB2YXIgY3Jhd2wgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzVmFsaWRhdGlvblBhcnRpY2lwYW50KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaGFzIGNoaWxkcmVuLCBnbyBkZXB0aCBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bChmaWVsZC5jaGlsZHJlbltpXSwgY29udGV4dHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIoZmllbGQsIGNvbnRleHRzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNyYXdsKHRoaXMsIGNvbnRleHRzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIG91cnNlbHZlcyBpbiBsYXN0CiAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uQnVpbGRlcih0aGlzLCBjb250ZXh0cykpOwoKICAgICAgICAgICAgLy8gbm93IHJ1biBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiBwYXJhbGxlbAogICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwoZnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBjb250ZXh0cyBub3cgY29udGFpbnMgYWxsIG9mIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMKCiAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGwgY29udGV4dHMgaW50byBhIHNpbmdsZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICAgIHZhciBtZXJnZWRNYXAgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY29udGV4dHNbaV07CgogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGNvbnRleHQgaXMgYWxyZWFkeSBpbiBvcmRlciBbY2hpbGQsIHBhcmVudCwgLi4uXQoKICAgICAgICAgICAgICAgICAgICB2YXIgbUluZGV4ID0gbWVyZ2VkQ29udGV4dC5sZW5ndGg7CgogICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgZm9yd2FyZAogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udGV4dC5sZW5ndGg7IGorKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IGNvbnRleHRbal07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRNYXBbZW50cnkuaWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFkZCB0byBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbnRyeSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaWQgPSBlbnRyeS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnBhdGggPSBlbnRyeS5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuZG9tRWwgPSBlbnRyeS5kb21FbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmZpZWxkID0gZW50cnkuZmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS52YWxpZGF0ZWQgPSBlbnRyeS52YWxpZGF0ZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5pbnZhbGlkYXRlZCA9IGVudHJ5LmludmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWQgPSBlbnRyeS52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZENvbnRleHQuc3BsaWNlKG1JbmRleCwgMCwgbmV3RW50cnkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgaW4gbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRNYXBbbmV3RW50cnkuaWRdID0gbmV3RW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkudmFsaWRhdGVkICYmICFleGlzdGluZy5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWQgPSBlbnRyeS52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbm93IHJldmVyc2UgaXQgc28gdGhhdCBjb250ZXh0IGlzIG5vcm1hbGl6ZWQgd2l0aCBjaGlsZCBmaWVsZHMgZmlyc3QKICAgICAgICAgICAgICAgIG1lcmdlZENvbnRleHQucmV2ZXJzZSgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQoc2VsZi52aWV3LCBtZXJnZWRDb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoY2IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmlldyBhbmQgbG9jYWxlIGZyaWVuZGx5IHJldHJpZXZhbCBvZiBtZXNzYWdlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBrZXkKICAgICAgICAgKi8KICAgICAgICBnZXRNZXNzYWdlOiBmdW5jdGlvbihrZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldE1lc3NhZ2Uoa2V5LCB0aGlzLnZpZXcubG9jYWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgdGhpcyBmaWVsZCBhbmQgcmV0dXJucyB3aGV0aGVyIGl0IGlzIGluIGEgdmFsaWQgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gW0Jvb2xlYW5dIHZhbGlkYXRlQ2hpbGRyZW4gd2hldGhlciB0byBjaGlsZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsaWRhdGVDaGlsZHJlbikKICAgICAgICB7CiAgICAgICAgICAgIC8vIHNraXAgb3V0IGlmIHdlIGhhdmVuJ3QgeWV0IGJvdW5kIGFueSBkYXRhIGludG8gdGhpcyBjb250cm9sCiAgICAgICAgICAgIC8vIHRoZSBjb250cm9sIGNhbiBzdGlsbCBiZSBjb25zaWRlcmVkIHRvIGJlIGluaXRpYWxpemluZwogICAgICAgICAgICB2YXIgc3RhdHVzID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcgJiYgdGhpcy5vcHRpb25zLnZhbGlkYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWxpZGF0ZUNoaWxkcmVuLCB0aGVuIHdhbGsgcmVjdXJzaXZlbHkgZG93biBpbnRvIGNoaWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB2YWxpZGF0ZUNoaWxkcmVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC52YWxpZGF0ZSh2YWxpZGF0ZUNoaWxkcmVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBldmFsdWF0ZSBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuaGFuZGxlVmFsaWRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBzb21lIGRlYnVnZ2luZwogICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMgJiYgQWxwYWNhLmxvZ0xldmVsID09IEFscGFjYS5ERUJVRykgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gdGhpcy52YWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25bbWVzc2FnZUlkXVsic3RhdHVzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2godGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bIm1lc3NhZ2UiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVmFsaWRhdGlvbiBmYWlsdXJlIGZvciBmaWVsZCAoaWQ9IiArIHRoaXMuZ2V0SWQoKSArICIsIHBhdGg9IiArIHRoaXMucGF0aCArICIpLCBtZXNzYWdlczogIiArIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzbHlWYWxpZGF0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyB2YWxpZGF0aW9uLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVPcHRpb25hbCgpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RPcHRpb25hbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgibm90T3B0aW9uYWwiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGlzYWxsb3coKTsKICAgICAgICAgICAgdmFsSW5mb1siZGlzYWxsb3dWYWx1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgiZGlzYWxsb3dWYWx1ZSIpLCBbdGhpcy5zY2hlbWFbImRpc2FsbG93Il0uam9pbignLCAnKV0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIHZhbEluZm9bIm5vdE9wdGlvbmFsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHVzaW5nIHVzZXIgcHJvdmlkZWQgdmFsaWRhdG9yLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbGlkYXRvciAmJiBBbHBhY2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmFsaWRhdG9yKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRvci5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbEluZm8pIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHN0b3JlIGluICJjdXN0b20iCiAgICAgICAgICAgICAgICAgICAgX3RoaXMudmFsaWRhdGlvblsiY3VzdG9tIl0gPSB2YWxJbmZvOwoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgcmVxdWlyZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gRmFsc2UgaWYgdGhpcyBmaWVsZCB2YWx1ZSBpcyBlbXB0eSBidXQgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU9wdGlvbmFsOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSAmJiB0aGlzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzICYmIEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMud2hpdGVzcGFjZSwgdGhpcy5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpZWxkIHZhbHVlIGlzIGFsbG93ZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZpZWxkIHZhbHVlIGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEaXNhbGxvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5zY2hlbWEuZGlzYWxsb3cpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGRpc2FsbG93ID0gdGhpcy5zY2hlbWEuZGlzYWxsb3c7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoZGlzYWxsb3cpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQWxsb3dlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRpc2FsbG93LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChBbHBhY2EuaXNPYmplY3QodmFsKSB8fCAoQWxwYWNhLmlzQXJyYXkodmFsKSkgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQWxwYWNhLnBhcnNlSlNPTih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FsbG93ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0FsbG93ZWQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyhkaXNhbGxvdykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ID0gQWxwYWNhLnBhcnNlSlNPTihkaXNhbGxvdyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmNvbXBhcmVPYmplY3QodmFsLCBkaXNhbGxvdyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFueSBldmVudCBoYW5kbGVycyB0aGF0IGxpc3RlbnMgdG8gdGhlIHVwZGF0ZSBldmVudCBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQEVYVEVOU0lPTl9QT0lOVAogICAgICAgICAqCiAgICAgICAgICogRGlzYWJsZXMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkCiAgICAgICAgICovCiAgICAgICAgaXNEaXNhYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBlbmFibGVkCiAgICAgICAgICovCiAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZCgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBjb250cm9sIGZvY3VzZWQgdXBvbi4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCgogICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2VzIGFueSBldmVudCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGlzIGZpZWxkIGZyb20gdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIHJlbW92ZSBvYnNlcnZhYmxlCiAgICAgICAgICAgIEFscGFjYS5vYnNlcnZhYmxlKHRoaXMucGF0aCkuY2xlYXIoKTsKCiAgICAgICAgICAgIC8vIGNsZWFuIHVwIEFscGFjYS5maWVsZEluc3RhbmNlcyBzdGF0aWMgcmVmZXJlbmNlICh1c2VkIGZvciBjb252ZW5pZW5jZSBhY2Nlc3MgdG8gcHJldmlvdXMgcmVuZGVyZWQgZmllbGRzKQogICAgICAgICAgICBpZiAoQWxwYWNhICYmIEFscGFjYS5maWVsZEluc3RhbmNlcykgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5maWVsZEluc3RhbmNlc1t0aGlzLmdldElkKCldKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEFscGFjYS5maWVsZEluc3RhbmNlc1t0aGlzLmdldElkKCldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBET00KICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTaG93cyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgc2hvdzogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaGlkZGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaGlkZGVuIG9wdGlvbiBpcyBvbiwgd2UncmUgYWx3YXlzIGhpZGRlbgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgZmllbGQKICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuY3NzKHsKICAgICAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICIiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLm9uU2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAic2hvdyIKICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKCJzaG93Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvblNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhpZGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBoaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMub25IaWRlKCk7CgogICAgICAgICAgICAvLyBDQUxMQkFDSzogImhpZGUiCiAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKCJoaWRlIik7CiAgICAgICAgfSwKCiAgICAgICAgb25IaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBpc1ZhbGlkYXRpb25QYXJ0aWNpcGFudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTaG93bigpOwogICAgICAgIH0sCgogICAgICAgIGlzU2hvd246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Zpc2libGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTsKICAgICAgICB9LAoKICAgICAgICBpc0hpZGRlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoIm5vbmUiID09PSAkKHRoaXMuZmllbGQpLmNzcygiZGlzcGxheSIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmludHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHByaW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5wcmludEFyZWEoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBmaWVsZCBpcyBiZWluZyByZXZlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIHNob3duLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW50UmV2ZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgY29uY2VhbGVkIGFzIHRoZSByZXN1bHQgb2YgYSBkZXBlbmRlbmN5IG9yIGNvbmRpdGlvbmFsIGNhbGN1bGF0aW9uCiAgICAgICAgICogdGhhdCBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuLgogICAgICAgICAqLwogICAgICAgIG9uRGVwZW5kZW50Q29uY2VhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVsb2FkcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuY2FsbGJhY2spKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMsIHRoaXMucmVuZGVyZWRDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcih0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmaWVsZCBhbmQgcmVzZXRzIHRoZSBmaWVsZCB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaXNWYWxFbXB0eSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoaXMgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKGNoZWNrQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICBpZiAoY2hlY2tDaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5pc1ZhbGlkKGNoZWNrQ2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkLmlzRW1wdHlPYmplY3QodGhpcy52YWxpZGF0aW9uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YWxpZGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25ba2V5XS5zdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgZXZlbnQgaGFuZGxpbmcuCiAgICAgICAgICovCiAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU92ZXIuY2FsbChfdGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlcigibW91c2VvdmVyIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm1vdXNlb3V0KGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk1vdXNlT3V0LmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3V0IiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCAtIHNwZWNpZnkgZXZlbnRzIHZpYSBvcHRpb25zLm9uRmllbGQ8RmllbGROYW1lPiA9IGZuCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5vcHRpb25zLCBmdW5jdGlvbihrZXksIGZ1bmMpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5zdGFydHNXaXRoKGtleSwnb25GaWVsZCcpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0ga2V5LnN1YnN0cmluZyg3KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWVsZC5vbihldmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmdXR1cmUgc3VwcG9ydCAtIHNwZWNpZnkgZXZlbnRzIHZpYSBvcHRpb25zLmV2ZW50cy48ZXZlbnROYW1lPiA9IGZuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5ldmVudHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsIGZ1bmN0aW9uKGV2ZW50LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PT0gInJlbmRlciIgfHwgZXZlbnQgPT09ICJyZWFkeSIgfHwgZXZlbnQgPT09ICJibHVyIiB8fCBldmVudCA9PT0gImZvY3VzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbihldmVudCwgZnVuY3Rpb24oZSwgYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmNhbGwoX3RoaXMsIGUsIGEsIGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5maWVsZC5vbihldmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmNhbGwoX3RoaXMsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBmaWVsZCByZWNlaXZlcyBmb2N1cy4KICAgICAgICAgKgogICAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZSBlbnRpcmUgZmllbGQgdG8gaGlnaGxpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgZG9tIGV2ZW50CiAgICAgICAgICovCiAgICAgICAgb25Gb2N1czogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZW1wdHkiKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgbG9zZXMgZm9jdXMgKGJsdXJzKS4KICAgICAgICAgKgogICAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZSBlbnRpcmUgZmllbGQgdG8gdW4taGlnaGxpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgZG9tIGV2ZW50CiAgICAgICAgICovCiAgICAgICAgb25CbHVyOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgd2FzRm9jdXNlZCA9ICQodGhpcy5maWVsZCkuaGFzQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBVSSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgIGlmICh3YXNGb2N1c2VkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRibHVyIgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLnRyaWdnZXIoImZpZWxkYmx1ciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBmaWVsZCdzIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVwZGF0ZSB0aGUgY29udHJvbCdzIHZhbHVlIGFuZCBub3RpZnkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZSBFdmVudC4KICAgICAgICAgKi8KICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGludG8gZGF0YSBlbGVtZW50CiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiZWFjayBmb3Igd2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciBhIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUKICAgICAgICAgKi8KICAgICAgICBvbk1vdXNlT3ZlcjogZnVuY3Rpb24oZSkgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgbW91c2UgbW92ZXMgb3V0IG9mIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU91dDogZnVuY3Rpb24oZSkgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBhIGZpZWxkIGNvbnRyb2wgYnkgaXRzIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBGaWVsZCBjb250cm9sIHBhdGguCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gRmllbGQgY29udHJvbCBtYXBwZWQgdG8gdGhlIHBhdGguCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbEJ5UGF0aDogZnVuY3Rpb24ocGF0aCkgewoKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7CgogICAgICAgICAgICBpZiAocGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3RyaXAgb2ZmIHRoZSBsZWFkaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZigiLyIpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgIi8iIGlmIGl0IGlzIHRoZXJlCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmVuZHNXaXRoKHBhdGgsICIvIikpIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHBhdGhBcnJheSA9IHBhdGguc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXRoRWxlbWVudCA9IHBhdGhBcnJheVtpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIF9uYW1lID0gcGF0aEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9pbmRleCA9IC0xOwoKICAgICAgICAgICAgICAgICAgICB2YXIgejEgPSBwYXRoRWxlbWVudC5pbmRleE9mKCJbIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHoxID49IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgejIgPSBwYXRoRWxlbWVudC5pbmRleE9mKCJdIiwgejEgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHoyID49IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbmRleCA9IHBhcnNlSW50KHBhdGhFbGVtZW50LnN1YnN0cmluZyh6MSArIDEsIHoyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IHBhdGhFbGVtZW50LnN1YnN0cmluZygwLCB6MSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkW19uYW1lXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5kZXggPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRyZW5bX2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBBbHBhY2EgY29udHJvbHMgYnkgdGhlaXIgQWxwYWNhIGZpZWxkIHR5cGUgKGkuZS4gInRleHQiLCAiY2hlY2tib3giLCAiY2tlZGl0b3IiKQogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWVsZFR5cGUKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbHNCeUZpZWxkVHlwZTogZnVuY3Rpb24oZmllbGRUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChmaWVsZFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24ocGFyZW50LCBmaWVsZFR5cGUsIGFycmF5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbltpXS5nZXRGaWVsZFR5cGUoKSA9PT0gZmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhcmVudC5jaGlsZHJlbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZihwYXJlbnQuY2hpbGRyZW5baV0sIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYodGhpcywgZmllbGRUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIHNjaGVtYSB0eXBlIChpLmUuICJzdHJpbmciLCAibnVtYmVyIikuCiAgICAgICAgICogVGhpcyBkb2VzIGEgZGVlcCB0cmF2ZXJzYWwgYWNyb3NzIHRoZSBncmFwaCBvZiBBbHBhY2EgZmllbGQgaW5zdGFuY2VzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHNjaGVtYVR5cGUKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbHNCeVNjaGVtYVR5cGU6IGZ1bmN0aW9uKHNjaGVtYVR5cGUpIHsKCiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwoKICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24ocGFyZW50LCBzY2hlbWFUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0VHlwZSgpID09PSBzY2hlbWFUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhcmVudC5jaGlsZHJlbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uaXNDb250YWluZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZihwYXJlbnQuY2hpbGRyZW5baV0sIHNjaGVtYVR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIHNjaGVtYVR5cGUsIGFycmF5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIH0sCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIE9CU0VSVkFCTEVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc3Vic2NyaWJlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS51bnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBvYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5vYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGNsZWFyT2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCgogICAgICAgIC8vIFV0aWxpdHkgRnVuY3Rpb25zIGZvciBGb3JtIEJ1aWxkZXIKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBzY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gU2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmVxdWlyZWQKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGNvbnRyb2wgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB0eXBlIG9mIHRoZSBiYXNlIGNsYXNzIChvciBudWxsIGlmIG5vbmUpCiAgICAgICAgICovCiAgICAgICAgZ2V0QmFzZUZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VGaWVsZFR5cGUgPSBudWxsOwoKICAgICAgICAgICAgdmFyIHggPSB0aGlzLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgaWYgKHggJiYgeC5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJhc2VGaWVsZFR5cGUgPSB4LmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZUZpZWxkVHlwZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIG9mIG90aGVyIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0IGlzIGEgY29udGFpbmVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IGZpZWxkIGlzIHJlcXVpcmVkLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWVsZCBjYW4gYmUgc3BlY2lmaWVkIGFzIHJlcXVpcmVkIGJ5IGVpdGhlciBzcGVjaWZ5aW5nIHJlcXVpcmVkOiB0cnVlIG9uIHRoZSBzY2hlbWEgZm9yIGEgZmllbGQgb3IgYnkKICAgICAgICAgKiBzcGVjaWZ5aW5nIGEgcmVxdWlyZWQgYXJyYXkgb24gdGhlIHBhcmVudCBvYmplY3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgZmllbGQgKGFzIHBlciBqc29uIHNjaGVtYSB2IDA0KS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufQogICAgICAgICAqLwogICAgICAgIGlzUmVxdWlyZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGFzc3VtZSBub3QgcmVxdWlyZWQKICAgICAgICAgICAgdmFyIHJlcXVpcmVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hLnJlcXVpcmVkKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRoaXMuc2NoZW1hLnJlcXVpcmVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBqc29uLXNjaGVtYSBkcmFmdCAwNAogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuc2NoZW1hLnJlcXVpcmVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpcy5wYXJlbnQuc2NoZW1hLnJlcXVpcmVkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVxdWlyZWRBcnJheSA9IHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRBcnJheSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXlbaV0gPT09IHRoaXMucHJvcGVydHlJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB0aXRsZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHRpdGxlLgogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIGRlc2NyaXB0aW9uLgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBKU09OIHNjaGVtYSBvZiB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBKU09OIHNjaGVtYSBvZiB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mU2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIGlzIHJlYWQtb25seS4gIEEgcmVhZC1vbmx5IGZpZWxkIGNhbm5vdCBoYXZlIGl0J3MgdmFsdWUgY2hhbmdlZC4gIFJlYWQtb25seSBmaWVsZHMgcmVuZGVyIGluIGEgZ3JheWVkLW91dCBvciBkaXNhYmxlZCBjb250cm9sLiAgSWYgdGhlIGZpZWxkIGlzIHJlbmRlcmVkIHVzaW5nIGEgdmlldyB3aXRoIHRoZSA8Y29kZT5kaXNwbGF5UmVhZG9ubHk8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8gZmFsc2UsIHRoZSByZWFkLW9ubHkgZmllbGQgd2lsbCBub3QgYXBwZWFyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQncyB2YWx1ZSBpcyByZXF1aXJlZC4gIElmIHNldCB0byB0cnVlLCB0aGUgZmllbGQgbXVzdCB0YWtlIG9uIGEgdmFsaWQgdmFsdWUgYW5kIGNhbm5ub3QgYmUgbGVmdCBlbXB0eSBvciB1bmFzc2lnbmVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlZmF1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgYXNzaWduZWQgZm9yIHRoaXMgcHJvcGVydHkuICBJZiB0aGUgZGF0YSBmb3IgdGhlIGZpZWxkIGlzIGVtcHR5IG9yIG5vdCBwcm92aWRlZCwgdGhpcyBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcGx1Z2dlZCBpbiBmb3IgeW91LiAgU3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgd2hlbiB5b3Ugd2FudCB0byBwcmUtcG9wdWxhdGUgdGhlIGZpZWxkJ3MgdmFsdWUgYWhlYWQgb2YgdGltZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0YSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgZm9ybWF0IG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3ciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvd2VkIFZhbHVlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGRpc2FsbG93ZWQgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVwZW5kZW5jaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgcHJvcGVydHkgZGVwZW5kZW5jaWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VHlwZSAmJiAhQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRUeXBlKCkpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFPZlNjaGVtYS5wcm9wZXJ0aWVzLnR5cGVbJ2RlZmF1bHQnXSA9IHRoaXMuZ2V0VHlwZSgpOwogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydlbnVtJ10gPSBbdGhpcy5nZXRUeXBlKCldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzY2hlbWFPZlNjaGVtYTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFscGFjYSBvcHRpb25zIGZvciB0aGUgc2NoZW1hIHByb3BlcnRpZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2hvcnQgZGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRldGFpbGVkIGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgd2lsbCBiZSByZWFkIG9ubHkgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIlRoaXMgZmllbGQgaXMgcmVhZC1vbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBzZXQgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRlZmF1bHQgdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0YXJlYSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIGRhdGEgdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijoga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkRpc2FsbG93ZWQgdmFsdWVzIGZvciB0aGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbUxhYmVsIjoiVmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgRGVwZW5kZW5jaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSI6MywKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbiAoZmllbGQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQgJiYgZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wYXJlbnQuY2hpbGRyZW5CeVByb3BlcnR5SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50LnByb3BlcnR5SWQpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbnMgZm9yICIgKyB0aGlzLmdldFRpdGxlKCksCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB0aGlzLmdldERlc2NyaXB0aW9uKCkgKyAiIChPcHRpb25zKSIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm0iOnt9LAogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIElkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVuaXF1ZSBmaWVsZCBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB0eXBlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5nZXRGaWVsZFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dNZXNzYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNob3cgTWVzc2FnZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGlzcGxheSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWJsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSBkaXNhYmxlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZWFkb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCB3aWxsIGJlIHJlYWRvbmx5IGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSBoaWRkZW4gaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgbGFiZWwuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhlbHBlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBoZWxwIG1lc3NhZ2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIGZpZWxkIGhlbHAgbWVzc2FnZXMuICBFYWNoIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgb24gaXQncyBvd24gbGluZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZpZWxkQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDU1MgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIG9uZSBvciBtb3JlIENTUyBjbGFzc2VzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGRvbSBlbGVtZW50IGZvciB0aGlzIGZpZWxkIG9uY2UgaXQgaXMgcmVuZGVyZWQuICBTdXBwb3J0cyBhIHNpbmdsZSB2YWx1ZSwgY29tbWEtZGVsaW1pdGVkIHZhbHVlcywgc3BhY2UtZGVsaW1pdGVkIHZhbHVlcyBvciB2YWx1ZXMgcGFzc2VkIGluIGFzIGFuIGFycmF5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlSW5pdFZhbGlkYXRpb25FcnJvciIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIEluaXRpYWwgVmFsaWRhdGlvbiBFcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iIDogIkhpZGUgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9jdXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb2N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgaW5pdGlhbCBmb2N1cyBmb3IgdGhlIGZvcm0gd2lsbCBiZSBzZXQgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgKHVzdWFsbHkgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBmb3JtKS4gIElmIGEgZmllbGQgbmFtZSBvciBwYXRoIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBzcGVjaWZpZWQgY2hpbGQgZmllbGQgd2lsbCByZWNlaXZlIGZvY3VzLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBzZXQgZm9jdXMgdG8gJ25hbWUnIChzZWxlY3RpbmcgdGhlICduYW1lJyBmaWVsZCkgb3IgeW91IG1pZ2h0IHNldCBpdCB0byAnY2xpZW50L25hbWUnIHdoaWNoIHBpY2tzIHRoZSAnbmFtZScgZmllbGQgb24gdGhlICdjbGllbnQnIG9iamVjdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWUgTGFiZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIHN0cmluZyBsYWJlbHMgZm9yIGl0ZW1zIGluIHRoZSBlbnVtIGFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk92ZXJyaWRlIG9mIHRoZSB2aWV3IGZvciB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3IgdGhpcyBmaWVsZCB0byBiZSByZW5kZXJlZCB3aXRoIGEgZGlmZmVyZW50IHZpZXcgKHN1Y2ggYXMgJ2Rpc3BsYXknIG9yICdjcmVhdGUnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewoKICAgICAgICAgICAgICAgIHNjaGVtYU9mT3B0aW9ucy5wcm9wZXJ0aWVzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIGZvciByZW5kZXJpbmcgdGhlIEZPUk0gdGFnLiIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybSBBdHRyaWJ1dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIklkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVuaXF1ZSBmb3JtIGlkLiBBdXRvLWdlbmVyYXRlZCBpZiBub3QgcHJvdmlkZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gZW5kcG9pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZvcm0gc3VibWlzc2lvbiBtZXRob2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwb3N0IiwiZ2V0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydWJ5cmFpbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSdWJ5IE9uIFJhaWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJ1Ynkgb24gUmFpbHMgTmFtZSBTdGFuZGFyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJ0cnVlIiwgImZhbHNlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb2N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb2N1cyBTZXR0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImJ1dHRvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybSBCdXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb25maWd1cmF0aW9uIGZvciBmb3JtLWJvdW5kIGJ1dHRvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWJtaXQgQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlc2V0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb2dnbGUgU3VibWl0IFZhbGlkIFN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUb2dnbGUgdGhlIHZhbGlkaXR5IHN0YXRlIG9mIHRoZSBTdWJtaXQgYnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZPcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgQWxwYWNhIG9wdGlvbnMgZm9yIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnNGb3JPcHRpb25zID0gewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmFsaWRhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkVuZm9yY2UgdmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dNZXNzYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiJTaG93IHZhbGlkYXRpb24gbWVzc2FnZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiJEaXNhYmxlIHRoaXMgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGlzIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGVscGVycyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0YXJlYSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZpZWxkQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkF1dG8tZm9jdXMgZmlyc3QgY2hpbGQgZmllbGQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3BMZXZlbCgpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zRm9yT3B0aW9ucy5maWVsZHMuZm9ybSA9IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRob2QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvcHRpb25zRm9yT3B0aW9uczsKICAgICAgICB9CiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gUmVnaXN0ZXJzIGFkZGl0aW9uYWwgbWVzc2FnZXMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gYXJlIGRpc2FsbG93ZWQgdmFsdWVzLiIsCiAgICAgICAgIm5vdE9wdGlvbmFsIjogIlRoaXMgZmllbGQgaXMgbm90IG9wdGlvbmFsLiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250cm9sRmllbGQgPSBBbHBhY2EuRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udHJvbEZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHNpZ25hbCB0aGF0IHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25Db25zdHJ1Y3Q6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB0aGlzLmlzQ29udHJvbEZpZWxkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyBoZWxwZXIgbWV0aG9kIGZvciBnZXR0aW5nIHZhbCgpIGZyb20gdGhlIGNvbnRyb2wKICAgICAgICAgICAgICAgIC8vIGhhbmRsZXMgY29udmVyc2lvbiB0byB0aGUgY29ycmVjdCBzY2FsYXIgdHlwZQogICAgICAgICAgICAgICAgdGhpcy5fZ2V0Q29udHJvbFZhbCA9IGZ1bmN0aW9uKGVuc3VyZVByb3BlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICQodGhpcy5jb250cm9sKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVQcm9wZXJUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfdGhpcy5lbnN1cmVQcm9wZXJUeXBlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xUZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250cm9sVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2xUZW1wbGF0ZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250cm9sOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGNvbnRyb2xUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgICAgIC8vIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmVuZGVyQnV0dG9ucyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udmFsdWUgPSB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnN0eWxlcyA9IHRoaXMudmlldy5zdHlsZXMuYnV0dG9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZ2V0Q29udHJvbEVsOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICByZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICAgICAgdmFyIGZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udHJvbC0iICsgYi5nZXRGaWVsZFR5cGUoKSwgc2VsZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHlwZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uU2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewoKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGlzQXV0b0ZvY3VzYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRyb2wiIHRlbXBsYXRlIGFzIHRoZSBwcmltYXJ5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRyb2wiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFkZCBhICJjb250cm9sIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJGaWVsZEVsZW1lbnRzOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIG91ciBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sID0gJCh0aGlzLmZpZWxkKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVtb3ZlQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UUk9MX0ZJRUxEKTsKCiAgICAgICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgICAgIHNlbGYucHJlcGFyZUNvbnRyb2xNb2RlbChmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oY29udHJvbEZpZWxkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wucmVwbGFjZVdpdGgoY29udHJvbEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSBjb250cm9sRmllbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVFJPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250cm9sIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImNvbnRyb2wiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyUmVuZGVyQ29udHJvbChtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUHJlcGFyZXMgdGhlIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24obW9kZWwpCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IHt9OwogICAgICAgICAgICAgICAgbW9kZWwuaWQgPSB0aGlzLmdldElkKCk7CiAgICAgICAgICAgICAgICBtb2RlbC5uYW1lID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnNjaGVtYSA9IHRoaXMuc2NoZW1hOwogICAgICAgICAgICAgICAgbW9kZWwuZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgICAgICAgICAgIG1vZGVsLnJlcXVpcmVkID0gdGhpcy5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICBtb2RlbC52aWV3ID0gdGhpcy52aWV3OwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYmVmb3JlUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgcmVuZGVyZWQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZihzZWxmLmRhdGEpID09ICJ1bmRlZmluZWQiKSB8fCBzZWxmLmRhdGEgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBoYW5kbGUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdFVwZGF0ZU9ic2VydmFibGVGaXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtY29udHJvbC1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJidXR0b24tcHVzaGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBjbGljayBoYW5kbGVyPwogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEta2V5Iik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25Db25maWcgPSBzZWxmLm9wdGlvbnMuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oY29udHJvbCwgaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKGNvbnRyb2wsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFJlbmRlcnMgdGhlIGNvbnRyb2wgaW50byB0aGUgZmllbGQgY29udGFpbmVyLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNvbnRyb2wgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRyb2xEZXNjcmlwdG9yLCBtb2RlbCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soY29udHJvbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZSB0byB0aGUgbGFiZWwKICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRGl2ID0gJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCIpOwogICAgICAgICAgICAgICAgIHZhciBsYWJlbERpdiA9ICQoJy5hbHBhY2EtY29udHJvbGZpZWxkLWxhYmVsJywgdGhpcy5vdXRlckVsKTsKICAgICAgICAgICAgICAgICBpZiAobGFiZWxEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9IGxhYmVsRGl2OwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgdmFyIGhlbHBlckRpdiA9ICQoJy5hbHBhY2EtY29udHJvbGZpZWxkLWhlbHBlcicsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGhlbHBlckRpdi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICB0aGlzLmhlbHBlckRpdiA9IGhlbHBlckRpdjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSAibmFtZSIgcHJvcGVydHkgb24gdGhlIGNvbnRyb2wgaXMga2VwdCBpbiBzeW5jLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG5hbWUgZmllbGQKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5hdHRyKCJuYW1lIiwgdGhpcy5nZXROYW1lKCkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldERlZmF1bHQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldERlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGRlZmF1bHREYXRhID0gQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbJ2RlZmF1bHQnXSkgPyAiIiA6IHRoaXMuc2NoZW1hWydkZWZhdWx0J107CiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKGRlZmF1bHREYXRhKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5nZXRDb250cm9sVmFsdWUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGNvcnJlY3Rpb24gZm9yIHR5cGUKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lbnN1cmVQcm9wZXJUeXBlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIHZhbHVlLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBWYWxpZGF0ZSBhZ2FpbnN0IGVudW0gcHJvcGVydHkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBlbGVtZW50IHZhbHVlIGlzIHBhcnQgb2YgdGhlIGVudW0gbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0RW51bSgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCgpICYmIEFscGFjYS5pc1ZhbEVtcHR5KHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5nZXRFbnVtKCksIHZhbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRW51bSgpOwoKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdmFsdWVzIHByZXNlbnRlZCB0byB0aGUgdXNlciBpbiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZS4gSWYgdGhlcmUgYXJlIG9wdGlvbkxhYmVscywgdXNlIHRoZW0gaW4KICAgICAgICAgICAgICAgIC8vIHByZWZlcmVuY2UgdG8gdGhlIHJhdyBlbnVtIHZhbHVlcy4KICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVmFsdWVzID0gdGhpcy5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAvLyB1c2Ugb3B0aW9uIGxhYmVscyBpZiB0aG9zZSBhcmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTGFiZWxzID0gdGhpcy5nZXRPcHRpb25MYWJlbHMoKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMgJiYgb3B0aW9uTGFiZWxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVmFsdWVzID0gb3B0aW9uTGFiZWxzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRWYWx1ZU9mRW51bSJdID0gewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWRWYWx1ZU9mRW51bSIpLCBbbWVzc2FnZVZhbHVlcy5qb2luKCcsICcpLCB0aGlzLmdldFZhbHVlKCldKSwKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bImludmFsaWRWYWx1ZU9mRW51bSJdWyJzdGF0dXMiXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpbml0RXZlbnRzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW5pdENvbnRyb2xFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gdGhpcy5jb250cm9sOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2xpY2siLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgY29udHJvbCBsZXZlbCBoYW5kbGVycyBmb3IgdGhpbmdzIHRoYXQgaGFwcGVuIHRvIGlucHV0IGVsZW1lbnQKICAgICAgICAgICAgICAgIGNvbnRyb2wuY2hhbmdlKGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIHRvIHJ1biBBRlRFUiBjb250cm9sIGNsaWNrIGhhbmRsZXJzCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmZvY3VzKGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXNGb2N1c2VkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wuYmx1cihmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzQmx1cnJlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uQmx1ci5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXlwcmVzcyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5UHJlc3MuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXl1cChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYub25LZXlEb3duLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgcHJlc3MgZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciByZWZyZXNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gZWRpdCBtb2RlCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgJiYgc2VsZi52aWV3LnR5cGUgPT09ICdlZGl0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgY3VycmVudGx5IGludmFsaWQsIHRoZW4gd2UgcHJvdmlkZSBlYXJseSBmZWVkYmFjayB0byB0aGUgdXNlciBhcyB0byB3aGVuIHRoZXkgZW50ZXIKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmllbGQgd2FzIHZhbGlkLCB3ZSBkb24ndCByZW5kZXIgaW52YWxpZGF0aW9uIGZlZWRiYWNrIHVudGlsIHRoZXkgYmx1ciB0aGUgZmllbGQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHRoZSBjb250cm9sIHZhbGlkIHByZXZpb3VzbHk/CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnY3JlYXRlJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd2FzVmFsaWQgPSB0aGlzLmlzVmFsaWQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc1ZhbGlkICYmIHNlbGYud2FzQmx1cnJlZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGJlY2F1c2UgYXQgdGhpcyBleGFjdCBtb21lbnQsIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpcyBzdGlsbCB0aGUgb2xkIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgLy8galF1ZXJ5IHJhaXNlcyB0aGUga2V5cHJlc3MgZXZlbnQgYWhlYWQgb2YgdGhlIGlucHV0IHJlY2VpdmluZyB0aGUgbmV3IGRhdGEgd2hpY2ggd291bGQgaW5jb3Jwb3JhdGUKICAgICAgICAgICAgICAgICAgICAvLyB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGltZW91dCBwcm92aWRlcyB0aGUgYnJvd3NlciB3aXRoIGVub3VnaCB0aW1lIHRvIHBsdWcgdGhlIHZhbHVlIGludG8gdGhlIGlucHV0IGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aGUgdmFsaWRhdGlvbiBsb2dpYyB1c2VzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb250cm9sIGlzIG5vdyBpbiBhIHZhbGlkIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYSBrZXkgZG93biBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleWRvd24gZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHVwIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5dXAgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIYW5kbGVyIGZvciBjbGljayBldmVudC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgQ2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzRGlzYWJsZWQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gdGhlIGVudW0gdmFsdWUgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXRzIHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge2FycmF5fSBlbnVtQXJyYXkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldEVudW06IGZ1bmN0aW9uKGVudW1BcnJheSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLnNhZmVTZXRPYmplY3RBcnJheSh0aGlzLnNjaGVtYSwgImVudW0iLCBlbnVtQXJyYXkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gdGhlIG9wdGlvbiBsYWJlbHMgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1sib3B0aW9uTGFiZWxzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXRzIHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gb3B0aW9uTGFiZWxzQXJyYXkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNldE9wdGlvbkxhYmVsczogZnVuY3Rpb24ob3B0aW9uTGFiZWxzQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5vcHRpb25zLCAib3B0aW9uTGFiZWxzIiwgb3B0aW9uTGFiZWxzQXJyYXkpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFNvcnRzIHRoZSBnaXZlbiBlbnVtZXJhdGVkIHZhbHVlcyB1c2luZyB0aGUgbG9jYWwgc29ydFNlbGVjdGFibGVPcHRpb25zIG1ldGhvZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNvcnRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gdGhpcy5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyAmJiBlbnVtVmFsdWVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RhYmxlT3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudW1WYWx1ZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gZW51bVZhbHVlc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMgJiYgb3B0aW9uTGFiZWxzLmxlbmd0aCA+PSBpICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZU9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdGV4dAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRTZWxlY3RhYmxlT3B0aW9ucyhzZWxlY3RhYmxlT3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgIC8vIG5vdyBzZXQgYmFjawogICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbnVtVmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0YWJsZU9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnVtVmFsdWVzLnB1c2goc2VsZWN0YWJsZU9wdGlvbnNbaV0udmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG9wdGlvbkxhYmVscykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wdGlvbkxhYmVscy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVudW0obmV3RW51bVZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25MYWJlbHMobmV3T3B0aW9uTGFiZWxzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyBhIHNlbGVjdCBvcHRpb25zIGFycmF5IGJ5IG9yZGVyIG9mIGRpc3BsYXlhYmxlIHRleHQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIElmIHlvdSdyZSBsb29raW5nIHRvIHByb3ZpZGUgYSBjdXN0b20gc29ydCBvcmRlciwgeW91IG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25zLnNvcnQgZnVuY3Rpb24gLSBmbihhLCBiKS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdGFibGVPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0U2VsZWN0YWJsZU9wdGlvbnM6IGZ1bmN0aW9uKHNlbGVjdGFibGVPcHRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gaWYgc29ydCBpcyBmYWxzZSwganVzdCByZXR1cm4KICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBhIGRlZmF1bHQgc29ydCBmdW5jdGlvbgogICAgICAgICAgICAgICAgdmFyIHNvcnRGbiA9IEFscGFjYS5kZWZhdWx0U29ydDsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGUgYSBjdXN0b20gc29ydCBmdW5jdGlvbiwgdXNlIHRoYXQgaW5zdGVhZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc29ydCkgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZuID0gc2VsZi5vcHRpb25zLnNvcnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNvcnQgaXQKICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnNvcnQoc29ydEZuKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGEgZGF0YXNvdXJjZSBjb25maWd1cmVkIGZvciB0aGlzIGNvbnRyb2wuICBUaGUgcmVzdWx0cyBhcmUgd3JpdHRlbiBpbnRvIHRoZQogICAgICAgICAgICAgKiBnaXZlbiBhcnJheSBhbmQgdGhlIG9uRmluaXNoIG1ldGhvZCBpcyB0aGVuIGNhbGxlZCB3aXRoIChlcnIsIGFycmF5KS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICAgICAgICAqIEBwYXJhbSBvbkZpbmlzaAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW52b2tlRGF0YVNvdXJjZTogZnVuY3Rpb24oYXJyYXksIG1vZGVsLCBvbkZpbmlzaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkZpbmlzaChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlckxvYWREYXRhU291cmNlT3B0aW9ucyhhcnJheSwgbW9kZWwsIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkZpbmlzaChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBzb3J0aW5nIHRvIHdoYXRldmVyIHdlIHByb2R1Y2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoYXJyYXkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5pc2gobnVsbCwgYXJyYXkpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LmJpbmQoc2VsZik7CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1trXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1VyaShzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsZSA9IHNlbGYudmlldy5sb2NhbGU7CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAiIiArIHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICgodXJsLmluZGV4T2YoIj8iKSA9PT0gLTEpID8gIj8iIDogIiYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICJsb2NhbGU9IiArIGxvY2FsZTsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAianNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb25Eb2N1bWVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IGpzb25Eb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lciAmJiBBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHMgPSBzZWxmLm9wdGlvbnMuZHNUcmFuc2Zvcm1lcihkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG9iamVjdHMsIHdlIHdhbGsgdGhyb3VnaCBvbmUga2V5IGF0IGEgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zZXJ0aW9uIG9yZGVyIGlzIHRoZSBvcmRlciBvZiB0aGUga2V5cyBmcm9tIHRoZSBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcHJlc2VydmUgb3JkZXIsIGNvbnNpZGVyIHVzaW5nIGFuIGFycmF5IGFzIGJlbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChkcywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShkcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXJyYXlzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGluZGV4IGF0IGEgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zZXJ0aW9uIG9yZGVyIGlzIGRpY3RhdGVkIGJ5IHRoZSBvcmRlciBvZiB0aGUgaW5kaWNlcyBpbnRvIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHByZXNlcnZlcyBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2YWx1ZS50ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiJVbmFibGUgdG8gbG9hZCBkYXRhIGZyb20gdXJpIDogIiArIHNlbGYub3B0aW9ucy5kYXRhU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBU09VUkNFX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianFYSFIiIDoganFYSFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclRocm93biIgOiBlcnJvclRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRzID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGRzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogZHNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogZHNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZHNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3IgPSBzZWxmLmNvbm5lY3RvcjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29ubmVjdG9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RvcklkID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29ubmVjdG9yLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbm5lY3RvckNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQsIGNvbm5lY3RvckNvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB1c2luZyBjb25uZWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLmxvYWREYXRhU291cmNlKGNvbmZpZywgZnVuY3Rpb24odmFsdWVzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZXNbaV0pID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2YWx1ZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBzdGFuZGFyZCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZVtrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnM6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGFycmF5KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICAgICAsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2Ygc3BlY2lmaWMgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbUxhYmVsIjoiVmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIE5hbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInNvcnQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU29ydCBGdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmaW5lcyBhbiBmKGEsYikgc29ydCBmdW5jdGlvbiBmb3IgdGhlIGFycmF5IG9mIGVudW1lcmF0ZWQgdmFsdWVzIFt7dGV4dCwgdmFsdWV9XS4gIFRoaXMgaXMgdXNlZCB0byBzb3J0IGVudW0gYW5kIG9wdGlvbkxhYmVscyBhcyB3ZWxsIGFzIHJlc3VsdHMgdGhhdCBjb21lIGJhY2sgZnJvbSBhbnkgZGF0YSBzb3VyY2VzIChmb3Igc2VsZWN0IGFuZCByYWRpbyBjb250cm9scykuICBCeSBkZWZhdWx0IHRoZSBpdGVtcyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiAgIERvbid0IGFwcGx5IGFueSBzb3J0aW5nIGlmIGZhbHNlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGluIHswfS4gIEN1cnJlbnQgdmFsdWUgaXM6IHsxfSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbnRhaW5lckZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Db250YWluZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHNpZ25hbCB0aGF0IHRoaXMgZmllbGQgaXMgYSBjb250YWluZXIgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgb25Db25zdHJ1Y3Q6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuaXNDb250YWluZXJGaWVsZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaXNDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBpc0NvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0Q29udGFpbmVyRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgY29udGFpbmVyIGZpZWxkcywgd2UgdXNlIHRoZSAiY29udGFpbmVyIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRlbXBsYXRlRGVzY3JpcHRvcklkCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCA6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImNvbnRhaW5lciI7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB3YWxrIHRoZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgZmluZCBhIHRlbXBsYXRlIHR5cGUKCiAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciBiID0gdGhpczsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFiLmdldEZpZWxkVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGIuZ2V0RmllbGRUeXBlKCksIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBiID0gYi5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHlwZTsKICAgICAgICB9LAoKICAgICAgICByZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBmaWVsZCB0eXBlIGFuZCB0aGVuIGNoZWNrIHRoZSB2aWV3IHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIGZvciB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB3YWxrIHRoZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgZmluZCBhIHRlbXBsYXRlIHR5cGUKCiAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciBiID0gdGhpczsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFiLmdldEZpZWxkVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGIuZ2V0RmllbGRUeXBlKCkgKyAiLWl0ZW0iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVyVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udGFpbmVyVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVyVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lcjogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lclRlbXBsYXRlVHlwZSwgc2VsZik7CgogICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGZhbHNlCiAgICAgICAgICAgIHZhciBjb2xsYXBzaWJsZSA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcuY29sbGFwc2libGUpKSB7CiAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZSA9IHRoaXMudmlldy5jb2xsYXBzaWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMuY29sbGFwc2libGUpKSB7CiAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZSA9IHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlID0gY29sbGFwc2libGU7CgogICAgICAgICAgICB2YXIgbGVnZW5kU3R5bGUgPSAiYnV0dG9uIjsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmxlZ2VuZFN0eWxlKSkgewogICAgICAgICAgICAgICAgbGVnZW5kU3R5bGUgPSB0aGlzLnZpZXcubGVnZW5kU3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlKSkgewogICAgICAgICAgICAgICAgbGVnZW5kU3R5bGUgPSB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSA9IGxlZ2VuZFN0eWxlOwoKICAgICAgICAgICAgLy9MYXp5IGxvYWRpbmcKICAgICAgICAgICAgdGhpcy5sYXp5TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZykpIHsKICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSB0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmc7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZGluZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9kZWxldGUgdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGhvbGRlcnMgb2YgcmVmZXJlbmNlcyB0byBjaGlsZHJlbgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107CiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeUlkID0ge307CiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250YWluZXIgaXMgRE9NLXdyYXBwZWQgd2l0aCBhIGZvcm0sIHRoZW4gcmVsZWFzZSB0aGUgZm9ybQogICAgICAgICAgICBpZiAodGhpcy5mb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZGVzdHJveSh0cnVlKTsgLy8gcGFzcyBpbiB0cnVlIHNvIHRoYXQgd2UgZG9uJ3QgY2FsbCBiYWNrIHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5mb3JtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZXN0cm95IGFueSBjaGlsZCBjb250cm9scwogICAgICAgICAgICBBbHBhY2EuZWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZCBhICJjb250YWluZXIiIGRvbSBlbGVtZW50IGluc2lkZSBvZiB0aGUgZmllbGQgd2hpY2ggaG91c2VzIG91ciBjdXN0b20gY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjcmVuZGVyRmllbGQKICAgICAgICAgKi8KICAgICAgICByZW5kZXJGaWVsZEVsZW1lbnRzOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEKTsKCiAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICBzZWxmLnByZXBhcmVDb250YWluZXJNb2RlbChmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgICAgICAgc2VsZi5iZWZvcmVSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbihjb250YWluZXJGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5yZXBsYWNlV2l0aChjb250YWluZXJGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciA9IGNvbnRhaW5lckZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKEFscGFjYS5DTEFTU19DT05UQUlORVIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSBmb3JtIGZpZWxkIHdpdGggImFscGFjYS1ob3Jpem9udGFsIiBvciAiYWxwYWNhLXZlcnRpY2FsIgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3Lmhvcml6b250YWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtaG9yaXpvbnRhbCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIuYWRkQ2xhc3MoImFscGFjYS12ZXJ0aWNhbCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImNvbnRhaW5lciIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImNvbnRhaW5lciIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAqLwogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbW9kZWwgPSB7CiAgICAgICAgICAgICAgICAiaWQiOiB0aGlzLmdldElkKCksCiAgICAgICAgICAgICAgICAibmFtZSI6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgICJzY2hlbWEiOiB0aGlzLnNjaGVtYSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGxvYWQgaXRlbXMgaW50byBhcnJheSBhbmQgc3RvcmUgb24gbW9kZWwgZm9yIGZ1dHVyZSB1c2UKICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtcyhmdW5jdGlvbihpdGVtcykgewoKICAgICAgICAgICAgICAgIGlmICghaXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogYXNzdW1lIGNvbnRhaW5lckl0ZW1FbCA9IGZpZWxkRWwKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtc1tpXS5jb250YWluZXJJdGVtRWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uY29udGFpbmVySXRlbUVsID0gaXRlbXNbaV0uZ2V0RmllbGRFbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5pdGVtcyA9IGl0ZW1zOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250YWluZXIgaW50byB0aGUgZmllbGQgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IEFscGFjYS50bXBsKHRoaXMuY29udGFpbmVyRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWxsYmFjayhjb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhZnRlciB0aGUgY29udGFpbmVyIGlzIHJlbmRlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmVmb3JlQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgc2VsZi5hcHBseUNyZWF0ZWRJdGVtcyhtb2RlbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtcyhtb2RlbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5jb2xsYXBzaWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb2xsYXBzaWJsZSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbnkgc3ViLWl0ZW1zIGZvciB0aGlzIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb25fcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYmVmb3JlQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBsYXlvdXRCaW5kaW5ncyA9IG51bGw7CiAgICAgICAgICAgIGlmIChzZWxmLmlzVG9wTGV2ZWwoKSAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzID0gc2VsZi52aWV3LmdldExheW91dCgpLmJpbmRpbmdzOwoKICAgICAgICAgICAgICAgIC8vIGlmIGxheW91dCBhbmQgYmluZGluZ3Mgbm90IHByb3ZpZGVkLCBhc3N1bWUgYSBkZWZhdWx0IHN0cmF0ZWd5CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzICYmIHNlbGYudmlldy5nZXRMYXlvdXQoKS50ZW1wbGF0ZURlc2NyaXB0b3IgJiYgbW9kZWwuaXRlbXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBtb2RlbC5pdGVtc1tpXS5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3NbbmFtZV0gPSAiW2RhdGEtYWxwYWNhLWxheW91dC1iaW5kaW5nPSciICsgbmFtZSArICInXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBtb2RlbC5pdGVtcy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5yZW1vdmVBdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50ID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIlsiICsgQWxwYWNhLk1BUktFUl9EQVRBX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0tFWSArICI9JyIgKyBpdGVtLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmICghbGF5b3V0QmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGRlciA9ICQoaW5zZXJ0aW9uUG9pbnQpLnBhcmVudCgpOwoKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZXBsYWNlV2l0aChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGRvbUVsIHRvIGFsbG93IGZvciByZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9IGhvbGRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYSBsYXlvdXQKICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0lkID0gbGF5b3V0QmluZGluZ3NbaXRlbS5uYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0lkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGRlciA9ICQoYmluZGluZ0lkLCBzZWxmLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvbGRlci5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQsIGZhbGxiYWNrIHRvIElEIGJhc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlciA9ICQoJyMnICsgYmluZGluZ0lkLCBzZWxmLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgd3JhcHBlciAod2hpY2ggd2lsbCBzZXJ2ZSBhcyB0aGUgZG9tRWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbS5kb21FbCkuYWRkQ2xhc3MoImFscGFjYS1sYXlvdXQtYmluZGluZy1ob2xkZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbS5kb21FbCkuYXR0cigiYWxwYWNhLWxheW91dC1iaW5kaW5nLWZpZWxkLW5hbWUiLCBpdGVtLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmFwcGVuZChpdGVtLmRvbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwuYXBwZW5kKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0iKTsKCiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBtb2RlbC5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiLCBpKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBpdGVtLm5hbWUpOwogICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkIiwgc2VsZi5nZXRJZCgpKTsKCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5jb2xsYXBzaWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb2xsYXBzaWJsZSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb2xsYXBzaWJsZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtczogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCBjaGlsZCBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbnRyb2x9IGNoaWxkIENoaWxkIGZpZWxkIHRvIGJlIGFkZGVkLgogICAgICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggSW5kZXggb2YgdGhlIG5ldyBjaGlsZC4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckNoaWxkOiBmdW5jdGlvbihjaGlsZCwgaW5kZXgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGluZGV4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkLmdldElkKCldID0gY2hpbGQ7CiAgICAgICAgICAgIGlmIChjaGlsZC5wcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdID0gY2hpbGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaW5kZXgKICAgICAgICAgKi8KICAgICAgICB1bnJlZ2lzdGVyQ2hpbGQ6IGZ1bmN0aW9uKGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpbmRleF07CiAgICAgICAgICAgIGlmICghY2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkLmdldElkKCldOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbY2hpbGQucHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIsIHNlbGYuY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5yZW1vdmVBdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1jb3VudCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgLy8gc2V0IHBhdGggaWYgbm90IHNldAogICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpICsgIl0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgY2hpbGQucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2hpbGQuY2FsY3VsYXRlTmFtZSgpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0Iik7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0ta2V5Iik7CgogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0iKTsKCiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZSIsIGNoaWxkLm5hbWUpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDaGlsZERPTVdyYXBwZXJFbGVtZW50KGksIGNoaWxkKTsKCiAgICAgICAgICAgICAgICBjaGlsZC51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFWFRFTlNJT04gUE9JTlQgdGhhdCBhbGxvd3MgY29udGFpbmVycyB0byB1cGRhdGUgYW55IGN1c3RvbSB3cmFwcGVyIGVsZW1lbnRzIGZvciBjaGlsZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpCiAgICAgICAgICogQHBhcmFtIGNoaWxkCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudDogZnVuY3Rpb24oaSwgY2hpbGQpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGlzIGR5bmFtaWNhbGx5IGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBhIGNvbnRhaW5lci4gIFRoaXMgYWxsb3dzIGFsbCBvZiB0aGUKICAgICAgICAgKiBjb250YWluZXIgbWFya2VycyB0byByZWZyZXNoIG9uIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2g6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmdldFBhcmVudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZSBkb20gbWFya2VycyBmb3IgcGFyZW50IHdoaWNoIHdpbGwgdHJpY2tsZSBkb3duIHRvIHRvIGNvdmVyIHRoaXMgZmllbGQgYW5kIG91ciBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5nZXRQYXJlbnQoKS51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBqdXN0IG91cnNlbHZlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVET01FbGVtZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIHNpZ25hbCBkb3duIHRvIGFsbCBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIHNpZ25hbCBkb3duIHRvIGFsbCBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudENvbmNlYWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzIGFuIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4gIEZpbmQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBvciBpZiBubyBpbnZhbGlkIGVsZW1lbnRzLCBwaWNrCiAgICAgICAgICogdGhlIGZpcnN0IGNoaWxkLiAgSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIGlzIGZpcmVkIGFuZCBwYXNzZWQgdGhlIGNvbnRyb2wgZWxlbWVudAogICAgICAgICAqIHRoYXQgcmVjZWl2ZWQgdGhlIGZvY3VzLgogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW52YWxpZEluZGV4ID0gLTE7CgogICAgICAgICAgICAvLyB1c2UgdGhlIGRvbSB0byBjcmVhdGUgYW4gYXJyYXkgdGhhdCBvcmRlcnMgdGhpbmdzIGFzIHRoZXkgYXJlIGxhaWQgb3V0IG9uIHRoZSBwYWdlCiAgICAgICAgICAgIHZhciBwYWdlT3JkZXJlZENoaWxkcmVuID0gW107CiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0Q29udGFpbmVyRWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkgewogICAgICAgICAgICAgICAgZWwgPSB0aGlzLmZvcm0uZ2V0Rm9ybUVsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyB0aGlzLmdldElkKCkgKyAiJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkSW5kZXggPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4Iik7CiAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuLnB1c2goc2VsZi5jaGlsZHJlbltjaGlsZEluZGV4XSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gd2FsayB0aGUgb3JkZXJlZCBjaGlsZHJlbiBhbmQgZmluZCBmaXJzdCBpbnZhbGlkCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWdlT3JkZXJlZENoaWxkcmVuW2ldLmlzVmFsaWQodHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0NvbnRyb2xGaWVsZCAmJgogICAgICAgICAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuW2ldLmlzQXV0b0ZvY3VzYWJsZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlT3JkZXJlZENoaWxkcmVuW2ldLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGludmFsaWQsIGp1c3QgZm9jdXMgb24gZmlyc3QgaXRlbQogICAgICAgICAgICBpZiAoaW52YWxpZEluZGV4ID09PSAtMSAmJiBwYWdlT3JkZXJlZENoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludmFsaWRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIHRoZSBmb2N1cyBpZiB3ZSBmb3VuZCBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYWdlT3JkZXJlZENoaWxkcmVuW2ludmFsaWRJbmRleF0uZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhwYWdlT3JkZXJlZENoaWxkcmVuW2ludmFsaWRJbmRleF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0uZGlzYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmVuYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IHZhbHVlIEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldENvbnRhaW5lclZhbHVlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAiICAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludAogICAgICAgICAqLwogICAgICAgIGdldENvbnRhaW5lclZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBmaXJzdENoaWxkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5jaGlsZHJlblswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0sCgogICAgICAgIGxhc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJsYXp5TG9hZGluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhenkgTG9hZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDaGlsZCBmaWVsZHMgd2lsbCBvbmx5IGJlIHJlbmRlcmVkIHdoZW4gdGhlIGZpZWxkc2V0IGlzIGV4cGFuZGVkIGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2libGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzaWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBzZXQgaXMgY29sbGFwc2libGUgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbGxhcHNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBzZXQgaXMgaW5pdGlhbGx5IGNvbGxhcHNlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMZWdlbmQgU3R5bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGxlZ2VuZCBzdHlsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJidXR0b24iLCJsaW5rIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImJ1dHRvbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbmltYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQW5pbWF0ZSBtb3ZlbWVudHMgYW5kIHRyYW5zaXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVwIGFuZCBkb3duIHRyYW5zaXRpb25zIHdpbGwgYmUgYW5pbWF0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJsYXp5TG9hZGluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiTGF6eSBsb2FkaW5nIGNoaWxkIGZpZWxkcyA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJMYXp5IGxvYWRpbmcgd2lsbCBiZSBlbmFibGVkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2libGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkZpZWxkIHNldCBjb2xsYXBzaWJsZSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBzZXQgaXMgY29sbGFwc2libGUgaWYgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkZpZWxkIHNldCBpbml0aWFsbHkgY29sbGFwc2VkID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgY2hlY2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsZWdlbmRTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiQW5pbWF0ZSBtb3ZlbWVudHMgYW5kIHRyYW5zaXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZvcm0gPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Gb3JtLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBUaGlzIGNsYXNzIGlzIGZvciBtYW5hZ2luZyBIVE1MIGZvcm0gY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21FbCBGaWVsZCBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oZG9tRWwsIG9wdGlvbnMsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICAvLyBjb250YWluZXIKICAgICAgICAgICAgdGhpcy5kb21FbCA9IGRvbUVsOwoKICAgICAgICAgICAgLy8gcGFyZW50CiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKCiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOwogICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrOwoKICAgICAgICAgICAgLy8gb3B0aW9ucwogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC50eXBlID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0Lm5hbWUgPSAnc3VibWl0JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnZhbHVlID0gJ1N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlID0gJ3Jlc2V0JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC5uYW1lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC52YWx1ZSA9ICdSZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNvbWUgZ2VuZXJhbCBjb3JyZWN0aW9uCiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50aXRsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmF0dHJpYnV0ZXMuaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzdWJtaXQgYnV0dG9uIHNwZWNpZmllZCwgYW5kIHRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUgaXNuJ3QgZGVmaW5lZCwgc2V0IHRvIHRydWUgYnkgZGVmYXVsdAogICAgICAgICAgICAvLyBkb24ndCBhbGxvdyB0aGUgZm9ybSB0byBzdWJtaXQgdW5sZXNzIHZhbGlkCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9ucyAmJiB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQgJiYgQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnZpZXdUeXBlID0gb3B0aW9ucy52aWV3VHlwZTsKCiAgICAgICAgICAgIC8vIHNldCBhIHJ1bnRpbWUgdmlldwogICAgICAgICAgICB0aGlzLnZpZXcgPSBuZXcgQWxwYWNhLlJ1bnRpbWVWaWV3KHZpZXdJZCwgdGhpcyk7CgogICAgICAgICAgICAvLyBmb3IgZWFjaCBidXR0b24sIG1ha2Ugc3VyZSB0aGF0IGNsYXNzZXMgaXMgc2V0IG1pbmltYWxseSB0byB2aWV3LnN0eWxlcy5idXR0b24KICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZm9ybSBpbnRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBhbmQgcmVuZGVyIGl0CiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlbmRlcih0aGlzLmRvbUVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBiaW5kIG91ciBmaWVsZCBkb20gZWxlbWVudCBpbnRvIHRoZSBkb21FbAogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgIC8vIGFkZCBkZWZhdWx0IGNsYXNzCiAgICAgICAgICAgICAgICBzZWxmLmZvcm0uYWRkQ2xhc3MoImFscGFjYS1mb3JtIik7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmb3JtIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImZvcm0iKTsKCiAgICAgICAgICAgICAgICAvLyBleGVjdXRlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJJbml0aWFsaXplOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpIHsKCiAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgc3VibWl0IGJ1dHRvbiBzdGF0ZQogICAgICAgICAgICAgICAgc2VsZi5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRvcCBjb250cm9sIGlzIGVudGlyZWx5IHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBpc0Zvcm1WYWxpZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gcmUtY29tcHV0ZSB2YWxpZGF0aW9uIGZvciB0aGUgZnVsbCBjb250cm9sIHNldAogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wudmFsaWRhdGUodHJ1ZSk7CgogICAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnRvcENvbnRyb2wuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgLy90aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNGb3JtVmFsaWQoKTsKICAgICAgICB9LAoKICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24oY2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKGNoaWxkcmVuKTsKICAgICAgICB9LAoKICAgICAgICBlbmFibGVTdWJtaXRCdXR0b246IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYXR0clByb3AoImRpc2FibGVkIiwgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGVTdWJtaXRCdXR0b246IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYXR0clByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICBpZiAoJC5tb2JpbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyeSB7ICQoIi5hbHBhY2EtZm9ybS1idXR0b24tc3VibWl0IikuYnV0dG9uKCdyZWZyZXNoJyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWRqdXN0U3VibWl0QnV0dG9uU3RhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVN1Ym1pdEJ1dHRvbigpOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNGb3JtVmFsaWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVTdWJtaXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlc3BvbnNpYmxlIGZvciBmZXRjaGluZyBhbnkgdGVtcGxhdGVzIG5lZWRlZCBzbyBhcyB0byByZW5kZXIgdGhlCiAgICAgICAgICogY3VycmVudCBtb2RlIGZvciB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogT25jZSBjb21wbGV0ZWQsIHRoZSBvblN1Y2Nlc3MgbWV0aG9kIGlzIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRFbCBGaWVsZCBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBwcm9jZXNzUmVuZGVyOiBmdW5jdGlvbihwYXJlbnRFbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBsb29rdXAgdGhlIHRlbXBsYXRlIHdlIHNob3VsZCB1c2UgdG8gcmVuZGVyCiAgICAgICAgICAgIHRoaXMuZm9ybURlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJmb3JtIik7CiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDb3VsZCBub3QgZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yOiBmb3JtIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZW5kZXJlZERvbUVsZW1lbnQgPSBBbHBhY2EudG1wbCh0aGlzLmZvcm1EZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICBpZDogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgdGhpcy5mb3JtID0gcmVuZGVyZWREb21FbGVtZW50OwoKICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFya2VkIGJ5IHRoZSBoYW5kbGViYXJzIGhlbHBlcgogICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHNDb250YWluZXIgPSAkKHRoaXMuZm9ybSkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQpOwogICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHNDb250YWluZXIucmVtb3ZlQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmZvcm0uYXR0cigiaWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItZm9ybS1vdXRlciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmZvcm0uYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiLCB0aGlzLmdldElkKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgZm9ybSBmaWVsZAogICAgICAgICAgICAkKHBhcmVudEVsKS5maW5kKCJmb3JtIikuYXR0cih0aGlzLmF0dHJpYnV0ZXMpOwoKICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGJ1dHRvbnMgYXMgd2VsbAogICAgICAgICAgICB0aGlzLmJ1dHRvbnMgPSB7fTsKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJidXR0b24tcHVzaGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEta2V5Iik7CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25Db25maWcgPSBzZWxmLm9wdGlvbnMuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChidXR0b25Db25maWcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGZvcm0sIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChmb3JtLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIGJ1dHRvbkNvbmZpZy5jbGljaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGb3JtIGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZm9ybSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGlzIGZvcm0ncyBwYXJlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3JtIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgSlNPTiByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSBWYWx1ZSBvZiB0aGUgSlNPTiByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcENvbnRyb2wuZ2V0VmFsdWUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSlNPTiB0byBiZSByZW5kZXJlZCBieSB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0LgogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgZXZlbnRzIGhhbmRsaW5nIChGb3JtIFN1Ym1pc3Npb24pIGZvciB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmb3JtVGFnID0gJCh0aGlzLmRvbUVsKS5maW5kKCJmb3JtIik7CgogICAgICAgICAgICB2YXIgdiA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgJChmb3JtVGFnKS5zdWJtaXQodiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uU3VibWl0KGUsIF90aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGZpZWxkdXBkYXRlcyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvcm0gaXMgdmFsaWQuCiAgICAgICAgICAgIC8vIGlmIHNvLCBlbmFibGUgdGhlIHN1Ym1pdCBidXR0b24uLi4KICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBkaXNhYmxlIGl0CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGR1cGRhdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRrZXl1cCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkKF90aGlzLnRvcENvbnRyb2wuZ2V0RmllbGRFbCgpKS5iaW5kKCJmaWVsZGJsdXIiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0QnV0dG9uRWw6IGZ1bmN0aW9uKGJ1dHRvbklkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICQodGhpcy5kb21FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbi0iICsgYnV0dG9uSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgZm9ybSBzdWJtaXQgZXZlbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgU3VibWl0IGV2ZW50LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmb3JtIHRoZSBmb3JtCiAgICAgICAgICovCiAgICAgICAgb25TdWJtaXQ6IGZ1bmN0aW9uKGUsIGZvcm0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5zdWJtaXRIYW5kbGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5zdWJtaXRIYW5kbGVyKGUsIGZvcm0pOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh2KSkgewogICAgICAgICAgICAgICAgICAgIHYgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBzdWJtaXQgaGFuZGxlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmdW5jIFN1Ym1pdCBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJTdWJtaXRIYW5kbGVyOiBmdW5jdGlvbiAoZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRIYW5kbGVyID0gZnVuYzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc3BsYXlzIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gb2YgYWxsIGZpZWxkcyBvZiB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNoaWxkcmVuIHdoZXRoZXIgdG8gcmVuZGVyIHZhbGlkYXRpb24gc3RhdGUgZm9yIGNoaWxkIGZpZWxkcwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSB2YWxpZGF0aW9uIHN0YXRlLgogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKGNoaWxkcmVuLCBjYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGlzYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5kaXNhYmxlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRW5hYmxlcyB0aGlzIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZW5hYmxlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyBvbiB0aGlzIGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGZvY3VzZWQgY29udHJvbC4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmZvY3VzKGZ1bmN0aW9uKGNvbnRyb2xXaXRoRm9jdXMpIHsKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKGNvbnRyb2xXaXRoRm9jdXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQdXJnZSBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhlIGZvcm0gZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBza2lwUGFyZW50IHdoZW4gdHJ1ZSwgdGhlIGZvcm0gY2xlYW5zIHVwIHdpdGhvdXQgdHJhdmVyc2luZyB0aHJvdWdoIHBhcmVudCBjaGlsZCBjb250cm9scwogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKHNraXBQYXJlbnQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldEZvcm1FbCgpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gd2UgYWxsb3cgZm9ybS5kZXN0cm95KCkgd2hpY2ggdGVsbHMgcGFyZW50IGNvbnRyb2wgdG8gZGVzdHJveQogICAgICAgICAgICAvLyBpZiBza2lwUGFyZW50ID09IHRydWUsIHRoZW4gd2UgZG8gbm90IGNhbGwgdXAgKGludm9rZWQgZnJvbSBjb250YWluZXIpCiAgICAgICAgICAgIGlmICghc2tpcFBhcmVudCAmJiB0aGlzLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgc2hvdzogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBoaWRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldEZvcm1FbCgpLmNzcyh7CiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICJub25lIgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIGZvcm0gYW5kIHJlc2V0cyB2YWx1ZXMgb2YgaXRzIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzdG9wVXBkYXRlVHJpZ2dlciBJZiBmYWxzZSwgdHJpZ2dlcnMgdGhlIHVwZGF0ZSBldmVudCBvZiB0aGlzIGV2ZW50LgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbihzdG9wVXBkYXRlVHJpZ2dlcikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5jbGVhcihzdG9wVXBkYXRlVHJpZ2dlcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGZvcm0gaXMgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9ybSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcENvbnRyb2wuaXNFbXB0eSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZm9ybS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqIEBwYXJhbSBhcmcxCiAgICAgICAgICogQHBhcmFtIGFyZzIKICAgICAgICAgKiBAcGFyYW0gYXJnMwogICAgICAgICAqIEBwYXJhbSBhcmc0CiAgICAgICAgICogQHBhcmFtIGFyZzUKICAgICAgICAgKi8KICAgICAgICBmaXJlQ2FsbGJhY2s6IGZ1bmN0aW9uKGlkLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy52aWV3LmZpcmVDYWxsYmFjayh0aGlzLCBpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBmb3JtIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVuZGVyZWQgRE9NIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0Rm9ybUVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyBhIHJlZ3VsYXIgb2xkIHN1Ym1pdC4KICAgICAgICAgKi8KICAgICAgICBzdWJtaXQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZm9ybS5zdWJtaXQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyB0aGUgc3VibWl0IGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBoYW5kcyBiYWNrIHRoZSBqUXVlcnkgcHJvbWlzZS4KICAgICAgICAgKgogICAgICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBjYW4gYmUgcGFzc2VkIGluIHRvIGNvbnRyb2wgdGhlIHVuZGVybHlpbmcgalF1ZXJ5IGFqYXggWEhSLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgYWpheFN1Ym1pdDogZnVuY3Rpb24oY29uZmlnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25maWcudXJsID0gc2VsZi5vcHRpb25zLmF0dHJpYnV0ZXMuYWN0aW9uOwogICAgICAgICAgICBjb25maWcudHlwZSA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLm1ldGhvZDsKCiAgICAgICAgICAgIGlmICghY29uZmlnLmRhdGEpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhVHlwZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmRhdGFUeXBlID0gImpzb24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29uZmlnLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5oZWFkZXJzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgQ1NSRiBoZXJlCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVyc1tBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRV0gPSBjc3JmVG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkLmFqYXgoY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICBkZXRlcm1pbmVDc3JmVG9rZW46IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgZGlyZWN0IHRva2VuIHNwZWNpZmllZD8KICAgICAgICAgICAgdmFyIGNzcmZUb2tlbiA9IEFscGFjYS5DU1JGX1RPS0VOOwogICAgICAgICAgICBpZiAoIWNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBjb29raWUgdGhhdCB3ZSBjYW4gcHVsbCB0aGUgdmFsdWUgZnJvbT8KICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgQWxwYWNhLkNTUkZfQ09PS0lFX05BTUVTLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVOYW1lID0gQWxwYWNhLkNTUkZfQ09PS0lFX05BTUVTW3RdOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llVmFsdWUgPSBBbHBhY2EucmVhZENvb2tpZShjb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjc3JmVG9rZW4gPSBjb29raWVWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY3NyZlRva2VuOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTWVtb3J5Q2FjaGUgPSBmdW5jdGlvbihjb25maWcpCiAgICB7CiAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgfQoKICAgICAgICB2YXIgY2FjaGUgPSB7fTsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGssIHYsIHR0bCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKHYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZVtrXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdjogdgogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghdHRsICYmIGNvbmZpZy50dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHRsID0gY29uZmlnLnR0bDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVba10uZXhwaXJlcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgdHRsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yICJjbGVhciIgbWV0aG9kIC0gcmVtb3ZlcyBldmVyeXRoaW5nIGZyb20gY2FjaGUKICAgICAgICAgICAgaWYgKGsgPT0gImNsZWFyIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHphID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciB6IGluIGNhY2hlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHphLnB1c2goeik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHphLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVt6YVtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkID0gY2FjaGVba107CiAgICAgICAgICAgIGlmICghZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICBpZiAoZC5leHBpcmVzICYmIGQuZXhwaXJlcyA8IG5vdykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGQudjsKICAgICAgICB9OwogICAgfTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSgibWVtb3J5IiwgQWxwYWNhLk1lbW9yeUNhY2hlKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTnVsbENhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm51bGwiLCBBbHBhY2EuTnVsbENhY2hlKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29ubmVjdG9yID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIHJlbW90ZSBkYXRhIHN0b3Jlcy4KCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIENvbm5lY3RvciBJRAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgQ29ubmVjdG9yIENvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihpZCwgY29uZmlnKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFjb25maWcpIHsKICAgICAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIHJlc291cmNlIGlzIGEgdXJpCiAgICAgICAgICAgIHRoaXMuaXNVcmkgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNFbXB0eShyZXNvdXJjZSkgJiYgQWxwYWNhLmlzVXJpKHJlc291cmNlKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVsbCIsCiAgICAgICAgICAgICAgICAgICAgImNvbmZpZyI6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlLnR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS50eXBlID0gIm51bGwiOwogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlLmNvbmZpZyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNhY2hlID0gQWxwYWNhLmdldENhY2hlKGNvbmZpZy5jYWNoZS50eXBlKShjb25maWcuY2FjaGUuY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIGRhdGEgc291cmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIG9uU3VjY2VzcygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgdGVtcGxhdGUgKEhUTUwgb3IgVGV4dCkuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgc291cmNlIGlzIGEgVVJJLCB0aGVuIGl0IGlzIGxvYWRlZC4KICAgICAgICAgKiBJZiBpdCBpcyBub3QgYSBVUkksIHRoZW4gdGhlIHNvdXJjZSBpcyBzaW1wbHkgaGFuZGVkIGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNvdXJjZSBTb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRUZW1wbGF0ZTogZnVuY3Rpb24gKHNvdXJjZSwgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzb3VyY2UpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVXJpKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uKGxvYWRlZERhdGEpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvblN1Y2Nlc3MgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25TdWNjZXNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGxvYWRlZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChsb2FkRXJyb3IpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGxvYWRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3Moc291cmNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRXJyb3IoewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiRW1wdHkgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogIlRFTVBMQVRFX0xPQURJTkdfRVJST1IiCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiBzY2hlbWEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkVmlldzogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHNjaGVtYSwgZm9ybSwgdmlldyBhbmQgZGF0YSBpbiBhIHNpbmdsZSBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkQWxsOiBmdW5jdGlvbiAocmVzb3VyY2VzLCBvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgb25Db25uZWN0U3VjY2VzcyA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBkYXRhU291cmNlID0gcmVzb3VyY2VzLmRhdGFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hU291cmNlID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zU291cmNlID0gcmVzb3VyY2VzLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgdmlld1NvdXJjZSA9IHJlc291cmNlcy52aWV3U291cmNlOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJzY2hlbWEiIHRvIGNvbnRhaW4gYSBVUkkgYXMgd2VsbCAoYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpCiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYVNvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnNjaGVtYSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYWxsb3cgIm9wdGlvbnMiIHRvIGNvbnRhaW4gYSBVUkkgYXMgd2VsbCAoYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5vcHRpb25zKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJ2aWV3IiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCF2aWV3U291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMudmlldykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlldzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgbG9hZGVkID0ge307CgogICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIHZhciBpbnZvY2F0aW9uQ291bnQgPSAwOwoKICAgICAgICAgICAgICAgIHZhciBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudGVyID09PSBpbnZvY2F0aW9uQ291bnQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWQuZGF0YSwgbG9hZGVkLm9wdGlvbnMsIGxvYWRlZC5zY2hlbWEsIGxvYWRlZC52aWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIGVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbiAobG9hZEVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY291bnQgb3V0IHRoZSB0b3RhbCAjIG9mIGludm9rZXMgd2UncmUgZ29pbmcgdG8gZmlyZSBvZmYKICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpZXdTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaW52b2NhdGlvbkNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gaW52b2tlLCBzbyBqdXN0IGhhbmQgYmFjawogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9NZXJnZSA9IGZ1bmN0aW9uKHAsIHYxLCB2MikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHYyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YobG9hZGVkW3BdKSA9PT0gIm9iamVjdCIpICYmICh0eXBlb2YodjIpID09PSAib2JqZWN0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChsb2FkZWRbcF0sIHYyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZFtwXSA9IHYyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBmaXJlIG9mZiBhbGwgb2YgdGhlIGludm9rZXMKICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZERhdGEoZGF0YVNvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJkYXRhIiwgcmVzb3VyY2VzLmRhdGEsIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFNjaGVtYShzY2hlbWFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJzY2hlbWEiLCByZXNvdXJjZXMuc2NoZW1hLCBzY2hlbWEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRPcHRpb25zKG9wdGlvbnNTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24ob3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgib3B0aW9ucyIsIHJlc291cmNlcy5vcHRpb25zLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZpZXdTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkVmlldyh2aWV3U291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHZpZXcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoInZpZXciLCByZXNvdXJjZXMudmlldywgdmlldyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgb25Db25uZWN0RXJyb3IgID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkgewogICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlbGYuY29ubmVjdChvbkNvbm5lY3RTdWNjZXNzLCBvbkNvbm5lY3RFcnJvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgYSBKU09OIHRocm91Z2ggQWpheCBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVyaSBsb2NhdGlvbiBvZiB0aGUganNvbiBkb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRKc29uIDogZnVuY3Rpb24odXJpLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5sb2FkVXJpKHVyaSwgdHJ1ZSwgb25TdWNjZXNzLCBvbkVycm9yKTsKICAgICAgICB9ICwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50LiAgU2V0IHVwIGRlZmF1bHQgYWpheCBjb25maWd1cmF0aW9uIGZvciBVUkwgcmV0cmlldmFsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHVyaQogICAgICAgICAqIEBwYXJhbSBpc0pzb24KICAgICAgICAgKiBAcmV0dXJucyB7e3VybDogKiwgdHlwZTogc3RyaW5nfX0KICAgICAgICAgKi8KICAgICAgICBidWlsZEFqYXhDb25maWc6IGZ1bmN0aW9uKHVyaSwgaXNKc29uKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFqYXhDb25maWcgPSB7CiAgICAgICAgICAgICAgICAidXJsIjogdXJpLAogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2V0IgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKGlzSnNvbikgewogICAgICAgICAgICAgICAgYWpheENvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAidGV4dCI7CiAgICAgICAgICAgICAgICBpZiAodXJpICYmIHVyaS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi5odG1sIikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhamF4Q29uZmlnOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgZ2VuZXJhbCBkb2N1bWVudCB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgdXNlcyBqUXVlcnkgdG8gcGVyZm9ybSB0aGUgQWpheCBjYWxsLiAgSWYgeW91IG5lZWQgdG8gY3VzdG9taXplIGNvbm5lY3Rpdml0eSB0byB5b3VyIG93biByZW1vdGUgc2VydmVyLAogICAgICAgICAqIHRoaXMgd291bGQgYmUgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIHRvIGRvIHNvLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVyaSB1cmkgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0pzb24gV2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBKU09OIG9yIG5vdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVXJpIDogZnVuY3Rpb24odXJpLCBpc0pzb24sIG9uU3VjY2Vzcywgb25FcnJvcikgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGFqYXhDb25maWcgPSBzZWxmLmJ1aWxkQWpheENvbmZpZyh1cmksIGlzSnNvbik7CgogICAgICAgICAgICBhamF4Q29uZmlnWyJzdWNjZXNzIl0gPSBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHVyaSwganNvbkRvY3VtZW50KTsKCiAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoanNvbkRvY3VtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgYWpheENvbmZpZ1siZXJyb3IiXSA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiJVbmFibGUgdG8gbG9hZCBkYXRhIGZyb20gdXJpIDogIiArIHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgInN0YWdlIjogIkRBVEFfTE9BRElOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXRhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHRTdGF0dXMiIDogdGV4dFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclRocm93biIgOiBlcnJvclRocm93bgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKHVyaSk7CgogICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQgJiYgb25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKICAgICAgICAgICAgICAgIG9uU3VjY2VzcyhjYWNoZWREb2N1bWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkLmFqYXgoYWpheENvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVMb2FkSnNvblJlc291cmNlOiBmdW5jdGlvbiAocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzVXJpKHJlc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5sb2FkSnNvbihyZXNvdXJjZSwgZnVuY3Rpb24obG9hZGVkUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobG9hZGVkUmVzb3VyY2UpOwogICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2socmVzb3VyY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBzb3VyY2UgKHZhbHVlL3RleHQpIHBhaXJzIGZyb20gYSByZW1vdGUgc291cmNlLgogICAgICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgZm9yIGNvbmZpZyB0byBiZSBhIHN0cmluZyBpZGVudGlmeWluZyBhIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcKICAgICAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YVNvdXJjZTogZnVuY3Rpb24gKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWREYXRhU291cmNlKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVybCA9IGNvbmZpZzsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh1cmwpKSB7CiAgICAgICAgICAgICAgICB1cmwgPSBjb25maWcudXJsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZSh1cmwsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckNvbm5lY3RvckNsYXNzKCJkZWZhdWx0IiwgQWxwYWNhLkNvbm5lY3Rvcik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yID0gQWxwYWNhLkNvbm5lY3Rvci5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBjbGFzcyBDb25uZWN0cyBBbHBhY2EgdG8gQ2xvdWQgQ01TCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IG90aGVyd2lzZSBjb25maWd1cmVkIHRvIHVzZSBhIGNhY2hlLCB3ZSBkZWZhdWx0IHRvIGEgbWVtb3J5IGNhY2hlIHdpdGggYSA1IG1pbnV0ZSBUVEwKICAgICAgICAgICAgaWYgKCFjb25maWcuY2FjaGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZSA9IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJtZW1vcnkiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0dGwiOiAxMDAwICogNjAgKiA1IC8vIGZpdmUgbWludXRlcwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShpZCwgY29uZmlnKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYWtlcyBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIGRhdGEgc291cmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdDogZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjZm4gPSBmdW5jdGlvbihlcnIsIGJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChicmFuY2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBDaGFpbihicmFuY2gpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmRIZWxwZXJGdW5jdGlvbnMoc2VsZi5icmFuY2gpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG9uU3VjY2VzcygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5nbG9iYWxDb250ZXh0ICYmIEFscGFjYS5nbG9iYWxDb250ZXh0LmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2ZuKG51bGwsIEFscGFjYS5nbG9iYWxDb250ZXh0LmJyYW5jaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmJyYW5jaCA9IG51bGw7CgogICAgICAgICAgICAgICAgc2VsZi5kb0Nvbm5lY3QoZnVuY3Rpb24gKGVyciwgYnJhbmNoKSB7CiAgICAgICAgICAgICAgICAgICAgY2ZuKGVyciwgYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9Db25uZWN0OiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5rZXkgPSAiZGVmYXVsdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEdpdGFuYS5jb25uZWN0KHRoaXMuY29uZmlnLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RHJpdmVyKCkuZ2V0T3JpZ2luYWxDb25maWd1cmF0aW9uKCkubG9hZEFwcEhlbHBlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzdG9yZSgiY29udGVudCIpLnJlYWRCcmFuY2goIm1hc3RlciIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGJpbmRIZWxwZXJGdW5jdGlvbnM6IGZ1bmN0aW9uKGJyYW5jaCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hID0gZnVuY3Rpb24oc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWREb2N1bWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCBjYWNoZWREb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2Evc2NoZW1hIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJpZCJdID0gc2NoZW1hSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUoc2NoZW1hSWRlbnRpZmllciwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYU9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSBzZWxmLmNhY2hlKG9wdGlvbnNJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL29wdGlvbnMiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbInNjaGVtYUlkIl0gPSByZXNvdXJjZXMuc2NoZW1hU291cmNlOwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IG9wdGlvbnNJZGVudGlmaWVyOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbkdldFJlc3BvbnNlKHRoaXMsIHVyaUZ1bmN0aW9uLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllciwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghYnJhbmNoLmxvYWRBbHBhY2FEYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYURhdGEgPSBmdW5jdGlvbihkYXRhSWRlbnRpZmllciwgcmVzb3VyY2VzLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IGRhdGFJZGVudGlmaWVyOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbkdldFJlc3BvbnNlKHRoaXMsIHVyaUZ1bmN0aW9uLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhU291cmNlID0gZnVuY3Rpb24oY29uZmlnLCBwYWdpbmF0aW9uLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY29weUludG8ocGFyYW1zLCBwYWdpbmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9kYXRhc291cmNlIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpblBvc3RSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zLCBjb25maWcpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZS5kYXRhc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBmcm9tIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBub2RlSWQgdGhlIG5vZGUgaWQgdG8gbG9hZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uobm9kZUlkLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBjbG91ZCBjbXMKICAgICAgICAgICAgc2VsZi5icmFuY2gubG9hZEFscGFjYURhdGEobm9kZUlkLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb2JqID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYmogPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob2JqKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMganNvbiBzY2hlbWEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNjaGVtYUlkZW50aWZpZXIgdGhlIGRlZmluaXRpb24gcW5hbWUgdG8gbG9hZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRTY2hlbWE6IGZ1bmN0aW9uIChzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGxvYWQgZnJvbSBjbG91ZCBjbXMKICAgICAgICAgICAgc2VsZi5icmFuY2gubG9hZEFscGFjYVNjaGVtYShzY2hlbWFJZGVudGlmaWVyLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JDYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgc2NoZW1hCgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHNjaGVtYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gb3B0aW9ucyBmcm9tIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgdGhlIGZvcm0ga2V5IHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkT3B0aW9uczogZnVuY3Rpb24gKG9wdGlvbnNJZGVudGlmaWVyLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zKG9wdGlvbnNJZGVudGlmaWVyLCByZXNvdXJjZXMsIGZ1bmN0aW9uKGVyciwgb3B0aW9ucykgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBvcHRpb25zCgogICAgICAgICAgICAgICAgLy8gbWl4IGluIGJ1dHRvbnMgb250byBmb3JtCiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0uYnV0dG9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuYWpheFN1Ym1pdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhockZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhDcmVkZW50aWFscyI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9zc0RvbWFpbiI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NEYXRhIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnRUeXBlIjogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sLnRyaWdnZXIoImZvcm1TdWJtaXRTdWNjZXNzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS50b3BDb250cm9sLnRyaWdnZXIoImZvcm1TdWJtaXRGYWlsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb2N1cyA9IEFscGFjYS5kZWZhdWx0Rm9jdXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBhY3Rpb24gaGFuZGxlciByZWxhdGl2ZSB0byBiYXNlVVJMCiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0uYXR0cmlidXRlcy5hY3Rpb24gPSBzZWxmLmNvbmZpZy5iYXNlVVJMICsgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uOwoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhvcHRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgYSByZWZlcmVuY2VkIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogU3VwcG9ydHMgcW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfQogICAgICAgICAqCiAgICAgICAgICogT3RoZXJ3aXNlLCBmYWxscyBiYWNrIHRvIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHNjaGVtYUlkZW50aWZpZXIgc2NoZW1hIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9IiAod2hpY2ggaXMgdGhlIENsb3VkIENNUyBvZmZpY2lhbCBmb3JtYXQpCiAgICAgICAgICAgIC8vIHRoZW4gY29udmVydCB0byBiYXNpYyBRTmFtZSB3aGljaCB3ZSBzdXBwb3J0IGhlcmUgd2l0aGluIEFscGFjYSBDbG91ZCBDTVMgY29ubmVjdG9yCiAgICAgICAgICAgIGlmIChzY2hlbWFJZGVudGlmaWVyLmluZGV4T2YoInFuYW1lOi8vIikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IHNjaGVtYUlkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgc2NoZW1hSWRlbnRpZmllciA9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgoc2NoZW1hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6Ly8iKSA9PT0gMCkgfHwgKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwczovLyIpID09PSAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbG9hZCBKU09OIGZyb20gZW5kcG9pbnQKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGFzc3VtZSBpdCBpcyBhIFFOYW1lCiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHJlZmVyZW5jZWQgSlNPTiBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogLy8gU3VwcG9ydHMgcW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfS97Zm9ybUtleX0KICAgICAgICAgKgogICAgICAgICAqIEF0IHByZXNlbnQsIHRoaXMgaWdub3JlcyBRTmFtZS4KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBvcHRpb25zSWRlbnRpZmllciBmb3JtIHRvIGxvYWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZU9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaXMgaXQgSFRUUCBvciBIVFRQUz8KICAgICAgICAgICAgaWYgKChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHA6Ly8iKSA9PT0gMCkgfHwgKG9wdGlvbnNJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShvcHRpb25zSWRlbnRpZmllciwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc291cmNlcyA9IG51bGw7CgogICAgICAgICAgICAvLyBpZiB0aGUgcmVmZXJlbmNlIGNvbWVzIGluIGZvcm0gInFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9IiAod2hpY2ggaXMgdGhlIENsb3VkIENNUyBvZmZpY2lhbCBmb3JtYXQpCiAgICAgICAgICAgIC8vIHRoZW4gY29udmVydCB0byBiYXNpYyBRTmFtZSB3aGljaCB3ZSBzdXBwb3J0IGhlcmUgd2l0aGluIEFscGFjYSBDbG91ZCBDTVMgY29ubmVjdG9yCiAgICAgICAgICAgIGlmIChvcHRpb25zSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBvcHRpb25zSWRlbnRpZmllci5zdWJzdHJpbmcoOCkuc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHFuYW1lCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0ge307CiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnNjaGVtYVNvdXJjZSA9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV07CgogICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gaWQKICAgICAgICAgICAgICAgICAgICBvcHRpb25zSWRlbnRpZmllciA9IHBhcnRzWzJdOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sobnVsbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgZGF0YSBzb3VyY2UgZWxlbWVudHMgYmFzZWQgb24gYSBjb250ZW50IHF1ZXJ5IHRvIENsb3VkIENNUy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcKICAgICAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YVNvdXJjZTogZnVuY3Rpb24gKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKGNvbmZpZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHBhZ2luYXRpb24gPSBjb25maWcucGFnaW5hdGlvbjsKICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5wYWdpbmF0aW9uOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhU291cmNlKGNvbmZpZywgcGFnaW5hdGlvbiwgZnVuY3Rpb24oZXJyLCBhcnJheSkgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGFycmF5KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckNvbm5lY3RvckNsYXNzKCJjbG91ZGNtcyIsIEFscGFjYS5DbG91ZENtc0Nvbm5lY3Rvcik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNpemUpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaXplID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8vIGFzc3VtZSBodG1sNSBpbnB1dCB0eXBlID0gInRleHQiCiAgICAgICAgICAgIGlmICghdGhpcy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRleHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0VHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSB0aGlzLm9wdGlvbnMuaW5wdXRUeXBlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gZGF0YS0qIGF0dHJpYnV0ZXMgc3VwcG9ydAogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBET00gImF1dG9jb21wbGV0ZSIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gIm9uIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInRydWUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZS50b0xvd2VyQ2FzZSgpID09PSAieWVzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuZGlzYWxsb3dPbmx5RW1wdHlTcGFjZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCB0eXBlYWhlYWQKICAgICAgICAgICAgaWYgKCB0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLnR5cGVhaGVhZCAmJiB0aGlzLm9wdGlvbnMudHlwZWFoZWFkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkudHlwZWFoZWFkKCdkZXN0cm95Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5QXV0b2NvbXBsZXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hc2sKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5TWFzaygpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0eXBlYWhlYWQKICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5VHlwZUFoZWFkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlBdXRvY29tcGxldGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGF1dG9jb21wbGV0ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hdXRvY29tcGxldGUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygiYWxwYWNhLWF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoImF1dG9jb21wbGV0ZSIsIChzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlID8gIm9uIiA6ICJvZmYiKSk7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXV0b2NvbXBsZXRlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseU1hc2s6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIG1hc2sgaXQKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC5tYXNrICYmIHNlbGYub3B0aW9ucy5tYXNrU3RyaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wubWFzayhzZWxmLm9wdGlvbnMubWFza1N0cmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVR5cGVBaGVhZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC50eXBlYWhlYWQgJiYgc2VsZi5vcHRpb25zLnR5cGVhaGVhZCAmJiAhQWxwYWNhLmlzRW1wdHkoc2VsZi5vcHRpb25zLnR5cGVhaGVhZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0Q29uZmlnID0gc2VsZi5vcHRpb25zLnR5cGVhaGVhZC5jb25maWc7CiAgICAgICAgICAgICAgICBpZiAoIXRDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICB0Q29uZmlnID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHREYXRhc2V0cyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuZGF0YXNldHM7CiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cykgewogICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMubmFtZSA9IHNlbGYuZ2V0SWQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgdEV2ZW50cyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuZXZlbnRzOwogICAgICAgICAgICAgICAgaWYgKCF0RXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgdEV2ZW50cyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVhY2ggZGF0YXNldHMgKGxvY2FsLCByZW1vdGUsIHByZWZldGNoKQogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMuaW5pdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJsb2NhbCIgfHwgdERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiIHx8IHREYXRhc2V0cy50eXBlID09PSAicHJlZmV0Y2giKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJsb29kSG91bmRDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXR1bVRva2VuaXplcjogZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuaGFzT3duUHJvcGVydHkoaykgfHwgZFtrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9ICIgIiArIGRba107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlKHRva2Vucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsID0gW107CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodERhdGFzZXRzLnNvdXJjZSkgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IHREYXRhc2V0cy5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHREYXRhc2V0cy5zb3VyY2UubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxFbGVtZW50ID0gdERhdGFzZXRzLnNvdXJjZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihsb2NhbEVsZW1lbnQpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFbGVtZW50ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGxvY2FsRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnB1c2gobG9jYWxFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLmxvY2FsID0gbG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMubG9jYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IHREYXRhc2V0cy5sb2NhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5wcmVmZXRjaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2guZmlsdGVyID0gdERhdGFzZXRzLmZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gInJlbW90ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdERhdGFzZXRzLnNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy5maWx0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5yZW1vdGUuZmlsdGVyID0gdERhdGFzZXRzLmZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy5yZXBsYWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLnJlcGxhY2UgPSB0RGF0YXNldHMucmVwbGFjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgYW55IGFkZGl0aW9uYWwgZGF0YXNldCBjb25maWcgcGFyYW1zIGluIHRoZSBCbG9vZGhvdW5kIGNvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godERhdGFzZXRzLCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAndHlwZScgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdzb3VyY2UnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnZmlsdGVyJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3JlcGxhY2UnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnbG9jYWwnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAndGVtcGxhdGVzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnW2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbmV3IEJsb29kaG91bmQoYmxvb2RIb3VuZENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5pbml0aWFsaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy5zb3VyY2UgPSBlbmdpbmUudHRBZGFwdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy5pbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IHREYXRhc2V0cy50ZW1wbGF0ZXNba107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGVtcGxhdGUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLnRlbXBsYXRlc1trXSA9IEhhbmRsZWJhcnMuY29tcGlsZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0eXBlYWhlYWQKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS50eXBlYWhlYWQodENvbmZpZywgdERhdGFzZXRzKTsKCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yICJhdXRvY29tcGxldGVkIiBldmVudCBhbmQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yICJzZWxlY3RlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDpzZWxlY3RlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoZGF0dW0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0RXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0RXZlbnRzLmF1dG9jb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6YXV0b2NvbXBsZXRlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2ZW50cy5hdXRvY29tcGxldGVkKGV2ZW50LCBkYXR1bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDpzZWxlY3RlZCIsIGZ1bmN0aW9uKGV2ZW50LCBkYXR1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2ZW50cy5zZWxlY3RlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlcywgY2hhbmdlIHRoZSBxdWVyeSBpbiB0eXBlYWhlYWQKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8ga2VlcCB0aGUgdHlwZWFoZWFkIGNvbnRyb2wgc3luYydkIHdpdGggdGhlIGFjdHVhbCBkb20gdmFsdWUKICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB0aGUgcXVlcnkgZG9lc24ndCBhbHJlYWR5IG1hdGNoCiAgICAgICAgICAgICAgICB2YXIgZmkgPSAkKHNlbGYuY29udHJvbCk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSAkKGZpKS50eXBlYWhlYWQoJ3ZhbCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKGZpKS50eXBlYWhlYWQoJ3ZhbCcsIG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gc29tZSBVSSBjbGVhbnVwICh3ZSBkb24ndCB3YW50IHR5cGVhaGVhZCB0byByZXN0eWxlKQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIikuZmlyc3QoKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsgLy8gU1BBTiB0byBiZWhhdmUgbW9yZSBsaWtlIERJViwgbmV4dCBsaW5lCiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmZpbmQoInNwYW4udHdpdHRlci10eXBlYWhlYWQgaW5wdXQudHQtaW5wdXQiKS5maXJzdCgpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsICIiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuaW5wdXRUeXBlID0gc2VsZi5pbnB1dFR5cGU7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICB1cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3I6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlcnJTdGF0ZSA9IGZhbHNlOwoKICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIHNlbGYub3B0aW9ucy5zaG93TWF4TGVuZ3RoSW5kaWNhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwoKICAgICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5zY2hlbWEubWF4TGVuZ3RoIC0gdmFsLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChkaWZmID49IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJZb3UgaGF2ZSAiICsgZGlmZiArICIgY2hhcmFjdGVycyByZW1haW5pbmciOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91ciBtZXNzYWdlIGlzIHRvbyBsb25nIGJ5ICIgKyAoZGlmZiotMSkgKyAiIGNoYXJhY3RlcnMiOwogICAgICAgICAgICAgICAgICAgIGVyclN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgaW5kaWNhdG9yID0gJChzZWxmLmZpZWxkKS5maW5kKCIuYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IiKTsKICAgICAgICAgICAgICAgIGlmIChpbmRpY2F0b3IubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9ICQoIjxwIGNsYXNzPSdhbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvcic+PC9wPiIpOwogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hZnRlcihpbmRpY2F0b3IpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5odG1sKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLnJlbW92ZUNsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIGlmIChlcnJTdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuYWRkQ2xhc3MoImVyciIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwoKICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbC5tYXNrICYmIHNlbGYub3B0aW9ucy5tYXNrU3RyaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBnZXQgdW5tYXNrZWQgdmFsdWUKICAgICAgICAgICAgICAgIHZhciBmbiA9ICQodGhpcy5jb250cm9sKS5kYXRhKCQubWFzay5kYXRhTmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoZm4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmbigpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lbnN1cmVQcm9wZXJUeXBlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKCIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgdGhpcy51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVBhdHRlcm4oKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWRQYXR0ZXJuIiksIFt0aGlzLnNjaGVtYS5wYXR0ZXJuXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heExlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdUb29Mb25nIiksIFt0aGlzLnNjaGVtYS5tYXhMZW5ndGhdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluTGVuZ3RoKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdUb29TaG9ydCIpLCBbdGhpcy5zY2hlbWEubWluTGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgcGF0dGVybiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0IG1hdGNoZXMgdGhlIHBhdHRlcm4sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVQYXR0ZXJuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdmFsLm1hdGNoKHRoaXMuc2NoZW1hLnBhdHRlcm4pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgdGhlIHNjaGVtYSBtaW5MZW5ndGggcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdHMgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWluTGVuZ3RoLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluTGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1pbkxlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZih2YWwgIT09IHZhbCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgoIiIrdmFsKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWF4TGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgbGVzcyB0aGFuIG1heExlbmd0aCAsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhMZW5ndGg6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEubWF4TGVuZ3RoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoID4gdGhpcy5zY2hlbWEubWF4TGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmb2N1c2VzIHRoZSBjb250cm9sIGFuZCBhbHNvIHBvc2l0aW9ucyB0aGUgaW5wdXQgYXQgdGhlIGVuZAoKICAgICAgICAgICAgICAgIHZhciBlbCA9ICQodGhpcy5jb250cm9sKS5nZXQoMCk7CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbUxlbiA9IGVsLnZhbHVlID8gZWwudmFsdWUubGVuZ3RoIDogMDsKICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gZWxlbUxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgdHlwZSBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uIHN0YXJ0IGFuZCBlbmQKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlnbm9yZSB0YWIgYW5kIGFycm93IGtleXMKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOSB8fCBlLmtleUNvZGUgPT09IDM3IHx8IGUua2V5Q29kZSA9PT0gMzggfHwgZS5rZXlDb2RlID09PSAzOSB8fCBlLmtleUNvZGUgPT09IDQwICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA4KSAvLyBiYWNrc3BhY2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5taW5MZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWluTGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID49IHNlbGYuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzIpIC8vIHNwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGlzYWxsb3dFbXB0eVNwYWNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgYXBwbGljYWJsZSwgdXBkYXRlIHRoZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRrZXl1cCIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGtleXVwIik7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2luZ2xlLUxpbmUgVGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3Igc2luZ2xlLWxpbmUgdGV4dC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW1hbCBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW1hbCBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIExlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgdmFsdWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5MZW5ndGgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFNpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2l6ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6NDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWFzayBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIHRoZSBmaWVsZCBtYXNrLiBGaWVsZCBtYXNraW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBub3QgZW1wdHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBsYWNlaG9sZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgUGxhY2Vob2xkZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgcGxhY2Vob2xkZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGVhaGVhZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlR5cGUgQWhlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvdmlkZXMgY29uZmlndXJhdGlvbiBmb3IgdGhlICQudHlwZWFoZWFkIHBsdWdpbiBpZiBpdCBpcyBhdmFpbGFibGUuICBGb3IgZnVsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3R3aXR0ZXIvdHlwZWFoZWFkLmpzIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFsbG93T3B0aW9uYWxFbXB0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFsbG93IE9wdGlvbmFsIEVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyB0aGlzIG5vbi1yZXF1aXJlZCBmaWVsZCB0byB2YWxpZGF0ZSB3aGVuIHRoZSB2YWx1ZSBpcyBlbXB0eSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIVE1MNSBJbnB1dCBUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3IgdGhlIG92ZXJyaWRlIG9mIHRoZSB1bmRlcmx5aW5nIEhUTUw1IGlucHV0IHR5cGUuICBJZiBub3Qgc3BlY2lmaWVkLCBhbiBhc3N1bWVkIHZhbHVlIGlzIHByb3ZpZGVkIGJhc2VkIG9uIHRoZSBraW5kIG9mIGlucHV0IGNvbnRyb2wgKGkuZS4gJ3RleHQnLCAnZGF0ZScsICdlbWFpbCcgYW5kIHNvIGZvcnRoKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0YSBhdHRyaWJ1dGVzIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBrZXkvdmFsdWUgbWFwIG9mIGRhdGEgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgYWRkZWQgYXMgRE9NIGF0dHJpYnVldHMgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wuICBUaGUgZGF0YSBhdHRyaWJ1dGVzIHdpbGwgYmUgYWRkZWQgYXMgZGF0YS17bmFtZX09J3t2YWx1ZX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhdXRvY29tcGxldGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIVE1MIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIERPTSBpbnB1dCBjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgYXV0b2NvbXBsZXRlIGF0dHJpYnV0ZSBmb3IgdGhlIHVuZGVybHlpbmcgaW5wdXQgY29udHJvbCB3aGV0aGVyIG9yIG5vdCBmaWVsZCBzaG91bGQgaGF2ZSBhdXRvY29tcGxldGUgZW5hYmxlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWxsb3dFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IEVtcHR5IFNwYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGRpc2FsbG93IHRoZSBlbnRyeSBvZiBlbXB0eSBzcGFjZXMgaW4gdGhlIHRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93T25seUVtcHR5U3BhY2VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3cgT25seSBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2Ygb25seSBlbXB0eSBzcGFjZXMgaW4gdGhlIHRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJhIC0gYW4gYWxwaGEgY2hhcmFjdGVyOzkgLSBhIG51bWVyaWMgY2hhcmFjdGVyOyogLSBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImlucHV0VHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRoaXMgZmllbGQgc2hvdWxkIGhhdmUgcGF0dGVybiB7MH0iLAogICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IGxlYXN0IHswfSBudW1iZXJzIG9yIGNoYXJhY3RlcnMiLAogICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4gYXQgbW9zdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0IiwgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygic3RyaW5nIiwgInRleHQiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0ZXh0YXJlYSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJvd3MpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yb3dzID0gNTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29scykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHMgPSA0MDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgICAgICBpZiAodmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB3b3JkY291bnQgPSB2YWwuc3BsaXQoIiAiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRjb3VudCA+IHRoaXMub3B0aW9ucy53b3JkbGltaXQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNdWx0aS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dGFyZWEgZmllbGQgZm9yIG11bHRpcGxlIGxpbmUgdGV4dC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIHJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogNDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXb3JkIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpbWl0cyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFsbG93ZWQgaW4gdGhlIHRleHQgYXJlYS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIndvcmRMaW1pdEV4Y2VlZGVkIjogIlRoZSBtYXhpbXVtIHdvcmQgbGltaXQgb2YgezB9IGhhcyBiZWVuIGV4Y2VlZGVkLiIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRleHRhcmVhIiwgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY2hlY2tib3giOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Yoc2VsZi5zY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIG1vZGUKCiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgZW51bSB2YWx1ZXMsIGNvcHkgdGhlbSBpbnRvIGNoZWNrYm94IG9wdGlvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLmdldEVudW0oKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBlbnVtZXJhdGVkIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydEVudW0oKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgICAgICQuZWFjaChzZWxmLmdldEVudW0oKSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbkxhYmVscykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbdmFsdWVdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdGV4dAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkICJkYXRhc291cmNlIiwgd2UgY29weSB0byAiZGF0YVNvdXJjZSIKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZSAmJiAhc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgbW9kZQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucmlnaHRMYWJlbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGVja2JveE9wdGlvbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuY2hlY2tib3hPcHRpb25zID0gc2VsZi5jaGVja2JveE9wdGlvbnM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIGlmICghdmFsdWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMuZW51bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5lbnVtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBPVkVSUklERQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbkxhYmVsczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaXRlbXMgJiYgdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVscykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLm9wdGlvbnMuaXRlbXMub3B0aW9uTGFiZWxzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXIgZm9yIHRoZSBldmVudCB0aGF0IHRoZSBjaGVja2JveCBpcyBjbGlja2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNiZWZvcmVSZW5kZXJDb250cm9sCiAgICAgICAgICovCiAgICAgICAgYmVmb3JlUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIG11bHRpcGxlIG1vZGUKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuY2hlY2tib3hPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5jaGVja2JveE9wdGlvbnMsIG1vZGVsLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGJ1aWxkIG91dCB0aGUgZW51bSBhbmQgb3B0aW9uTGFiZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2VudW0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3B0aW9uTGFiZWxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hlY2tib3hPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lbnVtLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLmNoZWNrYm94T3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEVudW0oX2VudW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25MYWJlbHMoX29wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhICYmIHR5cGVvZihzZWxmLmRhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHNlbGYuZGF0YSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZm9yIG11bHRpcGxlIG1vZGUsIG1hcmsgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG5vbmUgY2hlY2tlZAogICAgICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhQXJyYXkgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5kYXRhKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheSA9IHNlbGYuZGF0YS5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBkYXRhQXJyYXkubGVuZ3RoOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUFycmF5W2FdID0gJC50cmltKGRhdGFBcnJheVthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YUFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveFtkYXRhLWNoZWNrYm94LXZhbHVlPVwiIiArIGRhdGFBcnJheVtrXSArICJcIl0iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyB3aGVuZXZlciB0aGUgc3RhdGUgb2Ygb25lIG9mIG91ciBpbnB1dDpjaGVja2JveCBjb250cm9scyBpcyBjaGFuZ2VkIChlaXRoZXIgdmlhIGEgY2xpY2sgb3IgcHJvZ3JhbW1hdGljYWxseSksCiAgICAgICAgICAgICAgICAvLyB3ZSBzaWduYWwgdG8gdGhlIHRvcC1sZXZlbCBmaWVsZCB0byBmaXJlIHVwIGEgY2hhbmdlCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGRlcGVuZGVuY3kgc3lzdGVtIHRvIHJlY2FsY3VsYXRlIGFuZCBzdWNoCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3giKS5jaGFuZ2UoZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBzY2FsYXIgdmFsdWUKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgdmFsdWVzCiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hlY2tib3hPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dEZpZWxkID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC1pbmRleD0nIiArIGkgKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmNoZWNrZWQoaW5wdXRGaWVsZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9ICQoaW5wdXRGaWVsZCkuYXR0cigiZGF0YS1jaGVja2JveC12YWx1ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyB3ZSdyZSBnb2luZyB0byBoYW5kIHRoaXMgdmFsdWUgYmFjawoKICAgICAgICAgICAgICAgIC8vIGlmIHR5cGUgPT0gImFycmF5Iiwgd2UganVzdCBoYW5kIGJhY2sgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJzdHJpbmciLCB3ZSBidWlsZCBhIGNvbW1hLWRlbGltaXRlZCBsaXN0CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmpvaW4oIiwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4sIHN0cmluZyAoInRydWUiKSwgc3RyaW5nICgiYSxiLGMiKSBvciBhbiBhcnJheSBvZiB2YWx1ZXMKCiAgICAgICAgICAgIHZhciBhcHBseVNpbmdsZVZhbHVlID0gZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPT09ICJ0cnVlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQiKTsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgYXBwbHlNdWx0aVZhbHVlID0gZnVuY3Rpb24odmFsdWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgY29tbWEtZGVsaW1pdGVkIHN0cmluZ3MKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdHJpbSB0aGluZ3MgdG8gcmVtb3ZlIGFueSBleGNlc3Mgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IEFscGFjYS50cmltKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHZhbHVlcyBhbmQgYXNzaWduIGludG8gYXBwcm9wcmlhdGUgaW5wdXRzCiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dFtkYXRhLWNoZWNrYm94LXZhbHVlXSIpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dFtkYXRhLWNoZWNrYm94LXZhbHVlPVwiIiArIHZhbHVlc1tqXSArICJcIl0iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoaW5wdXRbMF0pLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGxpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgdmFsdWUgbW9kZQoKICAgICAgICAgICAgICAgIC8vIGJvb2xlYW4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09PSAiYm9vbGVhbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YodmFsdWUpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseVNpbmdsZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseU11bHRpVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFwcGxpZWQgJiYgdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2hlY2tib3hGaWVsZCBjYW5ub3Qgc2V0IHZhbHVlIGZvciBzY2hlbWEudHlwZT0iICsgc2VsZi5zY2hlbWEudHlwZSArICIgYW5kIHZhbHVlPSIgKyB2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5IGluIHRoZSBjYXNlIHRoYXQgdGhlIGNoZWNrYm94IGZpZWxkIGlzIGluIG11bHRpcGxlIG1vZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWwgPSBzZWxmLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CgogICAgICAgICAgICBpZiAoIXNlbGYuaXNSZXF1aXJlZCgpICYmIEFscGFjYS5pc1ZhbEVtcHR5KHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB2YWwgaXMgYSBzdHJpbmcsIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCIsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuYW55RXF1YWxpdHkodmFsLCBzZWxmLmdldEVudW0oKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CgogICAgICAgICAgICBzZWxmLmNvbnZlcnRUb0RhdGFWYWx1ZShzY2FsYXJWYWx1ZSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgICAgICAvLyBzdG9yZSBzY2FsYXIgdmFsdWUgb250byBjb250cm9sCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wudmFsKHNjYWxhclZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIG9ic2VydmFibGVzIGFuZCB1cGRhdGVzCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0sCgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNoZWNrYm94IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCBmb3IgYm9vbGVhbiAodHJ1ZS9mYWxzZSksIHN0cmluZyAoJ3RydWUnLCAnZmFsc2UnIG9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgb2YgdmFsdWVzKSBvciBkYXRhIGFycmF5LiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgcmlnaHQtaGFuZCBzaWRlIGxhYmVsIGZvciBzaW5nbGUgY2hlY2tib3ggZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byByZW5kZXIgbXVsdGlwbGUgY2hlY2tib3hlcyBmb3IgbXVsdGktdmFsdWVkIHR5cGUgKHN1Y2ggYXMgYW4gYXJyYXkgb3IgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhU291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgc291cmNlIGZvciBnZW5lcmF0aW5nIGxpc3Qgb2Ygb3B0aW9ucy4gIFRoaXMgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uICBJZiBhIHN0cmluZywgaXQgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB0byBhIHNlcnZpY2UgdGhhdCBwcm9kdWNlcyBhIG9iamVjdCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycyBvciBhbiBhcnJheSBvZiBlbGVtZW50cyBvZiBzdHJ1Y3R1cmUgeyd0ZXh0JzogJycsICd2YWx1ZSc6ICcnfS4gIFRoaXMgY2FuIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBwcm9kdWNlIHRoZSBzYW1lIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVzZURhdGFTb3VyY2VBc0VudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJVc2UgRGF0YSBTb3VyY2UgYXMgRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gdGhlIGZpZWxkJ3Mgc2NoZW1hIGVudW0gcHJvcGVydHkgdG8gdGhlIHZhbHVlcyB0aGF0IGNvbWUgYmFjayBmcm9tIHRoZSBkYXRhIHNvdXJjZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNoZWNrYm94IiwgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImJvb2xlYW4iLCAiY2hlY2tib3giKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImZpbGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICB9LAoKICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uSGFuZGxlcihlLnRhcmdldC5maWxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcm9jZXNzU2VsZWN0aW9uSGFuZGxlcjogZnVuY3Rpb24oZmlsZXMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgSFRNTDUgRmlsZVJlYWRlciwgd2UgY2FuIHB1bGwgaW4gdGhlIHN0cmVhbSBmb3IgcHJldmlldwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihGaWxlUmVhZGVyKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIGxvYWRlZCBkYXRhCiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRlZERhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZENvdW50ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVXJpID0gZXZlbnQudGFyZ2V0LnJlc3VsdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWREYXRhLnB1c2goZGF0YVVyaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnQrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZENvdW50ID09PSBmaWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQub3B0aW9ucy5zZWxlY3Rpb25IYW5kbGVyLmNhbGwoZmllbGQsIGZpbGVzLCBsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KS5jYWxsKHRoaXMpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciB1cGxvYWRpbmcgZmlsZXMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uSGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNlbGVjdGlvbiBIYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGZpbGVzIGFyZSBzZWxlY3RlZC4gIFJlcXVpcmVzIEhUTUw1LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uSGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImZpbGUiLCBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgIGlmIChzZWxmLmdldEVudW0oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgIHNlbGYuc29ydEVudW0oKTsKCiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uTGFiZWxzID0gc2VsZi5nZXRPcHRpb25MYWJlbHMoKTsKCiAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1tpbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbdmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQXV0byBhc3NpZ24gZGF0YSBpZiB3ZSBoYXZlIGRhdGEgYW5kIHRoZSBmaWVsZCBpcyByZXF1aXJlZCBhbmQgcmVtb3ZlRGVmYXVsdE5vbmUgaXMgZWl0aGVyIHVuc3BlY2lmaWVkIG9yIHRydWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZWxmLmlzUmVxdWlyZWQoKSAmJiAhc2VsZi5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZSA9PT0gdHJ1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudW1WYWx1ZXMgPSBzZWxmLmdldEVudW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlcyAmJiBlbnVtVmFsdWVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBlbnVtVmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZSAmJiAhc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhU291cmNlID0gc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdlIG9wdGlvbmFsbHkgYWxsb3cgdGhlIGRhdGEgc291cmNlIHJldHVybiB2YWx1ZXMgdG8gb3ZlcnJpZGUgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubm9uZUxhYmVsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm5vbmVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgibm9uZUxhYmVsIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuaGlkZU5vbmUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuaGlkZU5vbmUgPSBzZWxmLmlzUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRm4gPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5kYXRhKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGFyVmFsdWUgPT09IHNlbGYuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW52b2tlRGF0YVNvdXJjZShzZWxmLnNlbGVjdE9wdGlvbnMsIG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGJ1aWxkIG91dCB0aGUgZW51bSBhbmQgb3B0aW9uTGFiZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2VudW0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3B0aW9uTGFiZWxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29wdGlvbkxhYmVscy5wdXNoKHNlbGYuc2VsZWN0T3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEVudW0oX2VudW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25MYWJlbHMoX29wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GbigpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb1NjYWxhclZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvRGF0YVZhbHVlOiBmdW5jdGlvbihzY2FsYXJWYWx1ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGZpZWxkIHZhbHVlIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIERhdGFzb3VyY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0YXNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlbW92ZSBEZWZhdWx0IE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGRlZmF1bHQgJ05vbmUnIG9wdGlvbiB3aWxsIG5vdCBiZSBzaG93bi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm5vbmVMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5vbmUgTGFiZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxhYmVsIHRvIHVzZSBmb3IgdGhlICdOb25lJyBvcHRpb24gaW4gYSBsaXN0IChzZWxlY3QsIHJhZGlvIG9yIG90aGVyd2lzZSkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlTm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhpZGUgTm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGhpZGUgdGhlIE5vbmUgb3B0aW9uIGZyb20gYSBsaXN0IChzZWxlY3QsIHJhZGlvIG9yIG90aGVyd2lzZSkuICBUaGlzIHdpbGwgYmUgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVzZURhdGFTb3VyY2VBc0VudW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJVc2UgRGF0YSBTb3VyY2UgYXMgRW51bWVyYXRlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gdGhlIGZpZWxkJ3Mgc2NoZW1hIGVudW0gcHJvcGVydHkgdG8gdGhlIHZhbHVlcyB0aGF0IGNvbWUgYmFjayBmcm9tIHRoZSBkYXRhIHNvdXJjZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm5vbmVMYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlTm9uZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIHRoZSAnTm9uZScgb3B0aW9uIGZyb20gdGhlIGxpc3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vbmVMYWJlbCI6ICJOb25lIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQgPSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInJhZGlvIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5uYW1lKQogICAgICAgICAgICB7CgkJCQl0aGlzLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTsKCQkJfQoJCQllbHNlIGlmICghdGhpcy5uYW1lKQogICAgICAgICAgICB7CgkJCQl0aGlzLm5hbWUgPSB0aGlzLmdldElkKCkgKyAiLW5hbWUiOwoJCQl9CgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHZlcnRpY2FsIG9yaWVudGF0aW9uCiAgICAgICAgICAgIC8vIGVtcHR5IHNlbGVjdCBmaXJzdCB0byBmYWxzZSBieSBkZWZhdWx0CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZlcnRpY2FsKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZlcnRpY2FsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCI6Y2hlY2tlZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMpLnZhbCgpOwoKICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjbGVhciBhbGwKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQodGhpcyksIG51bGwpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIG1hcmsgc2VsZWN0ZWQgdmFsdWUKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXRbdmFsdWU9XCIiICsgdmFsICsgIlwiXSIpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub25lIHNlbGVjdGVkIGFuZCAiZW1wdHlTZWxlY3RGaXJzdCIsIHRoZW4gc2VsZWN0CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpjaGVja2VkIikubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5jaGVja2VkKCQoc2VsZi5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmZpcnN0KCksICJjaGVja2VkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciBpbnB1dHMgPSAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKTsKCiAgICAgICAgICAgIGlucHV0cy5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaW5wdXRzLmJsdXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC5zZWxlY3RPcHRpb25zID0gc2VsZi5zZWxlY3RPcHRpb25zOwogICAgICAgICAgICAgICAgbW9kZWwucmVtb3ZlRGVmYXVsdE5vbmUgPSBzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmU7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CgogICAgICAgICAgICAgICAgICAgIGlmICgkKCJpbnB1dDpyYWRpbzpjaGVja2VkIiwgc2VsZi5jb250cm9sKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW9bdmFsdWU9XCIiICsgc2VsZi5kYXRhICsgIlwiXSIpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdGFjayByYWRpbyBzZWxlY3RvcnMgdmVydGljYWxseQogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy52ZXJ0aWNhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSAibmFtZSIgcHJvcGVydHkgb24gdGhlIGNvbnRyb2wgaXMga2VwdCBpbiBzeW5jLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvIikuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25DbGljawogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoImlucHV0IikudmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB2YWwpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIGZvciByYWRpbyBidXR0b25zLCB3ZSBhbHNvIG1hcmsgdGhlIG91dGVyIERJViBhcyBkaXNhYmxlZCB0byBwcmV2ZW50IGxhYmVsIGNsaWNrcwogICAgICAgICAgICAvLyBhbmQgYXBwbHkgc29tZSBDU1Mgc3R5bGluZwogICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJhZGlvIEdyb3VwIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCB3aXRoIGxpc3Qgb2Ygb3B0aW9ucy4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KCQlnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJInByb3BlcnRpZXMiOiB7CgkJCQkJIm5hbWUiOiB7CgkJCQkJCSJ0aXRsZSI6ICJGaWVsZCBuYW1lIiwKCQkJCQkJImRlc2NyaXB0aW9uIjogIkZpZWxkIG5hbWUuIiwKCQkJCQkJInR5cGUiOiAic3RyaW5nIgoJCQkJCX0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBvc2l0aW9uIHRoZSByYWRpbyBzZWxlY3RvciBpdGVtcyB2ZXJ0aWNhbGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkJ5IGRlZmF1bHQsIHJhZGlvIGNvbnRyb2xzIGFyZSBzdGFja2VkIHZlcnRpY2FsbHkuICBTZXQgdG8gZmFsc2UgaWYgeW91J2QgbGlrZSByYWRpbyBjb250cm9scyB0byBsYXkgb3V0IGhvcml6b250YWxseS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQoJCQkJfQoJCQl9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAKICAgIH0pOwogICAgCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJyYWRpbyIsIEFscGFjYS5GaWVsZHMuUmFkaW9GaWVsZCk7CiAgICAKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQgPSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gInNlbGVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYVsidHlwZSJdICYmIHNlbGYuc2NoZW1hWyJ0eXBlIl0gPT09ICJhcnJheSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgdHVybiBvbiAiaGlkZU5vbmUiIGlmIHdlJ3JlIGluIG11bHRpc2VsZWN0IG1vZGUgYW5kIGhhdmUgdGhlIG11bHRpc2VsZWN0IHBsdWdpbgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMgYW5kIG1pbkl0ZW1zIG9uIHRoZSBzY2hlbWEuaXRlbXMgc3Vib2JqZWN0LgogICAgICAgICAgICAvLyBpZiBub3QgZGVmaW5lZCBwcm9wZXJseSwgd2Ugb2ZmZXIgc29tZSBhdXRvbWF0aWMgZm9yd2FyZCBtaWdyYXRpb24gb2YgdGhlc2UgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLm1heEl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLm1heEl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5taW5JdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5taW5JdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCAmJiB0eXBlb2Yoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0LmRpc2FibGVJZkVtcHR5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBuZXdTY2FsYXJWYWwgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CiAgICAgICAgICAgIHZhciBjdXJyZW50U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZShzZWxmLmdldFZhbHVlKCkpOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGVuIHNldAogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuY29tcGFyZUFycmF5Q29udGVudChuZXdTY2FsYXJWYWwsIGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkobmV3U2NhbGFyVmFsKSAmJiB0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKG5ld1NjYWxhclZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcHBseSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgQWxwYWNhLmlzRW1wdHkoY3VycmVudFNjYWxhclZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3U2NhbGFyVmFsICE9PSBjdXJyZW50U2NhbGFyVmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYXBwbHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCAmJiB0eXBlb2YobmV3U2NhbGFyVmFsKSAhPT0gInVuZGVmaW5lZCIgJiYgbmV3U2NhbGFyVmFsICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5MaXN0RmllbGQjZ2V0RW51bQogICAgICAgICAqLwogICAgICAgIGdldEVudW06IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjaGVtYVsidHlwZSJdICYmIHRoaXMuc2NoZW1hWyJ0eXBlIl0gPT09ICJhcnJheSIgJiYgdGhpcy5zY2hlbWFbIml0ZW1zIl0gJiYgdGhpcy5zY2hlbWFbIml0ZW1zIl1bImVudW0iXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFbIml0ZW1zIl1bImVudW0iXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBidXR0b24gPSB0aGlzLmNvbnRyb2wucGFyZW50KCkuZmluZCgiYnV0dG9uLm11bHRpc2VsZWN0Iik7CgogICAgICAgICAgICAgICAgYnV0dG9uLmZvY3VzKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgYnV0dG9uLmJsdXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24gKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgb3V0ICJkaXNwbGF5YWJsZVRleHQiCiAgICAgICAgICAgICAgICB2YXIgZGlzcGxheWFibGVUZXh0cyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5zZWxlY3RPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hcFttb2RlbC5zZWxlY3RPcHRpb25zW2ldLnZhbHVlXSA9IG1vZGVsLnNlbGVjdE9wdGlvbnNbaV0udGV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkobW9kZWwuZGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtYXBbbW9kZWwuZGF0YVtpXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZVRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtYXBbbW9kZWwuZGF0YV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZVRleHRzLnB1c2godGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vZGVsLmRpc3BsYXlhYmxlVGV4dCA9IGRpc3BsYXlhYmxlVGV4dHMuam9pbigiLCAiKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIGVtcHR5U2VsZWN0Rmlyc3QgYW5kIG5vdGhpbmcgY3VycmVudGx5IGNoZWNrZWQsIHRoZW4gcGljayBmaXJzdCBpdGVtIGluIHRoZSB2YWx1ZSBsaXN0CiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgdmlzdWFsbHkgc2VsZWN0IGl0CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHNlbGYuZGF0YSkgJiYgc2VsZi5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QgJiYgc2VsZi5zZWxlY3RPcHRpb25zICYmIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuc2VsZWN0T3B0aW9uc1swXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyB0aGlzIGxpdHRsZSB0cmljayBzbyB0aGF0IGlmIHdlIGhhdmUgYSBkZWZhdWx0IHZhbHVlLCBpdCBnZXRzIHNldCBkdXJpbmcgZmlyc3QgcmVuZGVyCiAgICAgICAgICAgICAgICAvLyB0aGlzIGNhdXNlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wKICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBpbiBtdWx0aXBsZSBtb2RlIGFuZCB0aGUgYm9vdHN0cmFwIG11bHRpc2VsZWN0IHBsdWdpbiBpcyBhdmFpbGFibGUsIGJpbmQgaXQgaW4KICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgJiYgJC5mbi5tdWx0aXNlbGVjdCAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzID0gc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCA9ICJOb25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5ub25lTGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vblNlbGVjdGVkVGV4dCA9IHNlbGYub3B0aW9ucy5ub25lTGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250cm9sRWwoKSkubXVsdGlzZWxlY3Qoc2V0dGluZ3MpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBhZ2FpbnN0IGVudW0gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hWyJlbnVtIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh2YWwpICYmICFBbHBhY2EuaXNPYmplY3QodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFt2YWxdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHZhbCwgZnVuY3Rpb24oaSx2KSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbkFycmF5ID0gQWxwYWNhLmluQXJyYXkoX3RoaXMuc2NoZW1hWyJlbnVtIl0sIHNjYWxhclZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugd2UncmUgYW4gYXJyYXkgbW9kZWxlZCBvbiBhIHNpbmdsZSBzZWxlY3QsIGp1c3QgdXNlIHRoZSAwdGggZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbFswXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IF90aGlzLmNvbnZlcnRUb1NjYWxhclZhbHVlKHZhbCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5BcnJheSh0aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBzY2FsYXJWYWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CgogICAgICAgICAgICBzZWxmLmNvbnZlcnRUb0RhdGFWYWx1ZShzY2FsYXJWYWx1ZSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgICAgICAvLyBzdG9yZSBzY2FsYXIgdmFsdWUgb250byBjb250cm9sCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wudmFsKHNjYWxhclZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIG9ic2VydmFibGVzIGFuZCB1cGRhdGVzCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluSXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5taW5JdGVtcyAmJiB0aGlzLnNjaGVtYS5taW5JdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJCgiOnNlbGVjdGVkIix0aGlzLmNvbnRyb2wpLmxlbmd0aCA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJCgiOnNlbGVjdGVkIix0aGlzLmNvbnRyb2wpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heEl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZXQgZm9jdXMgb250byB0aGUgc2VsZWN0CiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIGVsLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRDb250cm9sRWwoKSkubXVsdGlzZWxlY3QoImRpc2FibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJlbmFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlbGVjdCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bGl0cGxlIFNlbGVjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNwbGF5ZWQgT3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2Ygb3B0aW9ucyB0byBiZSBzaG93bi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1wdHlTZWxlY3RGaXJzdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVtcHR5IFNlbGVjdCBGaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0aGUgZGF0YSBpcyBlbXB0eSwgdGhlbiBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlzZWxlY3QgUGx1Z2luIFNldHRpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk11bHRpc2VsZWN0IHBsdWdpbiBwcm9wZXJ0aWVzIC0gaHR0cDovL2Rhdmlkc3R1dHouZ2l0aHViLmlvL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFsbG93IG11bHRpcGxlIHNlbGVjdGlvbiA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1wdHlTZWxlY3RGaXJzdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlzZWxlY3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIk11bHRpc2VsZWN0IHBsdWdpbiBwcm9wZXJ0aWVzIC0gaHR0cDovL2Rhdmlkc3R1dHouZ2l0aHViLmlvL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInNlbGVjdCIsIEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJudW1iZXIiOwogICAgICAgICAgICAvLyBUT0RPOiB3ZSBjYW4ndCBkbyB0aGlzIGJlY2F1c2UgQ2hyb21lIHNjcmV3cyB1cCBpdCdzIGhhbmRsaW5nIG9mIG51bWJlciB0eXBlCiAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB1cyBmcm9tIHZhbGlkYXRpbmcgcHJvcGVybHkKICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE2NDIwODI4L2pxdWVyeS12YWwtcmVmdXNlcy10by1yZXR1cm4tbm9uLW51bWVyaWMtaW5wdXQtZnJvbS1hLW51bWJlci1maWVsZC11bmRlci1jaHJvbWUKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5udW1lcmljRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZSB8fCAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubnVtZXJpY0VudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIChrZXkgPj0gNDggJiYga2V5IDw9IDU3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBldmVuIGFsbG93IGVudHJ5IG9mIGludmFsaWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PSAidW5kZWZpbmVkIiB8fCAiIiA9PSB2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTnVtYmVyKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoInN0cmluZ05vdEFOdW1iZXIiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGl2aXNpYmxlQnkoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ0RpdmlzaWJsZUJ5IiksIFt0aGlzLnNjaGVtYS5kaXZpc2libGVCeV0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhpbXVtKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIiIsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICghc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXVsibWVzc2FnZSJdID0gQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIiksIFt0aGlzLnNjaGVtYS5tYXhpbXVtXSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vTGFyZ2UiXVsibWVzc2FnZSJdID0gQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdWYWx1ZVRvb0xhcmdlIiksIFt0aGlzLnNjaGVtYS5tYXhpbXVtXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluaW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWluaW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29TbWFsbCIpLCBbdGhpcy5zY2hlbWEubWluaW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU11bHRpcGxlT2YoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIiksIFt0aGlzLnNjaGVtYS5tdWx0aXBsZU9mXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmQgYmFjayBhIHRydWUvZmFsc2UKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdEaXZpc2libGVCeSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlVG9vU21hbGwiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb0xvbmciXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vU2hvcnQiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGFnYWluc3QgcmVxdWlyZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gRmFsc2UgaWYgdGhpcyBmaWVsZCB2YWx1ZSBpcyBlbXB0eSBidXQgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU9wdGlvbmFsOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSgkKHRoaXMuY29udHJvbCkudmFsKCkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgZmxvYXQgbnVtYmVyLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgZmxvYXQgbnVtYmVyCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTnVtYmVyOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBhcyB0ZXh0CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGV4dFZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRleHRWYWx1ZSA9ICIiICsgdGV4dFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbGxvdyBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbGlkIG51bWJlciBmb3JtYXQKICAgICAgICAgICAgdmFyIHZhbGlkTnVtYmVyID0gQWxwYWNhLnRlc3RSZWdleChBbHBhY2EucmVnZXhwcy5udW1iZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBkaXZpc2libGVCeSBjb25zdHJhaW50LgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IHBhc3NlcyB0aGUgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEaXZpc2libGVCeTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLmRpdmlzaWJsZUJ5KSkgewoKICAgICAgICAgICAgICAgIC8vIG1vZAogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJSB0aGlzLnNjaGVtYS5kaXZpc2libGVCeSAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhpbXVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heGltdW0pKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA+IHRoaXMuc2NoZW1hLm1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09IHRoaXMuc2NoZW1hLm1heGltdW0gJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG1heGltdW0gY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG1pbmltdW0gY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5pbXVtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1pbmltdW0pKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA8IHRoaXMuc2NoZW1hLm1pbmltdW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlID09IHRoaXMuc2NoZW1hLm1pbmltdW0gJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIG11bHRpcGxlT2YgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIG11bHRpcGxlT2YgY29uc3RyYWludC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNdWx0aXBsZU9mOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm11bHRpcGxlT2YpKSB7CiAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSAmJiB0aGlzLnNjaGVtYS5tdWx0aXBsZU9mICE9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmKEFscGFjYS5pc051bWJlcihuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoIDw9IHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1heExlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmKEFscGFjYS5pc051bWJlcihuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID49IHNlbGYuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbGwgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzIpIC8vIHNwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGlzYWxsb3dFbXB0eVNwYWNlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgYXBwbGljYWJsZSwgdXBkYXRlIHRoZSBtYXggbGVuZ3RoIGluZGljYXRvcgogICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwoKICAgICAgICAgICAgLy8gdHJpZ2dlciAiZmllbGRrZXl1cCIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGtleXVwIik7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlT2YiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWx0aXBsZSBPZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2Ygc2NoZW1hIHByb3BlcnR5IHN1Y2ggdGhhdCBkaXZpc2lvbiBieSB0aGlzIHZhbHVlIHlpZWxkcyBhbiBpbnRlcmdlciAobW9kIHplcm8pLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFeGNsdXNpdmUgTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBjYW4gbm90IGVxdWFsIHRoZSBudW1iZXIgZGVmaW5lZCBieSB0aGUgbWluaW11bSBzY2hlbWEgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNYXhpbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1heGltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc1NjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHZhbHVlIG11c3QgYmUgYSBpbnRlZ3JhbCBtdWx0aXBsZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRXhjbHVzaXZlIG1pbmltdW0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gYnV0IG5vdCBlcXVhbCB0byB0aGlzIG51bWJlciBpZiBjaGVja2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRXhjbHVzaXZlIE1heGltdW0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gYnV0IG5vdCBlcXVhbCB0byB0aGlzIG51bWJlciBpZiBjaGVja2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibnVtZXJpY0VudHJ5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTnVtZXJpYyBFbnRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGNvbnN0cmFpbiBkYXRhIGVudHJ5IGtleSBwcmVzc2VzIHRvIG51bWVyaWMgdmFsdWVzICgwLTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTnVtYmVyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBmbG9hdCBudW1iZXJzLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJUaGUgbWluaW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIHswfSIsCiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmFsdWUgb2YgdGhpcyBmaWVsZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBsZXNzIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAiVGhlIHZhbHVlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHswfSIsCiAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIiwKICAgICAgICAic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgezB9IgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJudW1iZXIiLCBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm51bWJlciIsICJudW1iZXIiKTsKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQgPSBBbHBhY2EuQ29udGFpbmVyRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBpdGVtOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY29udGFpbmVySXRlbVRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci0iICsgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSArICItaXRlbSIsIHNlbGYpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJTdHlsZSkgPyAiYnV0dG9uIiA6IHRoaXMudmlldy50b29sYmFyU3R5bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0eWxlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSBBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcuYWN0aW9uYmFyU3R5bGUpID8gInRvcCIgOiB0aGlzLnZpZXcuYWN0aW9uYmFyU3R5bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSA9ICJ0b3AiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24gPSBBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclBvc2l0aW9uKSA/ICJ0b3AiIDogdGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUG9zaXRpb24gPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5pdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvZmZlciBzb21lIGJhY2t3YXJkIGNvbXBhYmlsaXR5IGhlcmUgYXMgb2xkZXIgdmVyc2lvbiBvZiBBbHBhY2EgdXNlZCB0byBpbmNvcnJlY3RseSBsb29rIGZvcgogICAgICAgICAgICAvLyBtYXhJdGVtcywgbWluSXRlbXMgYW5kIHVuaXF1ZUl0ZW1zIG9uIHRoZSBzY2hlbWEuaXRlbXMgc3Vib2JqZWN0LgogICAgICAgICAgICAvLyBpZiBub3QgZGVmaW5lZCBwcm9wZXJseSwgd2Ugb2ZmZXIgc29tZSBhdXRvbWF0aWMgZm9yd2FyZCBtaWdyYXRpb24gb2YgdGhlc2UgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLm1heEl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLm1heEl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMubWF4SXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5taW5JdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5taW5JdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1pbkl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy51bmlxdWVJdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIHVzaW5nICJydWJ5IG9uIHJhaWxzIiBjb21wYXRpYmlsaXR5IG1vZGUKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub3B0aW9ucyAmJiB0aGlzLnBhcmVudC5vcHRpb25zLmZvcm0gJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMucnVieXJhaWxzKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucnVieXJhaWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRvb2xiYXJTdGlja3kgPSBBbHBhY2EuZGVmYXVsdFRvb2xiYXJTdGlja3k7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3RpY2t5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9vbGJhclN0aWNreSA9IHRoaXMudmlldy50b29sYmFyU3RpY2t5OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9vbGJhclN0aWNreSA9IHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSA9IHRvb2xiYXJTdGlja3k7CgogICAgICAgICAgICAvLyBieSBkZWZhdWx0LCBoaWRlIHRvb2xiYXIgd2hlbiBjaGlsZHJlbi5jb3VudCA+IDAKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuaGlkZVRvb2xiYXJXaXRoQ2hpbGRyZW4pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRW5hYmxlIGZvcmNlUmV2YWxpZGF0aW9uIG9wdGlvbiBzbyB0aGF0IGFueSBjaGFuZ2UgaW4gY2hpbGRyZW4gd2lsbCB0cmlnZ2VyIHBhcmVudCdzIHJldmFsaWRhdGlvbi4KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuZGF0YSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIiIgPT0gdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdG8gYmUgYSBzZXJpYWxpemVkIGFycmF5IG9yIG9iamVjdCwgY29udmVydAogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlZEpTT04gPSBBbHBhY2EucGFyc2VKU09OKHRoaXMuZGF0YSk7CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkocGFyc2VkSlNPTikgJiYgIUFscGFjYS5pc09iamVjdChwYXJzZWRKU09OKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIHBhcnNlZCBzdHJpbmcgZGF0YSBidXQgaXQgd2FzIG5vdCBhbiBhcnJheTogIiArIHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHBhcnNlZEpTT047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUganVzdCBhIHN0cmluZyB2YWx1ZSwgcHV0IGludG8gYXJyYXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbdGhpcy5kYXRhXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLmRhdGEpICYmICFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIkFycmF5RmllbGQgZGF0YSBpcyBub3QgYW4gYXJyYXk6ICIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQUNUSU9OUwogICAgICAgICAgICAvLwogICAgICAgICAgICB2YXIgYXBwbHlBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25zLCBrZXksIGFjdGlvbkNvbmZpZykgewogICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNlbGYuZmluZEFjdGlvbihhY3Rpb25zLCBrZXkpOwogICAgICAgICAgICAgICAgaWYgKCFhY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJjb3JlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGFjdGlvbkNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGlmICghYWN0aW9uW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbltrXSA9IGFjdGlvbkNvbmZpZ1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjbGVhbnVwQWN0aW9ucyA9IGZ1bmN0aW9uKGFjdGlvbnMsIHNob3dMYWJlbHMpIHsKICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgIGRvIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYWN0aW9uc1tpXS5lbmFibGVkKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1tpXS5lbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgbGFiZWwgaWYgZ2xvYmFsIGRpc2FibGUKICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dMYWJlbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFjdGlvbnNbaV0ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbnNbaV0uZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBhY3Rpb25zLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgLy8gc29ydCBzbyB0aGF0IGNvcmUgYWN0aW9ucyBhcHBlYXIgZmlyc3QKICAgICAgICAgICAgICAgIGFjdGlvbnMuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEuY29yZSAmJiAhYi5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmNvcmUgJiYgYi5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc2V0IHVwIGRlZmF1bHQgYWN0aW9ucyBmb3IgdGhlIHRvcCBhcnJheSB0b29sYmFyCiAgICAgICAgICAgIHNlbGYudG9vbGJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRvb2xiYXIpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXJba10gPSBBbHBhY2EuY29weU9mKHNlbGYub3B0aW9ucy50b29sYmFyW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYudG9vbGJhci5zaG93TGFiZWxzKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNlbGYudG9vbGJhci5zaG93TGFiZWxzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYudG9vbGJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuYWN0aW9ucyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCAiYWRkIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJhZGRJdGVtQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlVG9vbEJhckFkZEl0ZW1DbGljayhmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYudG9vbGJhci5hY3Rpb25zLCBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyk7CgogICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBhZGQgaW50byB0aGUgcGVyLWl0ZW0gYWN0aW9uYmFyCiAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyID0ge307CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrMiBpbiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25iYXJbazJdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMuYWN0aW9uYmFyW2syXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYuYWN0aW9uYmFyLmFjdGlvbnMpIHsKICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAiYWRkIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJhZGRCdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJhZGQiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgiYWRkSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhckFkZEl0ZW1DbGljayhpdGVtSW5kZXgsIGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgInJlbW92ZSIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgicmVtb3ZlQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicmVtb3ZlIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoInJlbW92ZUljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJSZW1vdmVJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJ1cCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgidXBCdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJ1cCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJ1cEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImRvd24iLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoImRvd25CdXR0b25MYWJlbCIpLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJkb3duIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImRvd25JY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYW51cEFjdGlvbnMoc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscyk7CgogICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGRhdGEgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5kYXRhKTsKICAgICAgICAgICAgZGF0YS5sZW5ndGggPSBsZW47CgogICAgICAgICAgICB0aGlzLmRhdGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkYXRhKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhcGFydCB0aGUgYXJyYXkgYW5kIHNldCBvbnRvIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFBbHBhY2EuaXNBcnJheShkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgZmllbGRzCiAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IGkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEZpZWxkLnNldFZhbHVlKGRhdGFbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlSXRlbShpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkYXRhIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGNoaWxkIGVsZW1lbnRzCiAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBhZGQgdGhlIG5ldyBmaWVsZHMKICAgICAgICAgICAgaWYgKGkgPCBkYXRhLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbVNjaGVtYSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiVW5hYmxlIHRvIHJlc29sdmUgc2NoZW1hIGZvciBpdGVtOiAiICsgaSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHdhdGVyZmFsbCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gKGZ1bmN0aW9uKGksIGRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaSwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGRhdGFbaV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaSwgZGF0YSk7CgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jcy5wdXNoKGYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UncmUgZW1wdHkgYW5kIHdlJ3JlIGFsc28gbm90IHJlcXVpcmVkLCB0aGVuIHdlIGhhbmQgYmFjayBlbXB0eSBzZXQKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGNvbnN0cnVjdCBhbiBhcnJheSBhbmQgaGFuZCBpdCBiYWNrCiAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYodiAhPT0gdikgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIHYgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgby5wdXNoKHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqCiAgICAgICAgICogQ3JlYXRlcyBzdWItaXRlbXMgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5kYXRhICYmIHNlbGYuZGF0YS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdG90YWxJdGVtQ291bnQgPSBzZWxmLmRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGl0ZW1zQnlJbmRleCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vIGFsbCBpdGVtcyB3aXRoaW4gdGhlIGFycmF5IGhhdmUgdGhlIHNhbWUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBvbmx5IG5lZWQgdG8gbG9hZCB0aGlzIG9uY2UKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHdhdGVyZmFsbCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2VsZi5kYXRhLmxlbmd0aDsgaW5kZXgrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuZGF0YVtpbmRleF07CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGYgPSAoZnVuY3Rpb24oaW5kZXgsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKGluZGV4LCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgdmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlJbmRleFtpbmRleF0gPSBpdGVtOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB9KShpbmRleCwgdmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChwZik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwoZnVuY3MsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBpbnRlbmRlZCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsSXRlbUNvdW50OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNCeUluZGV4W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBjcmVhdGVJdGVtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICogQHBhcmFtIGl0ZW1TY2hlbWEKICAgICAgICAgKiBAcGFyYW0gaXRlbU9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0gaXRlbURhdGEKICAgICAgICAgKiBAcGFyYW0gcG9zdFJlbmRlckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWF4SXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBmb3JtRWwuYWxwYWNhKHsKICAgICAgICAgICAgICAgICAgICAiZGF0YSIgOiBpdGVtRGF0YSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgICAgICJzY2hlbWEiIDogaXRlbVNjaGVtYSwKICAgICAgICAgICAgICAgICAgICAidmlldyIgOiB0aGlzLnZpZXcuaWQgPyB0aGlzLnZpZXcuaWQgOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgICAgICJlcnJvciI6IGZ1bmN0aW9uKGVycikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAicmVuZGVyIjogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhcmVudCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIGl0ZW0gcGF0aAogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArICJbIiArIGluZGV4ICsgIl0iOwogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpZWxkQ29udHJvbC5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscGFjYSBmaW5pc2hlZAoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1FbCA9IEFscGFjYS50bXBsKHNlbGYuY29udGFpbmVySXRlbVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHNlbGYub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSwKCQkJCQkJCSJ0b29sYmFyTG9jYXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhckxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblBvaW50RWwgPSAkKGNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiQ2Fubm90IGZpbmQgaW5zZXJ0aW9uIHBvaW50IGZvciBmaWVsZDogIiArIHNlbGYuZ2V0SWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW50byBwbGFjZQogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnRFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNvbnRhaW5lckl0ZW1FbCA9IGNvbnRhaW5lckl0ZW1FbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgYWZ0ZXIgcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihjb250cm9sLCBmdW5jdGlvbihfY29udHJvbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUjogaHR0cHM6Ly9naXRodWIuY29tL2dpdGFuYS9hbHBhY2EvcHVsbC8xMjQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLml0ZW1zLnBvc3RSZW5kZXIuY2FsbChjb250cm9sLCBpbnNlcnRpb25Qb2ludEVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlbmRlckNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMgdG8gdXRpbGl6ZSBmb3IgaXRlbXMgd2l0aGluIHRoaXMgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhdmVhdDogIGlmIHdlJ3JlIGluIHJlYWQtb25seSBtb2RlLCB0aGUgY2hpbGQgbXVzdCBhbHNvIGJlIGluIHJlYWQtb25seSBtb2RlCiAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkSXRlbVNjaGVtYSwgcmVzb2x2ZWRJdGVtT3B0aW9ucywgY2lyY3VsYXIpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGl0ZW1PcHRpb25zOwogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCBmb3Igb3B0aW9ucy5maWVsZHMuaXRlbQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbSkgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLmZpZWxkcy5pdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXRlbU9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zLml0ZW1zKSB7CiAgICAgICAgICAgICAgICBpdGVtT3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuaXRlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGl0ZW1TY2hlbWE7CiAgICAgICAgICAgIGlmIChfdGhpcy5zY2hlbWEgJiYgX3RoaXMuc2NoZW1hLml0ZW1zKSB7CiAgICAgICAgICAgICAgICBpdGVtU2NoZW1hID0gX3RoaXMuc2NoZW1hLml0ZW1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAoaXRlbVNjaGVtYSAmJiBpdGVtU2NoZW1hWyIkcmVmIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzY2hlbWFSZWZlcmVuY2VJZCA9IGl0ZW1TY2hlbWFbIiRyZWYiXTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnNbIiRyZWYiXSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNSZWZlcmVuY2VJZCA9IGl0ZW1PcHRpb25zWyIkcmVmIl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWVsZENoYWluID0gW3RvcEZpZWxkXTsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRDaGFpbi5wdXNoKHRvcEZpZWxkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtU2NoZW1hID0gaXRlbVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEl0ZW1PcHRpb25zID0gaXRlbU9wdGlvbnM7CgogICAgICAgICAgICAgICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zKHRvcEZpZWxkLCBzY2hlbWFSZWZlcmVuY2VJZCwgb3B0aW9uc1JlZmVyZW5jZUlkLCBmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmaWVsZCBjaGFpbiB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2lyY3VsYXJpdHkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRDaGFpbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZENoYWluW2ldLnNjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09IHNjaGVtYVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHNjaGVtYVJlZmVyZW5jZUlkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChmaWVsZENoYWluW2ldLnNjaGVtYVsiJHJlZiJdID09PSBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgaGlnaGVyIGxpbWl0IGZvciBhcnJheXMsIHBlcmhhcHMgMTAKICAgICAgICAgICAgICAgICAgICAvL3ZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEwKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkSXRlbVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEl0ZW1TY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgb3JpZ2luYWxJdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtU2NoZW1hLCBpdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc29sdmVkSXRlbVNjaGVtYS5pZDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkSXRlbU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgb3JpZ2luYWxJdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1PcHRpb25zLCBpdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubmV4dFRpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZVVuaXF1ZUl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJ2YWx1ZU5vdFVuaXF1ZSIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWF4SXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWluSXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoIm5vdEVub3VnaEl0ZW1zIiksIFt0aGlzLnNjaGVtYS5taW5JdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidmFsdWVOb3RVbmlxdWUiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl1bInN0YXR1cyJdICYmIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWF4SXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNYXhJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1heEl0ZW1zICYmIHRoaXMuc2NoZW1hLm1heEl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA+PSB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIHJlYWNoZWQgdG8gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVFcXVhbE1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpIDw9IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2l6ZSgpIDwgdGhpcy5zY2hlbWEubWluSXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIG92ZXIgbWF4SXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIG92ZXIgbWF4SXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1heEl0ZW1zICYmIHRoaXMuc2NoZW1hLm1heEl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA+IHRoaXMuc2NoZW1hLm1heEl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGFsbCBpdGVtcyBhcmUgdW5pcXVlLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGFsbCBpdGVtcyBhcmUgdW5pcXVlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVVuaXF1ZUl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBoYXNoID0ge307CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaFtrZXldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGFzaFtrZXldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgZmluZEFjdGlvbjogZnVuY3Rpb24oYWN0aW9uc0FycmF5LCBhY3Rpb25LZXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYWN0aW9uID0gbnVsbDsKCiAgICAgICAgICAgICQuZWFjaChhY3Rpb25zQXJyYXksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgIGlmICh2LmFjdGlvbiA9PT0gYWN0aW9uS2V5KSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBhY3Rpb247CiAgICAgICAgfSwKCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGFyZSB6ZXJvIGNoaWxkcmVuLCBzaG93IHRoZSBhcnJheSB0b29sYmFyCiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qCiAgICAgICAgYWZ0ZXJBcHBseUNyZWF0ZWRJdGVtczogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGFyZSB6ZXJvIGNoaWxkcmVuLCBzaG93IHRoZSBhcnJheSB0b29sYmFyCiAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBjaGlsZHJlbi4KICAgICAgICAgKi8KICAgICAgICBnZXRTaXplOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBPVkVSUklERQogICAgICAgICAqCiAgICAgICAgICogQWRqdXN0IHRoZSBwYXRoIGFuZCBuYW1lIGFoZWFkIG9mIHJlZnJlc2hpbmcgdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnVwZGF0ZVBhdGhBbmROYW1lKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBnZXRzIGludm9rZWQgYWZ0ZXIgaXRlbXMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkLCByZW1vdmVkIG9yIG1vdmVkIGFyb3VuZCBpbiB0aGUgY2hpbGQgY2hhaW4uCiAgICAgICAgICogSXQgYWRqdXN0cyBjbGFzc2VzIG9uIGNoaWxkIERPTSBlbGVtZW50cyB0byBtYWtlIHN1cmUgdGhleSdyZSBjb3JyZWN0LgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBhdGhBbmROYW1lOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdXBkYXRlQ2hpbGRyZW5QYXRoQW5kTmFtZSA9IGZ1bmN0aW9uKHBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2gocGFyZW50LmNoaWxkcmVuLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZVBhdGggJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5wYXRoLCBwYXJlbnQucHJlUGF0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlUGF0aCA9IHYucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucGF0aCA9IHYucGF0aC5yZXBsYWNlKHBhcmVudC5wcmVQYXRoLCBwYXJlbnQucGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQucHJlTmFtZSAmJiBBbHBhY2Euc3RhcnRzV2l0aCh2Lm5hbWUsIHBhcmVudC5wcmVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5uYW1lLnJlcGxhY2UocGFyZW50LnByZU5hbWUsIHBhcmVudC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodi5maWVsZCkuYXR0cigibmFtZSIsIHYubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUodik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSB2LnBhdGgubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdFNlZ21lbnQgPSB2LnBhdGguc3Vic3RyaW5nKGlkeCsxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50LmluZGV4T2YoIlsiKSA+IDAgJiYgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHBhcnNlSW50KGxhc3RTZWdtZW50LnN1YnN0cmluZyhsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgKyAxLCBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggIT09IGkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHYucGF0aCA9IHYucGF0aC5zdWJzdHJpbmcoMCwgaWR4KSArICIvIiArIGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBsYXN0U2VnbWVudC5pbmRleE9mKCJbIikpICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgKHYubmFtZUNhbGN1bGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZU5hbWUgPSB2Lm5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5wYXJlbnQgJiYgdi5wYXJlbnQubmFtZSAmJiB2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYucGFyZW50Lm5hbWUgKyAiXyIgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhdGgucmVwbGFjZSgvXC8vZywgIiIpLnJlcGxhY2UoL1xbL2csICJfIikucmVwbGFjZSgvXF0vZywgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQub3B0aW9ucy5ydWJ5cmFpbHMgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2LnBhcmVudC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodi5maWVsZCkuYXR0cigibmFtZSIsIHYubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXYucHJlUGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlUGF0aCA9IHYucGF0aDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUodik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHN0YXR1cyBvZiBhcnJheSBpdGVtIGFjdGlvbiB0b29sYmFyIGJ1dHRvbnMuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlVG9vbGJhcnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXkgbW9kZSwgd2UgZG8gbm90IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiZGlzcGxheSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gcmVhZG9ubHkgbW9kZSwgZG9uJ3QgZG8gdGhpcwogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyZSBjYWxsYmFja3MgdG8gdmlldyB0byByZW1vdmUgYW5kIGNyZWF0ZSB0b29sYmFyCiAgICAgICAgICAgIGlmIChzZWxmLnRvb2xiYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheVRvb2xiYXIiLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheVRvb2xiYXIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyZSBjYWxsYmFja3MgdG8gdmlldyB0byByZW1vdmUgYW5kIGNyZWF0ZSBhbiBhY3Rpb25iYXIgZm9yIGVhY2ggaXRlbQogICAgICAgICAgICBpZiAoc2VsZi5hY3Rpb25iYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheUFjdGlvbmJhcnMiLCB0cnVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJhcnJheUFjdGlvbmJhcnMiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVE9PTEJBUgogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdmFyIHRvb2xiYXJFbCA9ICQodGhpcy5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktdG9vbGJhcltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgIiddIik7CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaG93IHRvb2xiYXIKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5zaG93KCk7CgogICAgICAgICAgICAgICAgLy8gQ0xJQ0s6IGFycmF5IHRvb2xiYXIgYnV0dG9ucwogICAgICAgICAgICAgICAgJCh0b29sYmFyRWwpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uS2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi50b29sYmFyLmFjdGlvbnMsIGFjdGlvbktleSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykub2ZmKCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmNsaWNrLmNhbGwoc2VsZiwgYWN0aW9uS2V5LCBhY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTkJBUgogICAgICAgICAgICAvLwoKICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IHVzaW5nIHRoZSAic3RpY2t5IiB0b29sYmFyLCB0aGVuIHNob3cgYW5kIGhpZGUgdGhlIGl0ZW0gYWN0aW9uIGJ1dHRvbnMgd2hlbiBob3ZlcmVkCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpID09PSAidW5kZWZpbmVkIiB8fCB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSA9PT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCBlYWNoIGl0ZW0KICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0RmllbGRFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpOwogICAgICAgICAgICAgICAgJChpdGVtcykuZWFjaChmdW5jdGlvbihpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgYWN0aW9uYmFyIGZvciB0aGlzIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGZyb20gY29udGFpbmVySXRlbUVsCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVsID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ11bZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXg9JyIgKyBpdGVtSW5kZXggKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uYmFyRWwgJiYgYWN0aW9uYmFyRWwubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWx3YXlzIHNob3cgdGhlIGFjdGlvbmJhcnMKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddIikuY3NzKCJkaXNwbGF5IiwgImlubGluZS1ibG9jayIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWx3YXlzIGhpZGUgdGhlIGFjdGlvbmJhcnMKICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddIikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDTElDSzogYWN0aW9uYmFyIGJ1dHRvbnMKICAgICAgICAgICAgLy8gTk9URTogYWN0aW9uYmFyRWxzIHNpemUgc2hvdWxkIGJlIDAgb3IgMQogICAgICAgICAgICB2YXIgYWN0aW9uYmFyRWxzID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SW5kZXggPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4Iik7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRhcmdldEluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGJpbmQgYnV0dG9uIGNsaWNrIGhhbmRsZXJzCiAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uS2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNlbGYuZmluZEFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGF0IG1heCBjYXBhY2l0eSwgZGlzYWJsZSAiYWRkIiBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPSdhZGQnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtaW4gY2FwYWNpdHksIGRpc2FibGUgInJlbW92ZSIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNaW5JdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZW5hYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3JlbW92ZSddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBmaXJzdCBhY3Rpb25iYXIgaGFzIGl0cyAibW92ZSB1cCIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5maXJzdCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ndXAnXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gbGFzdCBhY3Rpb25iYXIgaGFzIGl0cyAibW92ZSBkb3duIiBidXR0b24gZGlzYWJsZWQKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmxhc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2Rvd24nXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gRFlOQU1JQyBNRVRIT0RTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBob3cgbWFueSBjaGlsZHJlbiBkbyB3ZSBoYXZlIGN1cnJlbnRseT8KICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOwoKICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZShpdGVtU2NoZW1hKTsKICAgICAgICAgICAgICAgIHNlbGYuYWRkSXRlbShpbnNlcnRpb25Qb2ludCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGFkZGl0aW9uIGlmIHRoZSByZXNvbHZlZCBzY2hlbWEgaXNuJ3QgY2lyY3VsYXJseSByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICAvLyBvciB0aGUgc2NoZW1hIGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNjaGVtYTogIiArIEpTT04uc3RyaW5naWZ5KGl0ZW1TY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBhcnJheVZhbHVlcyA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaXRlbUluZGV4ICsgMSwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSB1bmRlcmx5aW5nIGZpZWxkcyByZXF1aXJlIHRoZWlyIGRhdGEgdG8gYmUgcmVzZXQKICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciBmb3IgdGhlIGRpc3BsYXkgdG8gd29yayBvdXQgcHJvcGVybHkgKHJhZGlvIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlcy5zcGxpY2UoaXRlbUluZGV4ICsgMSwgMCwgaXRlbS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5VmFsdWVzKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJSZW1vdmVJdGVtQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaXRlbUluZGV4LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZUFjdGlvbkJhck1vdmVJdGVtVXBDbGljazogZnVuY3Rpb24oaXRlbUluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuc3dhcEl0ZW0oaXRlbUluZGV4LCBpdGVtSW5kZXggLSAxLCBzZWxmLm9wdGlvbnMuYW5pbWF0ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbURvd25DbGljazogZnVuY3Rpb24oaXRlbUluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuc3dhcEl0ZW0oaXRlbUluZGV4LCBpdGVtSW5kZXggKyAxLCBzZWxmLm9wdGlvbnMuYW5pbWF0ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhZGRJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoYWRkSXRlbUNvbnRhaW5lcikuYXBwZW5kKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluc2VydCBhdCBhIHNwZWNpZmljIGluZGV4CiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdFbGVtZW50ID0gYWRkSXRlbUNvbnRhaW5lci5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgKGluZGV4LTEpICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gdGhlIHRvb2xiYXIgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdmlhIHRoZSB1c2VyIGludGVyZmFjZS4gIFRoZSBtZXRob2QgY2FuIGFsc28KICAgICAgICAgKiBiZSBjYWxsZWQgcHJvZ3JhbW1hdGljYWxseSB0byBpbnNlcnQgaXRlbXMgb24gdGhlIGZseS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggdGhlIGluZGV4IHdoZXJlIHRoZSBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgdGhlIGpzb24gc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIGpzb24gb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbmV3bHkgaW5zZXJ0ZWQgaXRlbQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWF4SXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKGluZGV4LCBzY2hlbWEsIG9wdGlvbnMsIGRhdGEsIGZ1bmN0aW9uKGl0ZW0pIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RlckNoaWxkKGl0ZW0sIGluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb0FkZEl0ZW0oaW5kZXgsIGl0ZW0sIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IGFkZAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGl0ZW0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb1JlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBjaGlsZEluZGV4ICsgIiddIikucmVtb3ZlKCk7CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJSZW1vdmVJdGVtKGNoaWxkSW5kZXgsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBzZXRWYWx1ZSgpIHdoZW4gdGhlIG51bWJlciBvZiBpdGVtcyBiZWluZyBzZXQgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIKICAgICAgICAgKiBvZiBmaWVsZCBlbGVtZW50cy4KCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGNoaWxkSW5kZXggaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHJlbW92ZWQKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIHJlbW92ZWQKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdW5yZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYudW5yZWdpc3RlckNoaWxkKGNoaWxkSW5kZXgpOwoKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdGVtQ29udGFpbmVyRWwgZnJvbSBET00KICAgICAgICAgICAgICAgIHNlbGYuZG9SZW1vdmVJdGVtKGNoaWxkSW5kZXgsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogcmVtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJyZW1vdmUiLCBjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBtb3ZpbmcgYW4gaXRlbSBpbiB0aGUgYXJyYXkgdG8gYSBuZXcgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gYmUgbW92ZWQgdG8KICAgICAgICAgKiBAcGFyYW0gW0Jvb2xlYW5dIGFuaW1hdGUgd2hldGhlciB0byBhbmltYXRlCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZCBhbmQgcmVmcmVzaCBvY2N1cnMKICAgICAgICAgKi8KICAgICAgICBtb3ZlSXRlbTogZnVuY3Rpb24oc291cmNlSW5kZXgsIHRhcmdldEluZGV4LCBhbmltYXRlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBhbmltYXRlOwogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGUgPyBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA6IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc291cmNlSW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc291cmNlSW5kZXggPSBwYXJzZUludChzb3VyY2VJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRhcmdldEluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSBzZWxmLmNoaWxkcmVuLmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBzZWxmLmNoaWxkcmVuLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIHRhcmdldCBpbmRleAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPT09IHRhcmdldEluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0YXJnZXRDaGlsZCA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICBpZiAoIXRhcmdldENoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB0YXJnZXQgY2hpbGQgbm90IGZvdW5kCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYWRqdXN0ZWRUYXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwogICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFRhcmdldEluZGV4LS07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3BsaWNlIG91dCBjaGlsZAogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gc2VsZi5jaGlsZHJlbi5zcGxpY2Uoc291cmNlSW5kZXgsIDEpWzBdOwogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5zcGxpY2UoYWRqdXN0ZWRUYXJnZXRJbmRleCwgMCwgY2hpbGQpOwoKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCByZWZyZXNoCiAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigibW92ZSIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IDA7CiAgICAgICAgICAgIGlmIChhbmltYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcmVudEZpZWxkSWQgPSBzZWxmLmdldElkKCk7CgogICAgICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgc291cmNlSW5kZXggKyAiJ11bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgcGFyZW50RmllbGRJZCArICInXSIpOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ11bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgcGFyZW50RmllbGRJZCArICInXSIpOwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0d28gdGVtcCBlbGVtZW50cyBhcyBtYXJrZXJzIGZvciBzd2l0Y2gKICAgICAgICAgICAgICAgIHZhciB0ZW1wU291cmNlTWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjEnPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgICAgIHZhciB0ZW1wVGFyZ2V0TWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjInPjwvZGl2PiIpOwogICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmJlZm9yZSh0ZW1wVGFyZ2V0TWFya2VyKTsKCiAgICAgICAgICAgICAgICAvLyBtb3ZlcyBkaXYgdmlzdWFsbHkKICAgICAgICAgICAgICAgIEFscGFjYS5hbmltYXRlZE1vdmUoc291cmNlQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIGR1cmF0aW9uLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXb3JraG9yc2UgbWV0aG9kIGZvciBzd2FwcGluZyBhbiBpdGVtIGZyb20gb25lIGluZGV4IGluIHRoZSBhcnJheSB0byBhbm90aGVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgc3dhcEl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNoaWxkID0gc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF07CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKCiAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuW3NvdXJjZUluZGV4XSA9IHRhcmdldENoaWxkOwogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF0gPSBzb3VyY2VDaGlsZDsKCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9LAoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFycmF5IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgbGlzdCBvZiBpdGVtcyB3aXRoIHNhbWUgZGF0YSB0eXBlIG9yIHN0cnVjdHVyZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQXJyYXkgSXRlbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2NoZW1hIGZvciBhcnJheSBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gSXRlbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBudW1iZXIgb2YgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSXRlbXMgVW5pcXVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkl0ZW0gdmFsdWVzIHNob3VsZCBiZSB1bmlxdWUgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW5bMF0pIHsKICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZShwcm9wZXJ0aWVzLnByb3BlcnRpZXMuaXRlbXMucHJvcGVydGllcywgdGhpcy5jaGlsZHJlblswXS5nZXRTY2hlbWFPZlNjaGVtYSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3RpY2t5IFRvb2xiYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLiAgSWYgZmFsc2UsIHRoZSB0b29sYmFyIGlzIGFsd2F5cyBkaXNhYmxlZC4gIElmIHVuZGVmaW5lZCBvciBudWxsLCB0aGUgdG9vbGJhciB3aWxsIGFwcGVhciB3aGVuIGhvdmVyZWQgb3Zlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBraW5kIG9mIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICdidXR0b24nIG9yICdsaW5rJy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclBvc2l0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBQb3NpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMb2NhdGlvbiBvZiB0aGUgdG9wLWxldmVsIHRvb2xiYXIgdG8gcmVuZGVyIGZvciB0aGUgYXJyYXkgZmllbGQuICBFaXRoZXIgJ3RvcCcgb3IgJ2JvdHRvbScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidG9wIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uYmFyIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBraW5kIG9mIGFjdGlvbmJhciB0byByZW5kZXIgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuICBFaXRoZXIgJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsIG9yICdyaWdodCcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidG9wIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93TGFiZWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUb29sYmFyIEFjdGlvbnMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gS2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBMYWJlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENTUyBDbGFzc2VzIGZvciBJY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpY2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENsaWNrIEhhbmRsZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXaGV0aGVyIHRvIHNob3cgbGFiZWxzIG5leHQgdG8gYWN0aW9ucyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbnMgQmFyIEFjdGlvbnMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gS2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBMYWJlbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENTUyBDbGFzc2VzIGZvciBJY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpY2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIENsaWNrIEhhbmRsZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVUb29sYmFyV2l0aENoaWxkcmVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkhpZGUgVG9vbGJhciB3aXRoIENoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB3aGV0aGVyIHRvIGhpZGUgdGhlIHRvcCB0b29sYmFyIHdoZW4gY2hpbGQgZWxlbWVudHMgYXJlIGF2YWlsYWJsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdGlja3kiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInRvb01hbnlJdGVtcyI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaXMgezB9IiwKICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVmFsdWVzIGFyZSBub3QgdW5pcXVlIiwKICAgICAgICAibm90QW5BcnJheSI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhbiBBcnJheSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYXJyYXkiLCBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygiYXJyYXkiLCAiYXJyYXkiKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZGQgTmV3IEl0ZW0iLAogICAgICAgICJhZGRCdXR0b25MYWJlbCI6ICJBZGQiLAogICAgICAgICJyZW1vdmVCdXR0b25MYWJlbCI6ICJSZW1vdmUiLAogICAgICAgICJ1cEJ1dHRvbkxhYmVsIjogIlVwIiwKICAgICAgICAiZG93bkJ1dHRvbkxhYmVsIjogIkRvd24iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCi8qanNoaW50IC1XMDgzICovIC8vIGlubGluZSBmdW5jdGlvbnMgYXJlIHVzZWQgc2FmZWx5CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQgPSBBbHBhY2EuQ29udGFpbmVyRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5yZXNvbHZlQ29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzU3RyaW5nKHRoaXMuZGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiT2JqZWN0RmllbGQgcGFyc2VkIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gb2JqZWN0OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGRhdGEgb2JqZWN0IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBhbiBvYmplY3QgYnkgdGhpcyBwb2ludCwgd2UgZG9uJ3QgaGFuZGxlIGl0CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzT2JqZWN0KGRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNvcnQgZXhpc3RpbmcgZmllbGRzIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIHRoaXMuY2hpbGRyZW5CeUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBuZXcgZGF0YSBtYXBwZWQgYnkgcHJvcGVydHkgaWQKICAgICAgICAgICAgdmFyIG5ld0RhdGFCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhQnlQcm9wZXJ0eUlkW2tdID0gZGF0YVtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIG5ldyBwcm9wZXJ0eSBpZHMKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBleGlzdHMsIHNldCB2YWx1ZSBvbnRvIGl0IGFuZCByZW1vdmUgZnJvbSBuZXdEYXRhQnlQcm9wZXJ0eUlkIGFuZCBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZAogICAgICAgICAgICAvLyBpZiBhIGZpZWxkIGRvZXNuJ3QgZXhpc3QsIGxldCBpdCByZW1haW4gaW4gbGlzdAogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIG5ld0RhdGFCeVByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgaWYgKGZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG5ld0RhdGFCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pOwoKICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld0RhdGFCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFueXRoaW5nIGxlZnQgaW4gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgZGVzY3JpYmVzIGRhdGEgdGhhdCBpcyBtaXNzaW5nLCBudWxsIG9yIGVtcHR5CiAgICAgICAgICAgIC8vIHdlIG51bGwgb3V0IHRob3NlIHZhbHVlcwogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIG5ld0RhdGFCeVByb3BlcnR5SWQgaXMgbmV3IHN0dWZmIHRoYXQgd2UgbmVlZCB0byBhZGQKICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBmaWVsZCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBzaW5jZSBpdCBydW5zIGFnYWluc3QgYSBzY2hlbWEKICAgICAgICAgICAgLy8gc28gd2UgZHJvcCB0aGlzIG9mZgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlY29uc3RydWN0cyB0aGUgZGF0YSBvYmplY3QgZnJvbSB0aGUgY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIGVtcHR5IG9iamVjdAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaGFuZCBiYWNrIGFuIG9iamVjdCB3aXRoIG91ciBjaGlsZCBwcm9wZXJ0aWVzIGluIGl0CiAgICAgICAgICAgIHZhciBvID0ge307CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9iamVjdAogICAgICAgICAgICAvLyBmb3IgZWFjaCBwcm9wZXJ0eSwgd2UgaW5zZXJ0IGl0IGludG8gYSBKU09OIG9iamVjdCB0aGF0IHdlJ2xsIGhhbmQgYmFjayBhcyB0aGUgcmVzdWx0CgogICAgICAgICAgICAvLyBpZiB0aGUgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdGhlbiB3ZSBldmFsdWF0ZSB0aG9zZSBkZXBlbmRlbmNpZXMgZmlyc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCiAgICAgICAgICAgIC8vIHJlc3VsdGluZyBwcm9wZXJ0eSBzaG91bGQgYmUgaW5jbHVkZWQKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGtleSBhbmQgdmxhdWUKICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkVmFsdWUgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYoZmllbGRWYWx1ZSAhPT0gZmllbGRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5hTgogICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXNzaWduZWRWYWx1ZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGZpZWxkVmFsdWUpID09PSAiYm9vbGVhbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSAoZmllbGRWYWx1ZT8gdHJ1ZTogZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGZpZWxkVmFsdWUpIHx8IEFscGFjYS5pc09iamVjdChmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNOdW1iZXIoZmllbGRWYWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkVmFsdWUgfHwgZmllbGRWYWx1ZSA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRWYWx1ZSA9IGZpZWxkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc3NpZ25lZFZhbHVlICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW3Byb3BlcnR5SWRdID0gYXNzaWduZWRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlcyB3aXphcmQgaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHNlbGYudmlldy5nZXRXaXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLndpemFyZENvbmZpZ3MpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYud2l6YXJkQ29uZmlncyB8fCBzZWxmLndpemFyZENvbmZpZ3MgPT09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmRDb25maWdzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi53aXphcmRDb25maWdzICYmIEFscGFjYS5pc09iamVjdChzZWxmLndpemFyZENvbmZpZ3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheW91dFRlbXBsYXRlRGVzY3JpcHRvciB8fCBzZWxmLndpemFyZENvbmZpZ3MuYmluZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHRoZSBhdXRvbWF0aWMgd2l6YXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdXRvV2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFudWFsIHdpemFyZCBiYXNlZCBvbiBsYXlvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqCiAgICAgICAgICogQ3JlYXRlcyBzdWItaXRlbXMgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CgogICAgICAgICAgICAvLyB3ZSBrZWVwIGEgbWFwIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiBvdXIgb3JpZ2luYWwgZGF0YSBvYmplY3QKICAgICAgICAgICAgLy8gYXMgd2UgcmVuZGVyIGVsZW1lbnRzIG91dCBvZiB0aGUgc2NoZW1hLCB3ZSByZW1vdmUgZnJvbSB0aGUgZXh0cmFEYXRhUHJvcGVydGllcyBtYXAKICAgICAgICAgICAgLy8gd2hhdGV2ZXIgaXMgbGVmdG92ZXIgYXJlIHRoZSBkYXRhIHByb3BlcnRpZXMgdGhhdCB3ZXJlIE5PVCByZW5kZXJlZCBiZWNhdXNlIHRoZXkgd2VyZSBub3QgcGFydAogICAgICAgICAgICAvLyBvZiB0aGUgc2NoZW1hCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJpbWFyaWx5IG1haW50YWluZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgc28gYXMgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIgb2YgbWlzbWF0Y2hlcwogICAgICAgICAgICB2YXIgZXh0cmFEYXRhUHJvcGVydGllcyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBkYXRhS2V5IGluIHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgZXh0cmFEYXRhUHJvcGVydGllc1tkYXRhS2V5XSA9IGRhdGFLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gc2VsZi5kYXRhOwogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEgJiYgc2VsZi5zY2hlbWEucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNlbGYuc2NoZW1hLnByb3BlcnRpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjZiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjaGVtYSBhbmQgdGhlIGRhdGEgbGluZSB1cCBwZXJmZWN0bHksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBwcm9wZXJ0aWVzIGluIHRoZSBkYXRhIHRoYXQgYXJlCiAgICAgICAgICAgICAgICAvLyBub3QgYWxzbyBpbiB0aGUgc2NoZW1hLCBhbmQgdGh1cywgZXh0cmFEYXRhUHJvcGVydGllcyB3aWxsIGJlIGVtcHR5LgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSBhcmUgc29tZSBwcm9wZXJ0aWVzIGluIGRhdGEgdGhhdCB3ZXJlIG5vdCBpbiBzY2hlbWEsIHRoZW4gdGhleSB3aWxsCiAgICAgICAgICAgICAgICAvLyByZW1haW4gaW4gZXh0cmFEYXRhUHJvcGVydGllcyBhbmQgd2UgY2FuIGluZm9ybSBkZXZlbG9wZXJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICB2YXIgZXh0cmFEYXRhS2V5cyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgZXh0cmFEYXRhS2V5IGluIGV4dHJhRGF0YVByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgICAgICBleHRyYURhdGFLZXlzLnB1c2goZXh0cmFEYXRhS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChleHRyYURhdGFLZXlzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlRoZXJlIHdlcmUgIiArIGV4dHJhRGF0YUtleXMubGVuZ3RoICsgIiBleHRyYSBkYXRhIGtleXMgdGhhdCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBzY2hlbWEgIiArIEpTT04uc3RyaW5naWZ5KGV4dHJhRGF0YUtleXMpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtcyk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBlYWNoIHByb3BlcnR5IGluIHRoZSBvYmplY3QgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2NoZW1hIGFuZCBvcHRpb25zIHNvIHdlIG5lZWQgdG8gcHJvY2VzcwogICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBhbmQgd2FpdCBmb3IgYWxsIHRvIGNvbXBsZXRlCgogICAgICAgICAgICB2YXIgaXRlbXNCeVByb3BlcnR5SWQgPSB7fTsKCiAgICAgICAgICAgIC8vIHdyYXAgaW50byB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUZ1bmN0aW9ucyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGF0YSA9IHNlbGYuZGF0YVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYWxsb3cgdGhpcyBpZiB3ZSBoYXZlIGRhdGEsIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlUHJvcGVydHlTY2hlbWFPcHRpb25zKHByb3BlcnR5SWQsIGZ1bmN0aW9uIChzY2hlbWEsIG9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNjaGVtYTogIiArIEpTT04uc3RyaW5naWZ5KHNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZUl0ZW0ocHJvcGVydHlJZCwgc2NoZW1hLCBvcHRpb25zLCBpdGVtRGF0YSwgbnVsbCwgZnVuY3Rpb24gKGFkZGVkSXRlbUNvbnRyb2wpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSBhZGRlZEl0ZW1Db250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBleHRyYURhdGFQcm9wZXJ0aWVzIGhlbHBlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleHRyYURhdGFQcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgfSkocHJvcGVydHlJZCwgaXRlbURhdGEsIGV4dHJhRGF0YVByb3BlcnRpZXMpOwoKICAgICAgICAgICAgICAgIHByb3BlcnR5RnVuY3Rpb25zLnB1c2gocGYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EucGFyYWxsZWwocHJvcGVydHlGdW5jdGlvbnMsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGl0ZW1zIGFycmF5IGluIGNvcnJlY3QgcHJvcGVydHkgb3JkZXIKICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gcHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYW55IG9yZGVyIGluZm9ybWF0aW9uIGluIHRoZSBpdGVtcz8KICAgICAgICAgICAgICAgIHZhciBoYXNPcmRlckluZm9ybWF0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihpdGVtc1tpXS5vcHRpb25zLm9yZGVyKSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaGFzT3JkZXJJbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckEgPSBhLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJBKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZGVyQSAtIG9yZGVyQik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2YoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBzdWItaXRlbSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcG9zdFJlbmRlckNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gcG9zdFJlbmRlckNhbGxiYWNrIGNhbGxlZCBvbmNlIHRoZSBpdGVtIGhhcyBiZWVuIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSXRlbTogZnVuY3Rpb24ocHJvcGVydHlJZCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBpbnNlcnRBZnRlcklkLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybUVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAiZGF0YSIgOiBpdGVtRGF0YSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogaXRlbU9wdGlvbnMsCiAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAidmlldyIgOiB0aGlzLnZpZXcuaWQgPyB0aGlzLnZpZXcuaWQgOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAiY29ubmVjdG9yIjogdGhpcy5jb25uZWN0b3IsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXN0cm95KCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdFRvcExldmVsIjp0cnVlLAogICAgICAgICAgICAgICAgInJlbmRlciIgOiBmdW5jdGlvbihmaWVsZENvbnRyb2wsIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhcmVudCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBwcm9wZXJ0eSBJZAogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wcm9wZXJ0eUlkID0gcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYXRoICE9PSAiLyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiLyIgKyBwcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnJlbmRlcihudWxsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiBmdW5jdGlvbihjb250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFscGFjYSBmaW5pc2hlZAoKICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXIgdGhlIG91dGVyIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGNvbnRyb2wubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHNlbGYub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogaXRlbURhdGEKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKGNvbnRhaW5lckl0ZW1FbCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChjb250YWluZXJJdGVtRWwpLmhhc0NsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgaW50byBwbGFjZQogICAgICAgICAgICAgICAgICAgICQoaW5zZXJ0aW9uUG9pbnRFbCkuYmVmb3JlKGNvbnRyb2wuZ2V0RmllbGRFbCgpKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNvbnRhaW5lckl0ZW1FbCA9IGNvbnRhaW5lckl0ZW1FbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5LCBhcyBwZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWlyY2FsL2FscGFjYS9jb21taXQvNDA2MWMzMzc4N2JkN2EyYjg2ZmI2MTMzMTczNzRkMzY1ZDlhY2M5MgogICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihjb250cm9sLCBmdW5jdGlvbihfY29udHJvbCkgewogICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlbmRlckNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIHN1Yi1vYmplY3RzIHdpdGhpbiB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9uczogZnVuY3Rpb24ocHJvcGVydHlJZCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGNvbXBsZXRpb25GdW5jdGlvbiA9IGZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3BlcnR5T3B0aW9ucy5yZWFkb25seSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2socmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eVNjaGVtYSA9IG51bGw7CiAgICAgICAgICAgIGlmIChfdGhpcy5zY2hlbWEgJiYgX3RoaXMuc2NoZW1hLnByb3BlcnRpZXMgJiYgX3RoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5U2NoZW1hID0gX3RoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zLmZpZWxkcyAmJiBfdGhpcy5vcHRpb25zLmZpZWxkc1twcm9wZXJ0eUlkXSkgewogICAgICAgICAgICAgICAgcHJvcGVydHlPcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmRsZSAkcmVmCiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVNjaGVtYSAmJiBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlSZWZlcmVuY2VJZCA9IHByb3BlcnR5U2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5U2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlPcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZmVyZW5jZUlkID0gcHJvcGVydHlPcHRpb25zWyIkcmVmIl07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBmaWVsZENoYWluID0gW3RvcEZpZWxkXTsKICAgICAgICAgICAgICAgIHdoaWxlICh0b3BGaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQgPSB0b3BGaWVsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRDaGFpbi5wdXNoKHRvcEZpZWxkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnR5U2NoZW1hOwogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zID0gcHJvcGVydHlPcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgcHJvcGVydHlSZWZlcmVuY2VJZCwgZmllbGRSZWZlcmVuY2VJZCwgZnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucykgewoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmaWVsZCBjaGFpbiB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2lyY3VsYXJpdHkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRDaGFpbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZENoYWluW2ldLnNjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpIHx8IChmaWVsZENoYWluW2ldLnNjaGVtYS5pZCA9PT0gIiMiICsgcHJvcGVydHlSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gcHJvcGVydHlSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIGNpcmN1bGFyID0gKHJlZkNvdW50ID4gMSk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5U2NoZW1hID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlTY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIG9yaWdpbmFsIGlkCiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgJiYgb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3BlcnR5U2NoZW1hLmlkID0gb3JpZ2luYWxQcm9wZXJ0eVNjaGVtYS5pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9kZWxldGUgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkUHJvcGVydHlPcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgb3JpZ2luYWxQcm9wZXJ0eU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBwcm9wZXJ0eU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSwgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbihwcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBtb2RlbC5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gbW9kZWwuaXRlbXNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gaXRlbS5wcm9wZXJ0eUlkOwoKICAgICAgICAgICAgICAgICAgICAvLyBIQU5ETEUgUFJPUEVSVFkgREVQRU5ERU5DSUVTIChJRiBUSEUgUFJPUEVSVFkgSEFTIFRIRU0pCgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgc2hvdyBvciBoaWRlIHRoaXMgYWRkZWQgaXRlbSByaWdodCBhd2F5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIGJpbmQgdXBkYXRlIGhhbmRsZXJzIHRvIGRlcGVuZGVudCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudChwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCB0cmlnZ2VyIHRob3NlIHRvIGVuc3VyZSBpdCBpcyBpbiB0aGUgcmlnaHQgc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hEZXBlbmRlbnRGaWVsZFN0YXRlcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYoMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlQcm9wZXJ0aWVzIiksIFt0aGlzLnNjaGVtYS5tYXhQcm9wZXJ0aWVzXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pblByb3BlcnRpZXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5taW5Qcm9wZXJ0aWVzXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55UHJvcGVydGllcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJ0b29GZXdQcm9wZXJ0aWVzIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIG1heFByb3BlcnRpZXMgc2NoZW1hIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgbWF4UHJvcGVydGllcyBpcyBzYXRpc2ZpZWQKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXhQcm9wZXJ0aWVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hWyJtYXhQcm9wZXJ0aWVzIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1heFByb3BlcnRpZXMgPSB0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdOwoKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgICAgdmFyIHByb3BlcnR5Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvcGVydHlDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlDb3VudCA8PSBtYXhQcm9wZXJ0aWVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIG1heFByb3BlcnRpZXMgc2NoZW1hIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgbWF4UHJvcGVydGllcyBpcyBzYXRpc2ZpZWQKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuc2NoZW1hWyJtaW5Qcm9wZXJ0aWVzIl0pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1pblByb3BlcnRpZXMgPSB0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdOwoKICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgICAgdmFyIHByb3BlcnR5Q291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvcGVydHlDb3VudCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlDb3VudCA+PSBtaW5Qcm9wZXJ0aWVzOwogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBERVBFTkRFTkNJRVMKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3Mgb3IgaGlkZXMgYSBwcm9wZXJ0eSdzIGZpZWxkIGJhc2VkIG9uIGhvdyBpdHMgZGVwZW5kZW5jaWVzIGV2YWx1YXRlLgogICAgICAgICAqIElmIGEgcHJvcGVydHkgZG9lc24ndCBoYXZlIGRlcGVuZGVuY2llcywgdGhpcyBuby1vcHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIHNob3dPckhpZGVQcm9wZXJ0eUJhc2VkT25EZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy5kZXRlcm1pbmVBbGxEZXBlbmRlbmNpZXNWYWxpZChwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLnNob3coKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRSZXZlYWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW0uaGlkZSgpOwogICAgICAgICAgICAgICAgaXRlbS5vbkRlcGVuZGVudENvbmNlYWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlbS5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlc29sdmluZyBkZXBlbmRlbmNpZXMgZm9yIGEgY2hpbGQgcHJvcGVydHkuCiAgICAgICAgICogVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgSlNPTiBTY2hlbWEgdjQgYW5kIGFsc28gcHJvdmlkZXMgZm9yIGxlZ2FjeSB2MyBzdXBwb3J0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBnZXRDaGlsZERlcGVuZGVuY2llczogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGZpcnN0LCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIHdpdGhpbiB0aGUgb2JqZWN0IChjb250YWluZXIpCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gbnVsbDsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmRlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbURlcGVuZGVuY2llcyA9IHRoaXMuc2NoZW1hLmRlcGVuZGVuY2llc1twcm9wZXJ0eUlkXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBvbiB0aGUgaXRlbSBpdHNlbGYKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBzY2hlbWEKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSBpdGVtLnNjaGVtYS5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtRGVwZW5kZW5jaWVzOwogICAgICAgIH0sCgogICAgICAgIGdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXRlbUNvbmRpdGlvbmFsRGVwZW5kZW5jaWVzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIHNlY29uZCwgY2hlY2sgZm9yIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBvbiB0aGUgaXRlbSBpdHNlbGYKICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBzdXBwb3J0IGxlZ2FjeSB2MyBqc29uIG9wdGlvbnMKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbmFsRGVwZW5kZW5jaWVzID0gaXRlbS5vcHRpb25zLmRlcGVuZGVuY2llczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlcGVuZGVuY2llcyBmb3IgYSBwcm9wZXJ0eSBwYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBkZXRlcm1pbmVBbGxEZXBlbmRlbmNpZXNWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIHdpdGhpbiB0aGUgb2JqZWN0IChjb250YWluZXIpCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTs7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyB5ZXMsIHdlIHBhc3MKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxpZCA9IHNlbGYuZGV0ZXJtaW5lU2luZ2xlRGVwZW5kZW5jeVZhbGlkKHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIGZpZWxkIHVwZGF0ZXMgdG8gYW55IGZpZWxkIGRlcGVuZGVuY2llcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgYmluZERlcGVuZGVuY3lGaWVsZFVwZGF0ZUV2ZW50OiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIGJpbmRFdmVudCA9IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmN5UHJvcGVydHlJZCBpcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHByb3BlcnR5IHRoYXQgdGhlIGZpZWxkICJwcm9wZXJ0eUlkIiBpcyBkZXBlbmRlbnQgb24KCiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRGaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkuYmluZCgiZmllbGR1cGRhdGUiLCAoZnVuY3Rpb24ocHJvcGVydHlGaWVsZCwgZGVwZW5kZW5jeUZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgImRlcGVuZGVuY3lQcm9wZXJ0eUlkIiBjaGFuZ2VkIGFuZCBhZmZlY3RzIHRhcmdldCBwcm9wZXJ0eSAoInByb3BlcnR5SWQiKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBVSSBzdGF0ZSBmb3IgdGFyZ2V0IHByb3BlcnR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3dPckhpZGVQcm9wZXJ0eUJhc2VkT25EZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgfSkoaXRlbSwgZGVwZW5kZW50RmllbGQsIHByb3BlcnR5SWQsIGRlcGVuZGVuY3lQcm9wZXJ0eUlkKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgZmllbGQgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiaW5kRXZlbnQocHJvcGVydHlJZCwgaXRlbURlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtRGVwZW5kZW5jaWVzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBiaW5kRXZlbnQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgcHJvcGVydHlGaWVsZCA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghcHJvcGVydHlGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGl0ZW1EZXBlbmRlbmNpZXMgPSBzZWxmLmdldENoaWxkRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28gc2ltcGxlIHJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbgogICAgICAgICAgICB2YXIgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkgPSBmdW5jdGlvbihvdGhlclByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBkZXBlbmRlbnRGaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgb3RoZXJQcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRGaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkoaXRlbURlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtRGVwZW5kZW5jaWVzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRmllbGRVcGRhdGVGb3JQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIGEgc2luZ2xlIHByb3BlcnR5J3MgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogSW4gb3JkZXIgdG8gYmUgdmFsaWQsIHRoZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgbXVzdCBleGlzdCAoSlNPTiBzY2hlbWEpIGFuZCBvcHRpb25hbGx5IG11c3Qgc2F0aXNmeQogICAgICAgICAqIGFueSBkZXBlbmRlbmN5IG9wdGlvbnMgKHZhbHVlIG1hdGNoZXMgdXNpbmcgYW4gQU5EKS4gIEZpbmFsbHksIHRoZSBkZXBlbmRlbmN5IGZpZWxkIG11c3QgYmUgc2hvd2luZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eUlkIEZpZWxkIHByb3BlcnR5IGlkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXBlbmRlbnRPblByb3BlcnR5SWQgUHJvcGVydHkgaWQgb2YgdGhlIGRlcGVuZGVuY3kgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBhbGwgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBzYXRpc2ZpZWQgYW5kIHRoZSBmaWVsZCBuZWVkcyB0byBiZSBzaG93biwKICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lU2luZ2xlRGVwZW5kZW5jeVZhbGlkOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbnRPblByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVja3MgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkICJkZXBlbmRlbnQtb24iIHByb3BlcnR5IGhhcyBhIHZhbHVlCiAgICAgICAgICAgIC8vIGJhc2ljIEpTT04tc2NoZW1hIHN1cHBvcnRzIHRoaXMgKGlmIGl0IGhhcyBBTlkgdmFsdWUsIGl0IGlzIGNvbnNpZGVyZWQgdmFsaWQKICAgICAgICAgICAgLy8gc3BlY2lhbCBjb25zaWRlcmF0aW9uIGZvciBib29sZWFuIGZhbHNlCiAgICAgICAgICAgIHZhciBkZXBlbmRlbnRPbkZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbnRPblByb3BlcnR5SWQpOwogICAgICAgICAgICBpZiAoIWRlcGVuZGVudE9uRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVudC1vbiBmaWVsZCBmb3VuZCwgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkZXBlbmRlbnRPbkRhdGEgPSBkZXBlbmRlbnRPbkZpZWxkLmRhdGE7CgogICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXNuJ3QgdmFsaWQKICAgICAgICAgICAgdmFyIHZhbGlkID0gZmFsc2U7CgogICAgICAgICAgICAvLyBnbyBvbmUgb2YgdHdvIGRpcmVjdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgb3Igbm90CiAgICAgICAgICAgIHZhciBjb25kaXRpb25hbERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0Q2hpbGRDb25kaXRpb25hbERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFjb25kaXRpb25hbERlcGVuZGVuY2llcyB8fCBjb25kaXRpb25hbERlcGVuZGVuY2llcy5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBCQVNJQyBERVBFTkVOREVOQ1kgQ0hFQ0tJTkcgKENPUkUgSlNPTiBTQ0hFTUEpCiAgICAgICAgICAgICAgICAvLwoKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogaWYgdGhlIGZpZWxkIGlzIGEgYm9vbGVhbiBmaWVsZCBhbmQgd2UgaGF2ZSBubyBjb25kaXRpb25hbCBkZXBlbmRlbmN5IGNoZWNraW5nLAogICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBzZXQgdmFsaWQgPSBmYWxzZSBpZiB0aGUgZmllbGQgZGF0YSBpcyBhIGJvb2xlYW4gZmFsc2UKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICF0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdLm9wdGlvbnMuZGVwZW5kZW5jaWVzICYmICFkZXBlbmRlbnRPbkRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9ICFBbHBhY2EuaXNWYWxFbXB0eShkZXBlbmRlbnRPbkZpZWxkLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIENPTkRJVElPTkFMIERFUEVOREVOQ1kgQ0hFQ0tJTkcgKEFMUEFDQSBFWFRFTlNJT04gVklBIE9QVElPTlMpCiAgICAgICAgICAgICAgICAvLwoKICAgICAgICAgICAgICAgIC8vIEFscGFjYSBleHRlbmRzIEpTT04gc2NoZW1hIGJ5IGFsbG93aW5nIGRlcGVuZGVuY2llcyB0byB0cmlnZ2VyIG9ubHkgZm9yIHNwZWNpZmljIHZhbHVlcyBvbiB0aGUKICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVudCBmaWVsZHMuICBJZiBvcHRpb25zIGFyZSBzcGVjaWZpZWQgdG8gZGVmaW5lIHRoaXMsIHdlIHdhbGsgdGhyb3VnaCBhbmQgcGVyZm9ybSBhbgogICAgICAgICAgICAgICAgLy8gQU5EIG9wZXJhdGlvbiBhY3Jvc3MgYW55IGZpZWxkcwoKICAgICAgICAgICAgICAgIC8vIGRvIHNvbWUgZGF0YSBzYW5pdHkgY2xlYW51cAogICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVudE9uRmllbGQuZ2V0VHlwZSgpID09PSAiYm9vbGVhbiIgJiYgIWRlcGVuZGVudE9uRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudE9uRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25hbERhdGEgPSBjb25kaXRpb25hbERlcGVuZGVuY2llc1tkZXBlbmRlbnRPblByb3BlcnR5SWRdOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBvcHRpb24gaXMgYSBmdW5jdGlvbiwgdGhlbiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2hvdwogICAgICAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIGV2YWx1YXRlcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNjaGVtYS1iYXNlZCBmYWxsYmFjayBkZXRlcm1pbmVkIHdlIHNob3VsZCBzaG93CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY29uZGl0aW9uYWxEYXRhKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGNvbmRpdGlvbmFsRGF0YS5jYWxsKHRoaXMsIGRlcGVuZGVudE9uRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRydWUKICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25kaXRpb25hbCBkYXRhIGlzIGFuIGFycmF5IG9mIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShjb25kaXRpb25hbERhdGEpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhcnJheSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5hbnlFcXVhbGl0eShkZXBlbmRlbnRPbkRhdGEsIGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb2JqZWN0IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZGl0aW9uYWxEYXRhKSAmJiAhQWxwYWNhLmFueUVxdWFsaXR5KGNvbmRpdGlvbmFsRGF0YSwgZGVwZW5kZW50T25EYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gTkVTVEVEIEhJRERFTlMgREVQRU5ERU5DWSBISURFUyAoQUxQQUNBIEVYVEVOU0lPTikKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGZpbmFsIGNoZWNrOiBvbmx5IHNldCB2YWxpZCBpZiB0aGUgZGVwZW5kZW50T25Qcm9wZXJ0eUlkIGlzIHNob3dpbmcKICAgICAgICAgICAgaWYgKGRlcGVuZGVudE9uRmllbGQgJiYgZGVwZW5kZW50T25GaWVsZC5pc0hpZGRlbigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjaGlsZCBpbmRleC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqLwogICAgICAgIGdldEluZGV4OiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHByb3BlcnR5SWQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcGlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgaWYgKHBpZCA9PSBwcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gRFlOQU1JQyBNRVRIT0RTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhbiBpdGVtIHRvIHRoZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVNjaGVtYSBzY2hlbWEKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPcHRpb25zIENoaWxkIGZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIENoaWxkIGZpZWxkIHZhbHVlCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGluc2VydEFmdGVySWQgTG9jYXRpb24gd2hlcmUgdGhlIGNoaWxkIGl0ZW0gd2lsbCBiZSBpbnNlcnRlZC4KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGFkZEl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmNyZWF0ZUl0ZW0ocHJvcGVydHlJZCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBpbnNlcnRBZnRlcklkLCBmdW5jdGlvbihjaGlsZCkgewoKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QWZ0ZXJJZCAmJiBzZWxmLmNoaWxkcmVuQnlJZFtpbnNlcnRBZnRlcklkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyB6KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlblt6XS5nZXRJZCgpID09IGluc2VydEFmdGVySWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gejsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RlckNoaWxkKGNoaWxkLCAoKGluZGV4ICE9IG51bGwpID8gaW5kZXggKyAxIDogMCkpOwoKICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgc2VsZi5kb0FkZEl0ZW0oaW5kZXgsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAvL3NlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IGFkZAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYWRkIiwgY2hpbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyICJyZWFkeSIKICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsICJyZWFkeSIsICJkb3duIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb0FkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluc2VydCBmaXJzdCBpbnRvIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucHJlcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgaW5kZXggKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGFmdGVyCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LmFmdGVyKGl0ZW0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyQWRkSXRlbShpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHJlYWR5CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KGl0ZW0pOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoc2VsZi5jb250YWluZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbW92ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoY2hpbGRGaWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9ICQuZ3JlcCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAodmFsLCBpbmRleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsLnByb3BlcnR5SWQgIT09IHByb3BlcnR5SWQpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jaGlsZHJlbkJ5SWRbY2hpbGRGaWVsZC5nZXRJZCgpXTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEZpZWxkKTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb1JlbW92ZUl0ZW06IGZ1bmN0aW9uKGl0ZW0pCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgcmVtb3ZlSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgcmVtb3ZlSXRlbUNvbnRhaW5lci5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lPSciICsgaXRlbS5uYW1lICsgIiddIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBkZXN0cm95IGNoaWxkIGZpZWxkIGl0c2VsZgogICAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBXSVpBUkQKICAgICAgICAvLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgLyoqCiAgICAgICAgICogV3JhcHMgdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gYSB3aXphcmQgY29udGFpbmVyIGFuZCB3aXJlcyB1cCB0aGUgbmF2aWdhdGlvbiBhbmQgYnV0dG9ucyBzbyB0aGF0CiAgICAgICAgICogd2l6YXJkIGVsZW1lbnRzIGZsaXAgbmljZWx5LgogICAgICAgICAqLwogICAgICAgIHdpemFyZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY29uZmlnLWRyaXZlbgogICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0b3JzID0gdGhpcy53aXphcmRDb25maWdzLnN0ZXBzOwogICAgICAgICAgICBpZiAoIXN0ZXBEZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3JzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdpemFyZFRpdGxlID0gdGhpcy53aXphcmRDb25maWdzLnRpdGxlOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSB0aGlzLndpemFyZENvbmZpZ3MuZGVzY3JpcHRpb247CiAgICAgICAgICAgIHZhciBidXR0b25EZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5idXR0b25zOwogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9ycyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdID0ge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSA9ICJQcmV2aW91cyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24gPSAibGVmdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdID0ge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udGl0bGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udGl0bGUgPSAiTmV4dCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLmFsaWduKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLmFsaWduID0gInJpZ2h0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy53aXphcmRDb25maWdzLmhpZGVTdWJtaXRCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdID0ge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnRpdGxlID0gIlN1Ym1pdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS5hbGlnbikgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInN1Ym1pdCJdLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgYnV0dG9uS2V5IGluIGJ1dHRvbkRlc2NyaXB0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzW2J1dHRvbktleV0udHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1N0ZXBzID0gdGhpcy53aXphcmRDb25maWdzLnNob3dTdGVwczsKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93U3RlcHMpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzaG93UHJvZ3Jlc3NCYXIgPSB0aGlzLndpemFyZENvbmZpZ3Muc2hvd1Byb2dyZXNzQmFyOwogICAgICAgICAgICB2YXIgcGVyZm9ybVZhbGlkYXRpb24gPSB0aGlzLndpemFyZENvbmZpZ3MudmFsaWRhdGlvbjsKICAgICAgICAgICAgaWYgKHR5cGVvZihwZXJmb3JtVmFsaWRhdGlvbikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXRpdGxlIik7CiAgICAgICAgICAgIHZhciB3aXphcmREZXNjcmlwdGlvbiA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWRlc2NyaXB0aW9uIik7CiAgICAgICAgICAgIHZhciBfd2l6YXJkVmFsaWRhdGlvbiA9ICQodGhpcy5maWVsZCkuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXZhbGlkYXRpb24iKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkVmFsaWRhdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uID0gX3dpemFyZFZhbGlkYXRpb24gPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF93aXphcmRTaG93U3RlcHMgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zaG93LXN0ZXBzIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFNob3dTdGVwcykgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNob3dTdGVwcyA9IF93aXphcmRTaG93U3RlcHMgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF93aXphcmRTaG93UHJvZ3Jlc3NCYXIgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zaG93LXByb2dyZXNzLWJhciIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93UHJvZ3Jlc3NCYXIpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFsbCBvZiB0aGUgc3RlcHMKICAgICAgICAgICAgdmFyIHN0ZXBFbHMgPSAkKHRoaXMuZmllbGQpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIik7CgogICAgICAgICAgICAvLyBET00tZHJpdmVuIGNvbmZpZ3VyYXRpb24gb2Ygc3RlcCBkZXNjcmlwdG9ycwogICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGVwRWxzLmVhY2goZnVuY3Rpb24oaSkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0b3IgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBUaXRsZSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtdGl0bGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBUaXRsZSkgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9IHN0ZXBUaXRsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci50aXRsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLnRpdGxlID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcERlc2NyaXB0aW9uID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc3RlcC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RlcERlc2NyaXB0aW9uKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gc3RlcERlc2NyaXB0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IuZGVzY3JpcHRpb24gPSAiU3RlcCAiICsgaTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycy5wdXNoKHN0ZXBEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgc29tZXRoaW5nIGZvciBwcm9ncmVzcyBiYXIgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHNob3dQcm9ncmVzc0JhcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzdGVwRGVzY3JpcHRvcnMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLy8gbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIHdpemFyZAogICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgbW9kZWwud2l6YXJkVGl0bGUgPSB3aXphcmRUaXRsZTsKICAgICAgICAgICAgbW9kZWwud2l6YXJkRGVzY3JpcHRpb24gPSB3aXphcmREZXNjcmlwdGlvbjsKICAgICAgICAgICAgbW9kZWwuc2hvd1N0ZXBzID0gc2hvd1N0ZXBzOwogICAgICAgICAgICBtb2RlbC5wZXJmb3JtVmFsaWRhdGlvbiA9IHBlcmZvcm1WYWxpZGF0aW9uOwogICAgICAgICAgICBtb2RlbC5zdGVwcyA9IHN0ZXBEZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuYnV0dG9ucyA9IGJ1dHRvbkRlc2NyaXB0b3JzOwogICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSBzZWxmLnNjaGVtYTsKICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHNlbGYub3B0aW9uczsKICAgICAgICAgICAgbW9kZWwuZGF0YSA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgbW9kZWwuc2hvd1Byb2dyZXNzQmFyID0gc2hvd1Byb2dyZXNzQmFyOwogICAgICAgICAgICBtb2RlbC5tYXJrQWxsU3RlcHNWaXNpdGVkID0gdGhpcy53aXphcmRDb25maWdzLm1hcmtBbGxTdGVwc1Zpc2l0ZWQ7CiAgICAgICAgICAgIG1vZGVsLnZpZXcgPSBzZWxmLnZpZXc7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGFjdHVhbCB3aXphcmQKICAgICAgICAgICAgdmFyIHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoIndpemFyZCIsIHNlbGYpOwogICAgICAgICAgICBpZiAod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkRWwgPSBBbHBhY2EudG1wbCh3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmFwcGVuZCh3aXphcmRFbCk7CgogICAgICAgICAgICAgICAgdmFyIHdpemFyZE5hdiA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLW5hdiIpOwogICAgICAgICAgICAgICAgdmFyIHdpemFyZFN0ZXBzID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtc3RlcHMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRCdXR0b25zID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtYnV0dG9ucyIpOwogICAgICAgICAgICAgICAgdmFyIHdpemFyZFByb2dyZXNzQmFyID0gJCh3aXphcmRFbCkuZmluZCgiLmFscGFjYS13aXphcmQtcHJvZ3Jlc3MtYmFyIik7CgogICAgICAgICAgICAgICAgLy8gbW92ZSBzdGVwcyBpbnRvIHBsYWNlCiAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5hcHBlbmQoc3RlcEVscyk7CgogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAwOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNCdXR0b25FbCA9ICQod2l6YXJkQnV0dG9ucykuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1idXR0b24ta2V5PSdwcmV2aW91cyddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRCdXR0b25FbCA9ICQod2l6YXJkQnV0dG9ucykuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1idXR0b24ta2V5PSduZXh0J10iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3VibWl0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nc3VibWl0J10iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc25hcCBpbnRvIHBsYWNlIGEgbGl0dGxlIGNvbnRyb2xsZXIgdG8gd29yayB0aGUgYnV0dG9ucwogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmlyc3Qgc3RlcAogICAgICAgICAgICAgICAgICAgIHZhciByZWZyZXNoU3RlcHMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOQVYKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dTdGVwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RlbC52aXNpdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlzaXRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBtYXJrIGFsbCBzdGVwcyBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcEVsZW1lbnRzID0gJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0c1tnXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBzdGVwIGFzIHZpc2l0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0c1tjdXJyZW50SW5kZXhdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcEVsZW1lbnRzID0gJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygiY29tcGxldGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA8IGN1cnJlbnRJbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnID09PSBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtYXJrIGRpc2FibGVkIGZvciB0aGlzIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tnXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXg9JyIgKyBnICsgIiddIikuYWRkQ2xhc3MoInZpc2l0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBST0dSRVNTIEJBUgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuc2hvd1Byb2dyZXNzQmFyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVOb3cgPSBjdXJyZW50SW5kZXggKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTWF4ID0gbW9kZWwuc3RlcHMubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHBhcnNlSW50KCgodmFsdWVOb3cgLyB2YWx1ZU1heCkgKiAxMDApLCAxMCkgKyAiJSI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVtYXgiLCB2YWx1ZU1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuYXR0cigiYXJpYS12YWx1ZW5vdyIsIHZhbHVlTm93KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5jc3MoIndpZHRoIiwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQlVUVE9OUwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQnV0dG9uRWwuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5oaWRlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY2FzZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5zdGVwcy5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgYWxsIHN0ZXBzCiAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIilbY3VycmVudEluZGV4XSkuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgYXNzZXJ0VmFsaWRhdGlvbiA9IGZ1bmN0aW9uKGJ1dHRvbklkLCBjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwucGVyZm9ybVZhbGlkYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBvZiB0aGUgZmllbGRzIG9uIHRoZSBjdXJyZW50IHN0ZXAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVwRWwgPSAkKCQod2l6YXJkU3RlcHMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtcm9sZT0nc3RlcCddIilbY3VycmVudEluZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoY3VycmVudFN0ZXBFbCkuZmluZCgiLmFscGFjYS1maWVsZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRJZCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZElkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IHNlbGYuY2hpbGRyZW5CeUlkW2ZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBpbnRvIHZhbGlkYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZmllbGRzW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBhbGwgdmFsaWRhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgZmllbGRzW2ldLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbYnV0dG9uSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi52YWxpZGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnZhbGlkYXRlLmNhbGwoc2VsZiwgZnVuY3Rpb24oX3ZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgX3ZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh2YWxpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkKHByZXZpb3VzQnV0dG9uRWwpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Fzc2VydFZhbGlkYXRpb24oInByZXZpb3VzIiwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sicHJldmlvdXMiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4LS07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChuZXh0QnV0dG9uRWwpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIDEgPD0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbigibmV4dCIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sibmV4dCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb2N1cyB0byBzZXR0bGUgb24gaW52YWxpZCBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9jdXMoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHN1Ym1pdEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oInN1Ym1pdCIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1sic3VibWl0Il07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIGluIGEgZm9ybT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5mb3JtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb2N1cyB0byBzZXR0bGUgb24gaW52YWxpZCBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9jdXMoZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY3VzdG9tIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleV0iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICJzdWJtaXQiICYmIGtleSAhPSAibmV4dCIgJiYga2V5ICE9ICJwcmV2aW91cyIpIHsgLy8gc3RhbmRhcmQgYnV0dG9ucyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiBiLmNsaWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4XSIpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hdkluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdkluZGV4ID0gcGFyc2VJbnQobmF2SW5kZXgsIDEwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPT0gY3VycmVudEluZGV4IHx8IChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW25hdkluZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgZ29pbmcgYmFja3dhcmRzLCB0aGVuIHdlIGRvIG5vdCBydW4gdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXZJbmRleCA8IGN1cnJlbnRJbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5hdkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmF2SW5kZXggPiBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5hdkluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBpdGVtIHNob3VsZCBub3QgYmUgY2xpY2thYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oIm1vdmVUb1N0ZXAiLCBmdW5jdGlvbihldmVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBza2lwVmFsaWRhdGlvbiA9IGV2ZW50LnNraXBWYWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YoaW5kZXgpICE9PSAidW5kZWZpbmVkIikgJiYgaW5kZXggPD0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBWYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gaW5kZXg7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJhZHZhbmNlT3JTdWJtaXQiLCBmdW5jdGlvbihldmVudCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuZXh0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwoKICAgICAgICAgICAgICAgIH0od2l6YXJkTmF2LCB3aXphcmRTdGVwcywgd2l6YXJkQnV0dG9ucywgbW9kZWwpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgYSBjb25maWd1cmF0aW9uLWJhc2VkIHdpemFyZCB3aXRob3V0IGEgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqLwogICAgICAgIGF1dG9XaXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwQmluZGluZ3MgPSB0aGlzLndpemFyZENvbmZpZ3MuYmluZGluZ3M7CiAgICAgICAgICAgIGlmICghc3RlcEJpbmRpbmdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGVwQmluZGluZ3MgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eUlkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGVwQmluZGluZ3NbcHJvcGVydHlJZF0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzaG91bGQgd2UgY3JlYXRlIHN0ZXBzPwogICAgICAgICAgICB2YXIgY3JlYXRlU3RlcHMgPSB0cnVlOwogICAgICAgICAgICBpZiAoJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgdGhlcmUKICAgICAgICAgICAgICAgIGNyZWF0ZVN0ZXBzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzdGVwID0gMTsKICAgICAgICAgICAgdmFyIHN0ZXBGaWVsZHMgPSBbXTsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBmaWVsZHMgaW4gdGhpcyBzdGVwCiAgICAgICAgICAgICAgICBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID09PSBzdGVwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWQgJiYgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2wucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdLmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEZpZWxkcy5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzdGVwRmllbGRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZVN0ZXBzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVsID0gJCgnPGRpdiBkYXRhLWFscGFjYS13aXphcmQtcm9sZT0ic3RlcCI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYXBwZW5kKHN0ZXBFbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW3N0ZXAtMV0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgYW55IG9yZGVyIGluZm9ybWF0aW9uIGluIHRoZSBpdGVtcz8KICAgICAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBGaWVsZHNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcmRlckluZm9ybWF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3JkZXJJbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgYnkgb3JkZXI/CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMuc29ydChmdW5jdGlvbiAoYSwgYikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckEgPSBhLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyQiA9IGIub3B0aW9ucy5vcmRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgZWxlbWVudHMgaW4KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbCkuYXBwZW5kKHN0ZXBGaWVsZHNbaV0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHN0ZXArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gdGhlIG5vcm1hbCB3aXphcmQKICAgICAgICAgICAgdGhpcy53aXphcmQoKTsKCiAgICAgICAgICAgIC8vIGlmIHRoZSBjb250YWluZXIgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuIGxlZnQsIGhpZGUgaXQKICAgICAgICAgICAgaWYgKCQodGhpcy5jb250YWluZXIpLmNoaWxkcmVuKCkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZXMgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byB3aGljaCB0aGUgY2hpbGQgc2hvdWxkIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgbW92ZW1lbnQKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHN3YXAgd2l0aAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIik7CiAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddIik7CgogICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgIHZhciB0ZW1wU291cmNlTWFya2VyID0gJCgiPGRpdiBjbGFzcz0ndGVtcE1hcmtlcjEnPjwvZGl2PiIpOwogICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmJlZm9yZSh0ZW1wVGFyZ2V0TWFya2VyKTsKCiAgICAgICAgICAgIHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzd2FwIG9yZGVyIGluIGNoaWxkcmVuCiAgICAgICAgICAgICAgICB2YXIgdGVtcENoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHNvdXJjZUluZGV4KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkcmVuW2ldID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT09IHRhcmdldEluZGV4KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkcmVuW2ldID0gc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbiA9IHRlbXBDaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAvLyBzd2FwIG9yZGVyIGluIERPTQogICAgICAgICAgICAgICAgdGVtcFNvdXJjZU1hcmtlci5yZXBsYWNlV2l0aCh0YXJnZXRDb250YWluZXIpOwogICAgICAgICAgICAgICAgdGVtcFRhcmdldE1hcmtlci5yZXBsYWNlV2l0aChzb3VyY2VDb250YWluZXIpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhY3Rpb24gYmFyIGJpbmRpbmdzCiAgICAgICAgICAgICAgICAkKHNvdXJjZUNvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgc291cmNlSW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHRhcmdldEluZGV4KTsKICAgICAgICAgICAgICAgICQodGFyZ2V0Q29udGFpbmVyKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpLmF0dHIoImRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4Iiwgc291cmNlSW5kZXgpOwoKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChhbmltYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzd2FwIGRpdnMgdmlzdWFsbHkKICAgICAgICAgICAgICAgIEFscGFjYS5hbmltYXRlZFN3YXAoc291cmNlQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIsIDUwMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IGZpZWxkIGZvciBjb250YWluaW5nIG90aGVyIGZpZWxkcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBjaGlsZCBwcm9wZXJ0aWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHRoaXMgb2JqZWN0IGlzIGFsbG93ZWQgdG8gaGF2ZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBOdW1iZXIgb2YgUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWluaW11bSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHRoaXMgb2JqZWN0IGlzIHJlcXVpcmVkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGZpZWxkc1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnByb3BlcnRpZXMucHJvcGVydGllczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZTY2hlbWEoKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0udGl0bGUgPSBwcm9wZXJ0eUlkICsgIiA6OiAiICsgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZk9wdGlvbnMgPSBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJvcmRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcmRlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBmb3Igb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW5kZXggb2YgdGhpcyBmaWVsZCBpbiB0aGUgcHJvcGVydGllcyBhcnJheS4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgT3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIG9wdGlvbnMgZm9yIGNoaWxkIGZpZWxkcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGZpZWxkc1Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuZmllbGRzOwoKICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzID0ge307CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuW2ldLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdID0gdGhpcy5jaGlsZHJlbltpXS5nZXRTY2hlbWFPZk9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0udGl0bGUgPSBwcm9wZXJ0eUlkICsgIiA6OiAiICsgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHNjaGVtYU9mT3B0aW9ucywgcHJvcGVydGllcyk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAidG9vTWFueVByb3BlcnRpZXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgKHswfSkgaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAidG9vRmV3UHJvcGVydGllcyI6ICJUaGVyZSBhcmUgbm90IGVub3VnaCBwcm9wZXJ0aWVzICh7MH0gYXJlIHJlcXVpcmVkKSIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9iamVjdCIsIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygib2JqZWN0IiwgIm9iamVjdCIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQW55RmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQW55RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wudmFsKHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5jb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2ZvY3VzCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5mb2N1cygpOwoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQW55IGZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhbnkiLCBBbHBhY2EuRmllbGRzLkFueUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFueSIsICJhbnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkhpZGRlbkZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiaGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2xFbCgpLnZhbCgiIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2xFbCgpLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJIaWRkZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBhIGhpZGRlbiBIVE1MIGlucHV0IjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJoaWRkZW4iLCBBbHBhY2EuRmllbGRzLkhpZGRlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFkZHJlc3NGaWVsZCA9IEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhZGRyZXNzIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmRhdGEuc3RyZWV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWV0OiBbJycsICcnXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiSG9tZSBBZGRyZXNzIiwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3RyZWV0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3RyZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IDMwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXhJdGVtcyI6IDMKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjaXR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbIkFMIiwgIkFLIiwgIkFTIiwgIkFaIiwgIkFSIiwgIkNBIiwgIkNPIiwgIkNUIiwgIkRFIiwgIkRDIiwgIkZNIiwgIkZMIiwgIkdBIiwgIkdVIiwgIkhJIiwgIklEIiwgIklMIiwgIklOIiwgIklBIiwgIktTIiwgIktZIiwgIkxBIiwgIk1FIiwgIk1IIiwgIk1EIiwgIk1BIiwgIk1JIiwgIk1OIiwgIk1TIiwgIk1PIiwgIk1UIiwgIk5FIiwgIk5WIiwgIk5IIiwgIk5KIiwgIk5NIiwgIk5ZIiwgIk5DIiwgIk5EIiwgIk1QIiwgIk9IIiwgIk9LIiwgIk9SIiwgIlBXIiwgIlBBIiwgIlBSIiwgIlJJIiwgIlNDIiwgIlNEIiwgIlROIiwgIlRYIiwgIlVUIiwgIlZUIiwgIlZJIiwgIlZBIiwgIldBIiwgIldWIiwgIldJIiwgIldZIl0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ6aXAiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJaaXAgQ29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogL14oXGR7NX0oLVxkezR9KT8pPyQvCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBBbHBhY2EubWVyZ2UodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ6aXAiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogIjk5OTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiBbIkFMQUJBTUEiLCAiQUxBU0tBIiwgIkFNRVJJQ0FOIFNBTU9BIiwgIkFSSVpPTkEiLCAiQVJLQU5TQVMiLCAiQ0FMSUZPUk5JQSIsICJDT0xPUkFETyIsICJDT05ORUNUSUNVVCIsICJERUxBV0FSRSIsICJESVNUUklDVCBPRiBDT0xVTUJJQSIsICJGRURFUkFURUQgU1RBVEVTIE9GIE1JQ1JPTkVTSUEiLCAiRkxPUklEQSIsICJHRU9SR0lBIiwgIkdVQU0iLCAiSEFXQUlJIiwgIklEQUhPIiwgIklMTElOT0lTIiwgIklORElBTkEiLCAiSU9XQSIsICJLQU5TQVMiLCAiS0VOVFVDS1kiLCAiTE9VSVNJQU5BIiwgIk1BSU5FIiwgIk1BUlNIQUxMIElTTEFORFMiLCAiTUFSWUxBTkQiLCAiTUFTU0FDSFVTRVRUUyIsICJNSUNISUdBTiIsICJNSU5ORVNPVEEiLCAiTUlTU0lTU0lQUEkiLCAiTUlTU09VUkkiLCAiTU9OVEFOQSIsICJORUJSQVNLQSIsICJORVZBREEiLCAiTkVXIEhBTVBTSElSRSIsICJORVcgSkVSU0VZIiwgIk5FVyBNRVhJQ08iLCAiTkVXIFlPUksiLCAiTk9SVEggQ0FST0xJTkEiLCAiTk9SVEggREFLT1RBIiwgIk5PUlRIRVJOIE1BUklBTkEgSVNMQU5EUyIsICJPSElPIiwgIk9LTEFIT01BIiwgIk9SRUdPTiIsICJQQUxBVSIsICJQRU5OU1lMVkFOSUEiLCAiUFVFUlRPIFJJQ08iLCAiUkhPREUgSVNMQU5EIiwgIlNPVVRIIENBUk9MSU5BIiwgIlNPVVRIIERBS09UQSIsICJURU5ORVNTRUUiLCAiVEVYQVMiLCAiVVRBSCIsICJWRVJNT05UIiwgIlZJUkdJTiBJU0xBTkRTIiwgIlZJUkdJTklBIiwgIldBU0hJTkdUT04iLCAiV0VTVCBWSVJHSU5JQSIsICJXSVNDT05TSU4iLCAiV1lPTUlORyJdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMuYWRkcmVzc1ZhbGlkYXRpb24pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWRkcmVzc1ZhbGlkYXRpb24gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaXNDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBpc0NvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYWRkcmVzcyBpbiBhIHNpbmdsZSBsaW5lIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEFkZHJlc3MgYXMgYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgZ2V0QWRkcmVzczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAodGhpcy52aWV3LnR5cGUgPT09ICJ2aWV3IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiIjsKICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RyZWV0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWx1ZS5zdHJlZXQsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlICsgIiAiOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNpdHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZS5jaXR5ICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXRlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuc3RhdGUgKyAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuemlwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuemlwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNhZnRlclJlbmRlckNvbnRhaW5lcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGFkZGl0aW9uYWwgY3NzCiAgICAgICAgICAgICAgICAkKGNvbnRhaW5lcikuYWRkQ2xhc3MoImFscGFjYS1hZGRyZXNzZmllbGQiKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uICYmICFzZWxmLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFwQnV0dG9uID0gJCgnPGRpdiBjbGFzcz0iYWxwYWNhLWZvcm0tYnV0dG9uIj5TaG93IEdvb2dsZSBNYXA8L2Rpdj4nKS5hcHBlbmRUbyhjb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtYXBCdXR0b24uYnV0dG9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmJ1dHRvbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtYXBCdXR0b24uY2xpY2soZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ29vZ2xlICYmIGdvb2dsZS5tYXBzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRyZXNzID0gc2VsZi5nZXRBZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VvY29kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJzogYWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwQ2FudmFzSWQgPSBzZWxmLmdldElkKCkgKyAiLW1hcC1jYW52YXMiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyMnICsgbWFwQ2FudmFzSWQpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCI8ZGl2IGlkPSciICsgbWFwQ2FudmFzSWQgKyAiJyBjbGFzcz0nYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzJz48L2Rpdj4iKS5hcHBlbmRUbyhzZWxmLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIiksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiem9vbSI6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW50ZXIiOiByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXBUeXBlSWQiOiBnb29nbGUubWFwcy5NYXBUeXBlSWQuUk9BRE1BUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHZW9jb2RpbmcgZmFpbGVkOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGxheU1lc3NhZ2UoIkdvb2dsZSBNYXAgQVBJIGlzIG5vdCBpbnN0YWxsZWQuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KS53cmFwKCc8c21hbGwvPicpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dNYXBPbkxvYWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBCdXR0b24uY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBZGRyZXNzIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhbmRhcmQgVVMgQWRkcmVzcyB3aXRoIFN0cmVldCwgQ2l0eSwgU3RhdGUgYW5kIFppcC4gQWxzbyBjb21lcyB3aXRoIHN1cHBvcnQgZm9yIEdvb2dsZSBtYXAuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidmFsaWRhdGVBZGRyZXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWRkcmVzcyBWYWxpZGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuYWJsZSBhZGRyZXNzIHZhbGlkYXRpb24gaWYgdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWFwT25Mb2FkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IHRoZSBtYXAgd2hlbiBmaXJzdCBsb2FkZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJBZGRyZXNzIHZhbGlkYXRpb24gaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkVuYWJsZSBHb29nbGUgTWFwIGZvciBhZGRyZXNzIHZhbGlkYXRpb24/IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFkZHJlc3MiLCBBbHBhY2EuRmllbGRzLkFkZHJlc3NGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY2tlZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ja2VkaXRvcikgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ja2VkaXRvciA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gcmVuZGVyIENLIEVkaXRvcgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKENLRURJVE9SKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZyB3aXRoIENLRWRpdG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBDS0VESVRPUi5yZXBsYWNlKCQoc2VsZi5jb250cm9sKVswXSwgc2VsZi5vcHRpb25zLmNrZWRpdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRDS0VkaXRvckV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNrZWRpdG9yJ3MgZG9tIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQsIG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cCB0aGUgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbW92ZUFsbExpc3RlbmVycygpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBoZXJlIGJlY2F1c2UgQ0tFZGl0b3IgaGFzIGFuIGlzc3VlIGlmIERPTSBlbGVtZW50IGRlbGV0ZXMgYmVmb3JlIENLRWRpdG9yIGNsZWFucyB1cAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9sZW1vbmRlL2FuZ3VsYXItY2tlZGl0b3IvaXNzdWVzLzcKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgc2VsZi5lZGl0b3IuZGVzdHJveShmYWxzZSk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGluaXRDS0VkaXRvckV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gYmx1ciBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmb2N1cyBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImZvY3VzIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlwcmVzcyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTk9URTogdGhlc2UgZG8gbm90IHNlZW0gdG8gd29yayB3aXRoIENLRWRpdG9yPwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBrZXl1cCBldmVudAogICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXl1cCIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgIC8vIGtleWRvd24gZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5ZG93biIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXREYXRhKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldERhdGEoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNLIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgYSBDSyBFZGl0b3IgY29udHJvbCBmb3IgdXNlIGluIGVkaXRpbmcgSFRNTC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJja2VkaXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNLIEVkaXRvciBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVzZSB0aGlzIGVudHJ5IHRvIHByb3ZpZGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIENLRWRpdG9yIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY2tlZGl0b3IiLCBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBVc2VzIHRoZSBzcGVjdHJ1bSBwbHVnaW4gdG8gcHJvdmlkZSBhIGNvbG9yIHBpY2tlci4KICogVGhpcyB1c2VkIHRvIHJlbHkgb24gSFRNTDUgYnV0IG5vIGxvbmdlci4KICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ29sb3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ29sb3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5zcGVjdHJ1bUF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHR5cGVvZigkLmZuLnNwZWN0cnVtKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bSkgPT09ICJ1bmRlZmluZWQiICYmIHNlbGYuc3BlY3RydW1BdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIGlmIChzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKXsKICAgICAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd0lucHV0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93UGFsZXR0ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93UGFsZXR0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5wcmVmZXJyZWRGb3JtYXQpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0ID0gImhleDMiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5jbGlja291dEZpcmVzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb2xvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgc3BlY3RydW0gcGx1Z2luLi4uCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSAmJiBzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgoc2VsZi5jb250cm9sKVswXSkuc3BlY3RydW0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoeyBjb2xvcjogc2VsZi5kYXRhIH0sIHNlbGYub3B0aW9ucy5zcGVjdHJ1bSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oJ2NoYW5nZS5zcGVjdHJ1bScsIGZ1bmN0aW9uKGUsIHRpbnljb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5jb252ZXJ0VGlueUNvbG9yKHRpbnljb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VGlueUNvbG9yOiBmdW5jdGlvbih0aW55Y29sb3IpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGlueWNvbG9yLnRvSGV4U3RyaW5nKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ29sb3IgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQSBjb2xvciBwaWNrZXIgZm9yIHNlbGVjdGluZyBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY29sb3IiLCBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZygiY29sb3IiLCAiY29sb3IiKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlczogaHR0cHM6Ly9tam9sbmljLmNvbS9ib290c3RyYXAtY29sb3JwaWNrZXIvCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yUGlja2VyRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yUGlja2VyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5jb2xvcnBpY2tlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlciA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIuY29sb3IgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3JwaWNrZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLmNvbG9ycGlja2VyKHNlbGYub3B0aW9ucy5jb2xvcnBpY2tlcik7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2VDb2xvci5jb2xvcnBpY2tlcicsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoZXZlbnQuY29sb3IudG9IZXgoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ29sb3IgUGlja2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9ycGlja2VyIiwgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCA9IEFscGFjYS5GaWVsZHMuU2VsZWN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvdW50cnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IFtdOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub3B0aW9uTGFiZWxzID0gW107CgogICAgICAgICAgICB2YXIgY291bnRyaWVzTWFwID0gdGhpcy5nZXRNZXNzYWdlKCJjb3VudHJpZXMiKTsKICAgICAgICAgICAgaWYgKGNvdW50cmllc01hcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgY291bnRyeUtleSBpbiBjb3VudHJpZXNNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXS5wdXNoKGNvdW50cnlLZXkpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBjb3VudHJpZXNNYXBbY291bnRyeUtleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ291bnRyeSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGRyb3Bkb3duIHNlbGVjdG9yIG9mIGNvdW50cmllcyBrZXllZCBieSB0aGVpciBJU08zIGNvZGUuICBUaGUgbmFtZXMgb2YgdGhlIGNvdW50cmllcyBhcmUgcmVhZCBmcm9tIHRoZSBJMThOIGJ1bmRsZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNhcGl0YWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgdmFsdWVzIHNob3VsZCBiZSBjYXBpdGFsaXplZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJjYXBpdGFsaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiY291bnRyeSIsIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImNvdW50cnkiLCAiY291bnRyeSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIHJvdW5kID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJhdGVnaWVzID0gewogICAgICAgICAgICB1cDogICAgICBNYXRoLmNlaWwsCiAgICAgICAgICAgIGRvd246ICAgIGZ1bmN0aW9uKGlucHV0KSB7IHJldHVybiB+fmlucHV0OyB9LAogICAgICAgICAgICBuZWFyZXN0OiBNYXRoLnJvdW5kCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyYXRlZ3kpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWdpZXNbc3RyYXRlZ3ldOwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkN1cnJlbmN5RmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkN1cnJlbmN5RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBhdWdtZW50cyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZAogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIEN1cnJlbmN5IENvbnRyb2wKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWluZXIgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIEZpZWxkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBFcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgIHZhciBwZk9wdGlvbnNTY2hlbWEgPSB0aGlzLmdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zKCkucHJvcGVydGllczsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwZk9wdGlvbnNTY2hlbWEpIHsKICAgICAgICAgICAgICAgIHZhciBvcHRpb24gPSBwZk9wdGlvbnNTY2hlbWFbaV07CiAgICAgICAgICAgICAgICBpZiAoIShpIGluIG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tpXSA9IG9wdGlvblsiZGVmYXVsdCJdIHx8IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihkYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEgPSAiIiArIHBhcnNlRmxvYXQoZGF0YSkudG9GaXhlZChvcHRpb25zLmNlbnRzTGltaXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImN1cnJlbmN5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgJChmaWVsZCkucHJpY2VGb3JtYXQoc2VsZi5vcHRpb25zKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgICAgIHZhciB2YWwgPSAkKGZpZWxkKS5pcygnaW5wdXQnKSA/IGZpZWxkLnZhbCgpIDogZmllbGQuaHRtbCgpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVubWFzayB8fCB0aGlzLm9wdGlvbnMucm91bmQgIT09ICJub25lIikgewogICAgICAgICAgICAgICAgdmFyIHVubWFza2VkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXIgPSB2YWxbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oY3VyKSB8fCBjdXIgPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGN1cjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXIgPT09IHRoaXMub3B0aW9ucy5jZW50c1NlcGFyYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcuJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChyZXN1bHQpOwogICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgICAgICB1bm1hc2tlZCA9IHJvdW5kKHRoaXMub3B0aW9ucy5yb3VuZCkodW5tYXNrZWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVubWFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZFN0cmluZyA9ICIiICsgdW5tYXNrZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB1ID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWxbaV0pIHx8IHZhbFtpXSA9PT0gIi0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW5tYXNrZWRTdHJpbmdbdSsrXSB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB1bm1hc2tlZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDdXJyZW5jeSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBhdXRvbWF0aWNhbGx5IGZvcm1hdHRlZCBhbmQgY29uZmlndXJhYmxlIGlucHV0IGZvciBlbnRlcmluZyBjdXJyZW5jeSBhbW91bnRzLiI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2NoZW1hT2ZQcmljZUZvcm1hdE9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBOZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIG5lZ2F0aXZlIG51bWJlcnMgYXJlIGFsbG93ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c0xpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxpbWl0IG9mIGZyYWN0aW9uYWwgZGlnaXRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDZW50cyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHdob2xlIGFuZCBmcmFjdGlvbmFsIGFtb3VudHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIi4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJQcmVmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDbGVhciBQcmVmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiB0aGUgcHJlZml4IGlzIGNsZWFyZWQgb24gYmx1ci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyU3VmZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgU3VmZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHN1ZmZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnNlcnRQbHVzU2lnbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBsdXMgU2lnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIGEgcGx1cyBzaWduIHNob3VsZCBiZSBpbnNlcnRlZCBmb3IgcG9zaXRpdmUgdmFsdWVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpbWl0IG9mIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwcmVmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcmVmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHByZWZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiJCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIGZpZWxkIGlzIHJvdW5kZWQuIChSb3VuZGluZyBpcyBkb25lIHdoZW4gZ2V0VmFsdWUgaXMgY2FsbGVkIGFuZCBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBVSSkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsgInVwIiwgImRvd24iLCAibmVhcmVzdCIsICJub25lIiBdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJub25lIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc3VmZml4IGlmIGFueSBmb3IgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidGhvdXNhbmRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGhvdXNhbmRzIFNlcGFyYXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgc2VwYXJhdG9yIGJldHdlZW4gdGhvdXNhbmRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidW5tYXNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVW5tYXNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUgdGhlbiB0aGUgcmVzdWx0aW5nIHZhbHVlIGZvciB0aGlzIGZpZWxkIHdpbGwgYmUgdW5tYXNrZWQuICBUaGF0IGlzLCB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpbGwgYmUgYSBmbG9hdCBpbnN0ZWFkIG9mIGEgc3RyaW5nICh3aXRoIHRoZSBwcmVmaXgsIHN1ZmZpeCwgZXRjLiByZW1vdmVkKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB0aGlzLmdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dOZWdhdGl2ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJvdW5kIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3VmZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImN1cnJlbmN5IiwgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIE5PVEU6IHRoaXMgcmVxdWlyZXMgYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLmpzCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIG1vbWVudC5qcwoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImRhdGUiOwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0OwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRFeHRyYUZvcm1hdHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZGF0ZSI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAiZGF0ZSI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlciA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5waWNrZXIudXNlQ3VycmVudCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGF0ZSBmb3JtYXQKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IHNlbGYuZ2V0RGVmYXVsdEZvcm1hdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0ID0gc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5sb2NhbGUpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlID0gQWxwYWNhLmRlZmF1bHRMb2NhbGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmRheVZpZXdIZWFkZXJGb3JtYXQgPSAiTU1NTSBZWVlZIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXh0cmEgZm9ybWF0cwogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKSB7CiAgICAgICAgICAgICAgICB2YXIgZXh0cmFGb3JtYXRzID0gc2VsZi5nZXREZWZhdWx0RXh0cmFGb3JtYXRzKCk7CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFGb3JtYXRzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5leHRyYUZvcm1hdHMgPSBleHRyYUZvcm1hdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1hbnVhbEVudHJ5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxFbnRyeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxFbnRyeSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZmllbGQuY3NzKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAhPT0gImRpc3BsYXkiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLmRhdGV0aW1lcGlja2VyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRDb250cm9sRWwoKS5kYXRldGltZXBpY2tlcihzZWxmLm9wdGlvbnMucGlja2VyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlja2VyID0gc2VsZi5nZXRDb250cm9sRWwoKS5kYXRhKCJEYXRlVGltZVBpY2tlciIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIgJiYgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlja2VyLmZvcm1hdChzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IHNlbGYucGlja2VyLmZvcm1hdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGRhdGUtdGltZSBwaWNrZXIsIHRyaWdnZXIgY2hhbmdlIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5vbigiZHAuY2hhbmdlIiwgZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBpZiBwcm92aWRlZAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5kYXRlKHNlbGYuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFsbG93cyBtYW51YWwgZW50cnkgbW9kZSB0byBiZSB0b2dnbGVkIG9uIGFuZCBvZmYuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbWFudWFsRW50cnkKICAgICAgICAgKi8KICAgICAgICBzZXRNYW51YWxFbnRyeTogZnVuY3Rpb24obWFudWFsRW50cnkpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFudWFsRW50cnkgPSBtYW51YWxFbnRyeTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGdldERhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkYXRlID0gbnVsbDsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRlID0gKHNlbGYucGlja2VyLmRhdGUoKSA/IHNlbGYucGlja2VyLmRhdGUoKS5fZDogbnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkYXRlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdmFsdWUgYXMgYSBKYXZhU2NyaXB0IERhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7RGF0ZX0gRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIGlzQXV0b0ZvY3VzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlRGF0ZUZvcm1hdCgpOwogICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkRGF0ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZERhdGUiKSwgW3RoaXMub3B0aW9ucy5kYXRlRm9ybWF0XSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkRGF0ZSJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGF0ZSBmb3JtYXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIGRhdGUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVEYXRlRm9ybWF0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBzZWxmLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBmb3JtYXRzCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVGb3JtYXRzID0gW107CiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5waWNrZXIgJiYgc2VsZi5vcHRpb25zLnBpY2tlci5leHRyYUZvcm1hdHMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0cy5wdXNoKHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkIHx8IEFscGFjYS5tb21lbnQodmFsdWUsIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5tb21lbnQodmFsdWUsIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuZGF0ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMucGlja2VyID0gbnVsbDsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJEYXRlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImRhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSIgOiBbImRhdGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5Ijp0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGVGb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEYXRlIEZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRlIGZvcm1hdCAodXNpbmcgbW9tZW50LmpzIGZvcm1hdCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicGlja2VyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZXRpbWVQaWNrZXIgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGEgaHJlZj0naHR0cDovL2VvbmFzZGFuLmdpdGh1Yi5pby9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvJz5Cb290c3RyYXAgRGF0ZVRpbWUgUGlja2VyPC9hPi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGVGb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicGlja2VyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZERhdGUiOiAiSW52YWxpZCBkYXRlIGZvciBmb3JtYXQgezB9IgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJkYXRlIiwgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZSIsICJkYXRlIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGV0aW1lRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gImRhdGV0aW1lIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdCArICIgIiArIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldERlZmF1bHRFeHRyYUZvcm1hdHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIGhoOm1tOnNzIGEiLAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdCArICIgSEg6bW0iLAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGV0aW1lIjsKICAgICAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAiZGF0ZXRpbWUiOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiRGF0ZXRpbWUgRmllbGQiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiRGF0ZXRpbWUgRmllbGQgYmFzZWQgb24gPGEgaHJlZj0naHR0cDovL2VvbmFzZGFuLmdpdGh1Yi5pby9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvJz5Cb290c3RyYXAgRGF0ZVRpbWUgUGlja2VyPC9hPi4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZXRpbWUiLCBBbHBhY2EuRmllbGRzLkRhdGV0aW1lRmllbGQpOwoKICAgIC8vICJkYXRldGltZSIgaXMgbGVnYWN5IChwcmUgdjQgc2NoZW1hKQogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZXRpbWUiLCAiZGF0ZXRpbWUiKTsKCiAgICAvLyBvZmZpY2lhbCB2NCB1c2VzIGRhdGUtdGltZQogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZGF0ZS10aW1lIiwgImRhdGV0aW1lIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5FZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5hY2VUaGVtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZVRoZW1lID0gImFjZS90aGVtZS9jaHJvbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5hY2VNb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYWNlTW9kZSA9ICJhY2UvbW9kZS9qc29uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYmVhdXRpZnkpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVhdXRpZnkgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmJlYXV0aWZ5ICYmIHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKHRoaXMuZGF0YSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIHN0cmluZyB0byBmb3JtYXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0aGlzLmRhdGEpLCBudWxsLCAiICAgICIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9odG1sIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGh0bWxfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGh0bWxfYmVhdXRpZnkodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvY3NzIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGNzc19iZWF1dGlmeSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gY3NzX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2phdmFzY3JpcHQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoanNfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGpzX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qc29uIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhID09PSAie30iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICJ7XG5cdFxufSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gQUNFIEhFSUdIVAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VIZWlnaHQgPSBzZWxmLm9wdGlvbnMuYWNlSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIGlmIChhY2VIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJoZWlnaHQiLCBhY2VIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQUNFIFdJRFRICiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVdpZHRoID0gc2VsZi5vcHRpb25zLmFjZVdpZHRoOwogICAgICAgICAgICAgICAgICAgIGlmICghYWNlV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWNlV2lkdGggPSAiMTAwJSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoIndpZHRoIiwgYWNlV2lkdGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGxvY2F0ZSB3aGVyZSB3ZSB3aWxsIGluc2VydCB0aGUgZWRpdG9yCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHNlbGYuY29udHJvbClbMF07CgogICAgICAgICAgICAgICAgLy8gYWNlIG11c3QgYmUgaW5jbHVkZWQgYWhlYWQgb2YgdGltZQogICAgICAgICAgICAgICAgaWYgKCFhY2UgJiYgd2luZG93LmFjZSkgewogICAgICAgICAgICAgICAgICAgIGFjZSA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFhY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFZGl0b3IgRmllbGQgaXMgbWlzc2luZyB0aGUgJ2FjZScgQ2xvdWQgOSBFZGl0b3IiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IGFjZS5lZGl0KGVsKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRPcHRpb25zKHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGluZXM6IEluZmluaXR5CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXcmFwTW9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbWUKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlVGhlbWUgPSBzZWxmLm9wdGlvbnMuYWNlVGhlbWU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VGhlbWUoYWNlVGhlbWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZU1vZGUgPSBzZWxmLm9wdGlvbnMuYWNlTW9kZTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShhY2VNb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGUoZmFsc2UpOyAvLyBub3QgaW1wbGVtZW50ZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBvbnRvIGVkaXRvcgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHVuZG8gc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEZJVC1DT05URU5UIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciB0byB0aGUgY29udGVudHMgY29udGFpbmVkIHdpdGhpbgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlRml0Q29udGVudEhlaWdodCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHRVcGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExNTg0MDYxLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0hlaWdodCA9IHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRTY3JlZW5MZW5ndGgoKSAqIHNlbGYuZWRpdG9yLnJlbmRlcmVyLmxpbmVIZWlnaHQgKyBzZWxmLmVkaXRvci5yZW5kZXJlci5zY3JvbGxCYXIuZ2V0V2lkdGgoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuaGVpZ2h0KG5ld0hlaWdodC50b1N0cmluZygpICsgInB4Iik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsIGlzIHJlcXVpcmVkIGZvciB0aGUgZWRpdG9yIHRvIGZpeCBhbGwgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbm5lciBzdHJ1Y3R1cmUgZm9yIGFkYXB0aW5nIHRvIGEgY2hhbmdlIGluIHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlc2l6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgc2l6ZSB0byBtYXRjaCBpbml0aWFsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0VXBkYXRlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW5ldmVyIGEgY2hhbmdlIGhhcHBlbnMgaW5zaWRlIHRoZSBBQ0UgZWRpdG9yLCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNpemUgYWdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLm9uKCdjaGFuZ2UnLCBoZWlnaHRVcGRhdGVGdW5jdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSRUFET05MWQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFJlYWRPbmx5KHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBleHBlY3QgQWxwYWNhIGZpZWxkcyB0byBiZSBkZXN0cm95ZWQgYnkgdGhlIGRlc3Ryb3koKSBtZXRob2QgYnV0IHRoZXkgbWF5IGFsc28gYmUKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmVkLXVwIHZpYSB0aGUgRE9NLCB0aHVzIHdlIGNoZWNrIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgJChlbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHRoZSBBQ0UgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICovCiAgICAgICAgZ2V0RWRpdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciB3b3JkQ291bnRTdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVXb3JkQ291bnQoKTsKICAgICAgICAgICAgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogd29yZENvdW50U3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoIndvcmRMaW1pdEV4Y2VlZGVkIiksIFt0aGlzLm9wdGlvbnMud29yZGxpbWl0XSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogd29yZENvdW50U3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZWRpdG9yQW5ub3RhdGlvbnNTdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVkaXRvckFubm90YXRpb25zKCk7CiAgICAgICAgICAgIHZhbEluZm9bImVkaXRvckFubm90YXRpb25zRXhpc3QiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZWRpdG9yQW5ub3RhdGlvbnNTdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIF92YWxpZGF0ZUVkaXRvckFubm90YXRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhbm5vdGF0aW9ucyA9IHRoaXMuZWRpdG9yLmdldFNlc3Npb24oKS5nZXRBbm5vdGF0aW9ucygpOwogICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25zICYmIGFubm90YXRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBmb3Igd29yZCBsaW1pdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXIgb2Ygd29yZHMgaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIHRoZSB3b3JkIGxpbWl0LgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVdvcmRDb3VudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53b3JkbGltaXQgJiYgdGhpcy5vcHRpb25zLndvcmRsaW1pdCA+IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICBpZiAodmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB3b3JkY291bnQgPSB2YWwuc3BsaXQoIiAiKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRjb3VudCA+IHRoaXMub3B0aW9ucy53b3JkbGltaXQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb3JjZSBlZGl0b3IgdG8gcmVzaXplIHRvIGVuc3VyZSBpdCBnZXRzIGRyYXduIGNvcnJlY3RseS4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5yZXNpemUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIgJiYgQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAiICAgICIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgZXhwZWN0ZWQgdHlwZSBiYWNrIGlzICJvYmplY3QiLCB3ZSBkbyB0aGUgY29udmVyc2lvbgogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEudHlwZSA9PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgVGhlbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSB0aGVtZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL3RoZW1lL3R3aWxpZ2h0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZU1vZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIE1vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBtb2RlIHRvIHNldCBvbnRvIHRoZSBlZGl0b3IgaW5zdGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJhY2UvbW9kZS9qYXZhc2NyaXB0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZVdpZHRoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgd3JhcHBpbmcgZGl2IGFyb3VuZCB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiMTAwJSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIEhlaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgd3JhcHBpbmcgZGl2IGFyb3VuZCB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiMzAwcHgiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlRml0Q29udGVudEhlaWdodCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBGaXQgQ29udGVudCBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJlcyB0aGUgQUNFIEVkaXRvciB0byBhdXRvLWZpdCBpdHMgaGVpZ2h0IHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3b3JkbGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXb3JkIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpbWl0cyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFsbG93ZWQgaW4gdGhlIHRleHQgYXJlYS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFjZVRoZW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZU1vZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iLAogICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIlRoZSBlZGl0b3IgaGFzIGVycm9ycyBpbiBpdCB0aGF0IG11c3QgYmUgY29ycmVjdGVkIgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5FZGl0b3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVtYWlsIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJlbWFpbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImVtYWlsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZEVtYWlsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVtYWlsIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVtYWlsIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKSA/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5lbWFpbDsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJlbWFpbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbImVtYWlsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRFbWFpbCI6ICJJbnZhbGlkIEVtYWlsIGFkZHJlc3MgZS5nLiBpbmZvQGNsb3VkY21zLmNvbSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZW1haWwiLCBBbHBhY2EuRmllbGRzLkVtYWlsRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiZW1haWwiLCAiZW1haWwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImdyaWQiOwogICAgICAgIH0sCgogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmdyaWQpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ3JpZCA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgZGF0YSBhcnJheSBpbnRvIHRoZSBncmlkJ3MgZXhwZWN0ZWQgZm9ybWF0CiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgaW4gaGVhZGVycwogICAgICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZERlZmluaXRpb24gPSBzZWxmLm9wdGlvbnMuZmllbGRzW2tleV07CgogICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGtleTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGREZWZpbml0aW9uLmxhYmVsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBmaWVsZERlZmluaXRpb24ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1c2gobGFiZWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChoZWFkZXJzKTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5MiBpbiBzZWxmLmRhdGFbaV0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByb3cucHVzaChzZWxmLmRhdGFbaV1ba2V5Ml0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5wdXNoKHJvdyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgIHZhciBncmlkRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICBbIk1hc2VyYXRpIiwgIk1hemRhIiwgIk1lcmNlZGVzIiwgIk1pbmkiLCAiTWl0c3ViaXNoaSJdLAogICAgICAgICAgICAgICAgICAgIFsiMjAwOSIsIDAsIDI5NDEsIDQzMDMsIDM1NCwgNTgxNF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDEwIiwgNSwgMjkwNSwgMjg2NywgNDEyLCA1Mjg0XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTEiLCA0LCAyNTE3LCA0ODIyLCA1NTIsIDYxMjddLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMiIsIDIsIDI0MjIsIDUzOTksIDc3NiwgNDE1MV0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKHNlbGYuY29udGFpbmVyKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1ncmlkLWhvbGRlciIpOwoKICAgICAgICAgICAgICAgIHZhciBncmlkQ29uZmlnID0gc2VsZi5vcHRpb25zLmdyaWQ7CiAgICAgICAgICAgICAgICBncmlkQ29uZmlnLmRhdGEgPSBncmlkRGF0YTsKCiAgICAgICAgICAgICAgICAkKGhvbGRlcikuaGFuZHNvbnRhYmxlKGdyaWRDb25maWcpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiR3JpZCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgYXJyYXkgaXRlbXMgaW50byBhIGdyaWQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZ3JpZCIsIEFscGFjYS5GaWVsZHMuR3JpZEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW1hZ2UiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkltYWdlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkltYWdlIEZpZWxkLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpbWFnZSIsIEFscGFjYS5GaWVsZHMuSW1hZ2VGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbnRlZ2VyRmllbGQgPSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjb25DaGFuZ2UKICAgICAgICAgKi8KICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlci5zbGlkZXIoInZhbHVlIiwgdGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zbGlkZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhpbXVtKSAmJiAhQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluaW11bSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWZ0ZXIoJzxkaXYgaWQ9InNsaWRlciI+PC9kaXY+Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zbGlkZXIgPSAkKCcjc2xpZGVyJywgc2VsZi5jb250cm9sLnBhcmVudCgpKS5zbGlkZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxmLmdldFZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBzZWxmLnNjaGVtYS5taW5pbXVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogc2VsZi5zY2hlbWEubWF4aW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodWkudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlSW50ZWdlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBbkludGVnZXIiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhbiBpbnRlZ2VyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYW4gaW50ZWdlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUludGVnZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBhcyB0ZXh0CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLl9nZXRDb250cm9sVmFsKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGV4dFZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRleHRWYWx1ZSA9ICIiICsgdGV4dFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbGxvdyBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbGlkIGludGVnZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMuaW50ZWdlciwgdGV4dFZhbHVlKTsKICAgICAgICAgICAgaWYgKCF2YWxpZE51bWJlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBxdWljayBjaGVjayB0byBzZWUgaWYgd2hhdCB0aGV5IGVudGVyZWQgd2FzIGEgbnVtYmVyCiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAoaXNOYU4oZmxvYXRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJpbnRlZ2VyIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkludGVnZXIgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgaW50ZWdlcnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpdmlzaWJsZSBCeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNYXhpbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpdmlzaWJsZUJ5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIlByb3BlcnR5IHZhbHVlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHRoaXMgbnVtYmVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2xpZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2xpZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdlbmVyYXRlIGpRdWVyeSBVSSBzbGlkZXIgY29udHJvbCB3aXRoIHRoZSBmaWVsZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2xpZGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJTbGlkZXIgY29udHJvbCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJHZW5lcmF0ZSBzbGlkZXIgY29udHJvbCBpZiBzZWxlY3RlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyLiIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW50ZWdlciIsIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImludGVnZXIiLCAiaW50ZWdlciIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaXB2NCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmlwdjQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZElQdjQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJUCBBZGRyZXNzIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IEFscGFjYS5yZWdleHBzLmlwdjQ7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJpcC1hZGRyZXNzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiaXAtYWRkcmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSx7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZElQdjQiOiAiSW52YWxpZCBJUHY0IGFkZHJlc3MsIGUuZy4gMTkyLjE2OC4wLjEiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImlwdjQiLCBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJpcC1hZGRyZXNzIiwgImlwdjQiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkpTT05GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkpTT05GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAianNvbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSB8fCB0eXBlb2YodmFsdWUpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IEpTT04ucGFyc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUpTT04oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QUpTT04iXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzLnN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBSlNPTiIpICsiICIrIHN0YXR1cy5tZXNzYWdlLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cy5zdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl1bInN0YXR1cyJdIDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIHZhbGlkIEpTT04gb2JqZWN0CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlSlNPTjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRleHRWYWx1ZSA9IHRoaXMuY29udHJvbC52YWwoKTsKCiAgICAgICAgICAgIC8vIGFsbG93IG51bGwKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIgOiB0cnVlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBwYXJzZSB0aGUgc3RyaW5nCiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZSh0ZXh0VmFsdWUpOwoKICAgICAgICAgICAgICAgIC8vIGZvcm1hdCB0aGUgc3RyaW5nIGFzIHdlbGwKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiIDogZS5tZXNzYWdlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgYXV0by1mb3JtYXR0aW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5iaW5kKCdrZXlwcmVzcycsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlIHx8IGUud2ljaDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAzNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMTIzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuaW5zZXJ0QXRDYXJldCgnfScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSA5MSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCAnQ3RybCtsJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNsYXNzIGZyb20gc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5hdHRyKCd0aXRsZScsJ1R5cGUgQ3RybCtMIHRvIGZvcm1hdCBhbmQgdmFsaWRhdGUgdGhlIEpTT04gc3RyaW5nLicpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkpTT04gRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IgZm9yIEpTT04gb2JqZWN0cyB3aXRoIGJhc2ljIHZhbGlkYXRpb24gYW5kIGZvcm1hdHRpbmcuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBSlNPTiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIHZhbGlkIEpTT04gc3RyaW5nLiIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImpzb24iLCBBbHBhY2EuRmllbGRzLkpTT05GaWVsZCk7CgogICAgJC5mbi5pbnNlcnRBdENhcmV0ID0gZnVuY3Rpb24gKG15VmFsdWUpIHsKCiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vSUUgc3VwcG9ydAogICAgICAgICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7CgogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgc2VsID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICBzZWwudGV4dCA9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CgogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgfHwgdGhpcy5zZWxlY3Rpb25TdGFydCA9PSAnMCcpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCgogICAgICAgICAgICAgICAgLy9NT1pJTExBIC8gTkVUU0NBUEUgc3VwcG9ydAogICAgICAgICAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zZWxlY3Rpb25TdGFydDsKICAgICAgICAgICAgICAgIHZhciBlbmRQb3MgPSB0aGlzLnNlbGVjdGlvbkVuZDsKICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydFBvcykgKyBteVZhbHVlICsgdGhpcy52YWx1ZS5zdWJzdHJpbmcoZW5kUG9zLCB0aGlzLnZhbHVlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnRQb3MgLyorIG15VmFsdWUubGVuZ3RoKi87CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CgogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gbXlWYWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICAvKgogICAgICogalF1ZXJ5IEhvdGtleXMgUGx1Z2luCiAgICAgKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogICAgICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAgICAgKgogICAgICogQmFzZWQgdXBvbiB0aGUgcGx1Z2luIGJ5IFR6dXJ5IEJhciBZb2NoYXk6CiAgICAgKiBodHRwOi8vZ2l0aHViLmNvbS90enVyeWJ5L2hvdGtleXMKICAgICAqCiAgICAgKiBPcmlnaW5hbCBpZGVhIGJ5OgogICAgICogQmlubnkgViBBLCBodHRwOi8vd3d3Lm9wZW5qcy5jb20vc2NyaXB0cy9ldmVudHMva2V5Ym9hcmRfc2hvcnRjdXRzLwogICAgKi8KICAgIGpRdWVyeS5ob3RrZXlzID0gewogICAgICAgIHZlcnNpb246ICIwLjgiLAoKICAgICAgICBzcGVjaWFsS2V5czogewogICAgICAgICAgICA4OiAiYmFja3NwYWNlIiwgOTogInRhYiIsIDEzOiAicmV0dXJuIiwgMTY6ICJzaGlmdCIsIDE3OiAiY3RybCIsIDE4OiAiYWx0IiwgMTk6ICJwYXVzZSIsCiAgICAgICAgICAgIDIwOiAiY2Fwc2xvY2siLCAyNzogImVzYyIsIDMyOiAic3BhY2UiLCAzMzogInBhZ2V1cCIsIDM0OiAicGFnZWRvd24iLCAzNTogImVuZCIsIDM2OiAiaG9tZSIsCiAgICAgICAgICAgIDM3OiAibGVmdCIsIDM4OiAidXAiLCAzOTogInJpZ2h0IiwgNDA6ICJkb3duIiwgNDU6ICJpbnNlcnQiLCA0NjogImRlbCIsCiAgICAgICAgICAgIDk2OiAiMCIsIDk3OiAiMSIsIDk4OiAiMiIsIDk5OiAiMyIsIDEwMDogIjQiLCAxMDE6ICI1IiwgMTAyOiAiNiIsIDEwMzogIjciLAogICAgICAgICAgICAxMDQ6ICI4IiwgMTA1OiAiOSIsIDEwNjogIioiLCAxMDc6ICIrIiwgMTA5OiAiLSIsIDExMDogIi4iLCAxMTEgOiAiLyIsCiAgICAgICAgICAgIDExMjogImYxIiwgMTEzOiAiZjIiLCAxMTQ6ICJmMyIsIDExNTogImY0IiwgMTE2OiAiZjUiLCAxMTc6ICJmNiIsIDExODogImY3IiwgMTE5OiAiZjgiLAogICAgICAgICAgICAxMjA6ICJmOSIsIDEyMTogImYxMCIsIDEyMjogImYxMSIsIDEyMzogImYxMiIsIDE0NDogIm51bWxvY2siLCAxNDU6ICJzY3JvbGwiLCAxOTE6ICIvIiwgMjI0OiAibWV0YSIKICAgICAgICB9LAoKICAgICAgICBzaGlmdE51bXM6IHsKICAgICAgICAgICAgImAiOiAifiIsICIxIjogIiEiLCAiMiI6ICJAIiwgIjMiOiAiIyIsICI0IjogIiQiLCAiNSI6ICIlIiwgIjYiOiAiXiIsICI3IjogIiYiLAogICAgICAgICAgICAiOCI6ICIqIiwgIjkiOiAiKCIsICIwIjogIikiLCAiLSI6ICJfIiwgIj0iOiAiKyIsICI7IjogIjogIiwgIiciOiAiXCIiLCAiLCI6ICI8IiwKICAgICAgICAgICAgIi4iOiAiPiIsICAiLyI6ICI/IiwgICJcXCI6ICJ8IgogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24ga2V5SGFuZGxlciggaGFuZGxlT2JqICkgewogICAgICAgIC8vIE9ubHkgY2FyZSB3aGVuIGEgcG9zc2libGUgaW5wdXQgaGFzIGJlZW4gc3BlY2lmaWVkCiAgICAgICAgaWYgKCB0eXBlb2YgaGFuZGxlT2JqLmRhdGEgIT09ICJzdHJpbmciICkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgb3JpZ0hhbmRsZXIgPSBoYW5kbGVPYmouaGFuZGxlciwKICAgICAgICAgICAga2V5cyA9IGhhbmRsZU9iai5kYXRhLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKTsKCiAgICAgICAgaGFuZGxlT2JqLmhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CiAgICAgICAgICAgIC8vIERvbid0IGZpcmUgaW4gdGV4dC1hY2NlcHRpbmcgaW5wdXRzIHRoYXQgd2UgZGlkbid0IGRpcmVjdGx5IGJpbmQgdG8KICAgICAgICAgICAgaWYgKCB0aGlzICE9PSBldmVudC50YXJnZXQgJiYgKC90ZXh0YXJlYXxzZWxlY3QvaS50ZXN0KCBldmVudC50YXJnZXQubm9kZU5hbWUgKSB8fAogICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC50eXBlID09PSAidGV4dCIpICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBLZXlwcmVzcyByZXByZXNlbnRzIGNoYXJhY3RlcnMsIG5vdCBzcGVjaWFsIGtleXMKICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBldmVudC50eXBlICE9PSAia2V5cHJlc3MiICYmIGpRdWVyeS5ob3RrZXlzLnNwZWNpYWxLZXlzWyBldmVudC53aGljaCBdLAogICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQud2hpY2ggKS50b0xvd2VyQ2FzZSgpLAogICAgICAgICAgICAgICAga2V5LCBtb2RpZiA9ICIiLCBwb3NzaWJsZSA9IHt9OwoKICAgICAgICAgICAgLy8gY2hlY2sgY29tYmluYXRpb25zIChhbHR8Y3RybHxzaGlmdCthbnl0aGluZykKICAgICAgICAgICAgaWYgKCBldmVudC5hbHRLZXkgJiYgc3BlY2lhbCAhPT0gImFsdCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAiYWx0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZXZlbnQuY3RybEtleSAmJiBzcGVjaWFsICE9PSAiY3RybCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAiY3RybCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHdvcmtzIGNvbnNpc3RlbnRseSBhY3Jvc3MgcGxhdGZvcm1zCiAgICAgICAgICAgIGlmICggZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuY3RybEtleSAmJiBzcGVjaWFsICE9PSAibWV0YSIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAibWV0YSsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LnNoaWZ0S2V5ICYmIHNwZWNpYWwgIT09ICJzaGlmdCIgKSB7CiAgICAgICAgICAgICAgICBtb2RpZiArPSAic2hpZnQrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBzcGVjaWFsICkgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgc3BlY2lhbCBdID0gdHJ1ZTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwb3NzaWJsZVsgbW9kaWYgKyBjaGFyYWN0ZXIgXSA9IHRydWU7CiAgICAgICAgICAgICAgICBwb3NzaWJsZVsgbW9kaWYgKyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVlOwoKICAgICAgICAgICAgICAgIC8vICIkIiBjYW4gYmUgdHJpZ2dlcmVkIGFzICJTaGlmdCs0IiBvciAiU2hpZnQrJCIgb3IganVzdCAiJCIKICAgICAgICAgICAgICAgIGlmICggbW9kaWYgPT09ICJzaGlmdCsiICkgewogICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBqUXVlcnkuaG90a2V5cy5zaGlmdE51bXNbIGNoYXJhY3RlciBdIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKICAgICAgICAgICAgICAgIGlmICggcG9zc2libGVbIGtleXNbaV0gXSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0hhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBqUXVlcnkuZWFjaChbICJrZXlkb3duIiwgImtleXVwIiwgImtleXByZXNzIiBdLCBmdW5jdGlvbigpIHsKICAgICAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdGhpcyBdID0geyBhZGQ6IGtleUhhbmRsZXIgfTsKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImxvd2VyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbG93ZXJWYWx1ZSA9IHZhbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgaWYgKGxvd2VyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGxvd2VyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTG93ZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgbG93ZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImxvd2VyY2FzZSIsIEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygibG93ZXJjYXNlIiwgImxvd2VyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTWFwRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5NYXBGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAibWFwIjsKICAgICAgICB9LAoKICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCIKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBzcGVjaWFsIGhhbmRsaW5nIC0gZGF0YSBjYW4gY29tZSBpbiBhcyBhbiBvYmplY3QsIHdlIGNvbnZlcnQgdG8gYXJyYXkKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiBBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kYXRhLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gQWxwYWNhLmNvcHlPZih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVbIl9rZXkiXSA9IGtleTsKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhLnB1c2gobmV3VmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3RGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QodGhpcy5vcHRpb25zLCB7CiAgICAgICAgICAgICAgICAiZm9yY2VSZXZhbGlkYXRpb24iIDogdHJ1ZQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRDb250YWluZXJWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRhaW5lclZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiBhbmQgd2UncmUgbm90IHJlcXVpcmVkLCBoYW5kIGJhY2sgdW5kZWZpbmVkCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZywgY29udmVydCBiYWNrIHRvIG9iamVjdAogICAgICAgICAgICB2YXIgbyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZbIl9rZXkiXTsKICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5ID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzTm90RW1wdHkoKTsKICAgICAgICAgICAgdmFsSW5mb1sia2V5TWlzc2luZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5ID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImtleU1pc3NpbmciKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c05vdEVtcHR5CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNVbmlxdWUgPSB0aGlzLl92YWxpZGF0ZU1hcEtleXNVbmlxdWUoKTsKICAgICAgICAgICAgdmFsSW5mb1sia2V5Tm90VW5pcXVlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGlzVmFsaWRNYXBLZXlzVW5pcXVlID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImtleU5vdFVuaXF1ZSIpLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IGlzVmFsaWRNYXBLZXlzVW5pcXVlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJrZXlNaXNzaW5nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgdGhhdCBrZXkgZmllbGRzIGFyZSBub3QgZW1wdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSBub3QgZW1wdHkKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzTm90RW1wdHk6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gdlsiX2tleSJdOwoKICAgICAgICAgICAgICAgIGlmICgha2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGtleSBmaWVsZHMgYXJlIHVuaXF1ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGtleXMgYXJlIHVuaXF1ZQogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1hcEtleXNVbmlxdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgIHZhciBrZXlzID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNoaWxkcmVuW2ldLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gdlsiX2tleSJdOwoKICAgICAgICAgICAgICAgIGlmIChrZXlzW2tleV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IGtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk1hcCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIG9iamVjdHMgd2l0aCBrZXkvdmFsdWUgcGFpcnMgdGhhdCBzaGFyZSB0aGUgc2FtZSBzY2hlbWEgZm9yIHZhbHVlcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibWFwIiwgQWxwYWNhLkZpZWxkcy5NYXBGaWVsZCk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImtleU5vdFVuaXF1ZSI6ICJLZXlzIG9mIG1hcCBmaWVsZCBhcmUgbm90IHVuaXF1ZS4iLAogICAgICAgICJrZXlNaXNzaW5nIjogIk1hcCBjb250YWlucyBhbiBlbXB0eSBrZXkuIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWUucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvcHRpb250cmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5vcmRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUub3JkZXIgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIGFsbCBvcHRpb25zIGhhdmUgc2NoZW1hCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5zY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk9wdGlvblRyZWUgc2VsZWN0b3IgZm9yOiAiICsgayArICIgaXMgbWlzc2luZyBzY2hlbWEiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIGRhdGEKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMudHJlZS5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMub3B0aW9ucy50cmVlLmRhdGFbaV07CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGl0ZW0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS5vcHRpb25zLm5vbmVMYWJlbCA9ICJDaG9vc2UuLi4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgb3JkZXIgZnJvbSB0aGUgb3B0aW9ucyBpZiBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyID0gW107CgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIucHVzaChzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGxvb2t1cCBsaXN0IGZvciBvcHRpb24gbGlzdCBrZXkvdmFsdWUgYmFzZWQgb24gbG9jYXRpb24KICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlcyA9IHt9OwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlc1trXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzW2xvY2F0aW9uXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzW2xvY2F0aW9uXSA9IGFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJyYXkubGVuZ3RoOyB4KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVt4XS52YWx1ZSA9PT0gdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblZhbHVlc1tsb2NhdGlvbl0gPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSB7fTsKICAgICAgICB9LAoKICAgICAgICB0b0xvY2F0aW9uOiBmdW5jdGlvbihhdHRycykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gYXR0cnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gYXR0cnNba107CgogICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gayArICI9IiArIHY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjsKICAgICAgICB9LAoKICAgICAgICBleGlzdHNMb2NhdGlvbldpdGhQcmVmaXg6IGZ1bmN0aW9uKHByZWZpeCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGZhbHNlOwoKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZihwcmVmaXgpID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250cm9sCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYub3B0aW9uVHJlZUhvbGRlciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLm9wdGlvbnRyZWUiKTsKCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmFkZENsYXNzKCJvcHRpb250cmVlLWhvcml6b250YWwiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHMoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaE9wdGlvblRyZWVDb250cm9sczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBoaWRlIGFsbCBvZiB0aGUgY29udHJvbHMKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLmNvbnRyb2xzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW2tdLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb3B0aW9uIGZvciB3aGljaCB3ZSBhcmUgbWlzc2luZyBhIHZhbHVlCiAgICAgICAgICAgIHZhciBkaXNwbGF5VXBUb0luZGV4ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSBzZWxmLm9wdGlvbnMudHJlZS5vcmRlcltpXTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0pICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdICE9PSBudWxsICAmJiBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdICE9PSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VXBUb0luZGV4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBvcmRlciBhbmQgY29uc3RydWN0IHJlbmRlciBmdW5jdGlvbnMKICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gInJvb3QiOwogICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgIHZhciBkaXNwbGF5Q291bnQgPSAwOwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBoYXNNYXRjaGVzID0gKGkgPT0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoIC0gMSkgfHwgKHNlbGYuZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4KGxvY2F0aW9uICsgIn4iICsgc2VsZWN0b3JJZCArICI9IikpOwogICAgICAgICAgICAgICAgICAgIGlmIChoYXNNYXRjaGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlDb3VudCA8PSBkaXNwbGF5VXBUb0luZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9ICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIgKyBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IHNlbGYub3B0aW9ucy50cmVlLnNlbGVjdG9yc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IChpICsgMSA9PT0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oaW5kZXgsIHNlbGVjdG9ySWQsIHNlbGVjdG9yLCBjb250cm9scywgb3B0aW9uVHJlZUhvbGRlciwgbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FTY2hlbWEgPSBzZWxlY3Rvci5zY2hlbWE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYU9wdGlvbnMgPSBzZWxlY3Rvci5vcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHBhY2FPcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHBhY2FPcHRpb25zLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FPcHRpb25zLnR5cGUgPSAic2VsZWN0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhT3B0aW9ucy50eXBlID09PSAic2VsZWN0IikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FPcHRpb25zLmRhdGFTb3VyY2UgPSBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRMb2NhdGlvbiA9IHNlbGYudG9Mb2NhdGlvbihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZUxpc3QgPSBzZWxmLmxvY2F0aW9uVmFsdWVMaXN0c1tjdXJyZW50TG9jYXRpb25dOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY3VycmVudFZhbHVlTGlzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHZpYSBhbHBhY2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21FbCA9ICQoIjxkaXYgY2xhc3M9J29wdGlvbnRyZWUtc2VsZWN0b3InPjwvZGl2PiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9tRWwpLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjaGVtYSI6IGFscGFjYVNjaGVtYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGFscGFjYU9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiBmdW5jdGlvbihjb250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sc1tzZWxlY3RvcklkXSA9IGNvbnRyb2w7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgdG8gdGhlIGhvbGRlciBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQob3B0aW9uVHJlZUhvbGRlcikuYXBwZW5kKGRvbUVsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0b3JJZCA9IHNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnRyb2wgY2hhbmdlcywgd2UgcmVjb3JkIGl0IGludG8gb3VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYXR0cmlidXRlIHNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHRoaXMuc2VsZWN0b3JJZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb3VyIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgZXZlcnl0aGluZyBwYXN0IG91ciBpbmRleCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSBzZWxmLm9wdGlvbnMudHJlZS5vcmRlcltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jdXJyZW50QXR0cmlidXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2tdICE9PSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW2tdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUodmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpLCBzZWxlY3RvcklkLCBzZWxlY3Rvciwgc2VsZi5jb250cm9scywgc2VsZi5vcHRpb25UcmVlSG9sZGVyLCBsYXN0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5zLnB1c2goZm4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICBBbHBhY2Euc2VyaWVzKGZucywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPcHRpb24gVHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRyZWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvcml6b250YWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygib3B0aW9udHJlZSIsIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlBhc3N3b3JkRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlBhc3N3b3JkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGFzc3dvcmQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5wYXNzd29yZDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGFzc3dvcmQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGFzc3dvcmQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGFzc3dvcmQgRmllbGQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnBhdHRlcm4pPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogL15bMC05YS16QS1aXHgyMC1ceDdFXSokLzsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0aGlzLnNjaGVtYS5wYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKCQkJCQkiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKCQkJCQkJImRlZmF1bHQiOiJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbInBhc3N3b3JkIl0sCgkJCQkJCSJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KCQlnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSx7CgkJCQkiZmllbGRzIjogewoJCQkJCSJmb3JtYXQiOiB7CgkJCQkJCSJ0eXBlIjogInRleHQiCgkJCQkJfQoJCQkJfQoJCQl9KTsKICAgICAgICB9CgoJCS8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIkludmFsaWQgUGFzc3dvcmQiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBhc3N3b3JkIiwgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBhc3N3b3JkIiwgInBhc3N3b3JkIik7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlBlcnNvbmFsTmFtZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJwZXJzb25hbG5hbWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29udmVydCB0byB1cHBlci1jYXNlCiAgICAgICAgICAgIHZhciB1cHBlclZhbHVlID0gIiI7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWwuY2hhckF0KGkgLSAxKSA9PT0gJyAnIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAnLScgfHwgdmFsLmNoYXJBdChpIC0gMSkgPT09ICInIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1cHBlclZhbHVlICs9IHZhbC5jaGFyQXQoaSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1cHBlclZhbHVlICs9IHZhbC5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh1cHBlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh1cHBlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQZXJzb25hbCBOYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgRmllbGQgZm9yIHBlcnNvbmFsIG5hbWUgd2l0aCBjYXB0aWNhbCBsZXR0ZXIgZm9yIGZpcnN0IGxldHRlciAmIGFmdGVyIGh5cGhlbiwgc3BhY2Ugb3IgYXBvc3Ryb3BoZS4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGVyc29uYWxuYW1lIiwgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidGVsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidGVsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubWFza1N0cmluZykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tYXNrU3RyaW5nID0gIig5OTkpIDk5OS05OTk5IjsKICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRQaG9uZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGhvbmUiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBob25lIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBob25lIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKSA/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5waG9uZTsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQYXR0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIFBhdHRlcm4gaW4gUmVndWxhciBFeHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6W3BhdHRlcm5dLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJwaG9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbInBob25lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXNrU3RyaW5nIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmllbGQgTWFzayBTdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwcmVzc2lvbiBmb3IgZmllbGQgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIig5OTkpIDk5OS05OTk5IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQaG9uZSI6ICJJbnZhbGlkIFBob25lIE51bWJlciwgZS5nLiAoMTIzKSA0NTYtOTk5OSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGhvbmUiLCBBbHBhY2EuRmllbGRzLlBob25lRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygicGhvbmUiLCAicGhvbmUiKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlczogaHR0cHM6Ly9naXRodWIuY29tL2JpbGx5YXJhdWpvL3BpY2stYS1jb2xvcgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5waWNrQUNvbG9yKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvcikgPT09ICJ1bmRlZmluZWQiICYmICFzZWxmLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAiY29sb3IiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IHNwZWN0cnVtIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBpY2thY29sb3IgPSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1NwZWN0cnVtICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93U2F2ZWRDb2xvcnMgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNhdmVDb2xvcnNQZXJFbGVtZW50ICA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGZhZGVNZW51VG9nZ2xlICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0FkdmFuY2VkICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93QmFzaWNDb2xvcnMgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dIZXhJbnB1dCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgYWxsb3dCbGFuayAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBpbmxpbmVEcm9wZG93biAgICAgICAgOiBmYWxzZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgY29sb3JzIG5vdCBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0IGNvbG9ycwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9ycyA9IHsKICAgICAgICAgICAgICAgICAgICB3aGl0ZTogIiNmZmZmZmYiLAogICAgICAgICAgICAgICAgICAgIGNsb3VkczogIiNlY2YwZjEiLAogICAgICAgICAgICAgICAgICAgIHJlZDogIiNjMDM5MmIiLAogICAgICAgICAgICAgICAgICAgIG9yYW5nZTogIiNlNjdlMjIiLAogICAgICAgICAgICAgICAgICAgIHllbGxvdzogIiNmMWM0MGYiLAogICAgICAgICAgICAgICAgICAgIGdyZWVuOiAiIzI3YWU2MCIsCiAgICAgICAgICAgICAgICAgICAgYmx1ZTogIiMyOTgwYjkiLAogICAgICAgICAgICAgICAgICAgIHB1cnBsZTogIiM4ZTQ0YWQiLAogICAgICAgICAgICAgICAgICAgIGRhcms6ICIjMzQ0OTVlIiwKICAgICAgICAgICAgICAgICAgICBibGFjazogIiMwMDAwMDAiLAogICAgICAgICAgICAgICAgICAgIGJyb3duOiAiI2JiOTk3NyIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGlja2Fjb2xvciAmJiB0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IuYmFzaWNDb2xvcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBpY2thY29sb3IuYmFzaWNDb2xvcnMgPSB0aGlzLm9wdGlvbnMuY29sb3JzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmlubGluZURyb3Bkb3duKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmlubGluZURyb3Bkb3duID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGlja2Fjb2xvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUgJiYgc2VsZi5vcHRpb25zLnBpY2thY29sb3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYXR0cigidmFsdWUiLCBzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWRkQ2xhc3MoInBpY2stYS1jb2xvciIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkucGlja0FDb2xvcihzZWxmLm9wdGlvbnMucGlja2Fjb2xvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oImNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaWNrLUEtQ29sb3IgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQSBjb2xvciBwaWNrZXIgZm9yIHNlbGVjdGluZyBoZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicGlja2Fjb2xvciIsIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlYXJjaEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInNlYXJjaCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInNlYXJjaCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzLnJlc3VsdHMgPSA1OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzZWFyY2giOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VhcmNoIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgc2VhcmNoIGJveCBmaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWFyY2giLCBBbHBhY2EuRmllbGRzLlNlYXJjaEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInNlYXJjaCIsICJzZWFyY2giKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncyA9IHt9OwoKICAgIEFscGFjYS51c0hvbGRpbmdzLnRlcnJpdG9yaWVzID0gewogICAgICAgICJBbWVyaWNhbiBTYW1vYSIgICAgICAgICAgICAgICAgIDogIkFTIiwKICAgICAgICAiRGlzdHJpY3QgT2YgQ29sdW1iaWEiICAgICAgICAgICA6ICJEQyIsCiAgICAgICAgIkZlZGVyYXRlZCBTdGF0ZXMgT2YgTWljcm9uZXNpYSIgOiAiRk0iLAogICAgICAgICJHdWFtIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkdVIiwKICAgICAgICAiTWFyc2hhbGwgSXNsYW5kcyIgICAgICAgICAgICAgICA6ICJNSCIsCiAgICAgICAgIk5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIgICAgICAgOiAiTVAiLAogICAgICAgICJQYWxhdSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlBXIiwKICAgICAgICAiUHVlcnRvIFJpY28iICAgICAgICAgICAgICAgICAgICA6ICJQUiIsCiAgICAgICAgIlZpcmdpbiBJc2xhbmRzIiAgICAgICAgICAgICAgICAgOiAiVkkiCiAgICB9OwoKICAgIEFscGFjYS51c0hvbGRpbmdzLnN0YXRlcyA9ICB7CiAgICAgICAgIkFsYWJhbWEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQUwiLAogICAgICAgICJBbGFza2EiICAgICAgICAgICAgICAgICAgICAgICAgIDogIkFLIiwKICAgICAgICAiQXJpem9uYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJBWiIsCiAgICAgICAgIkFya2Fuc2FzIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQVIiLAogICAgICAgICJDYWxpZm9ybmlhIiAgICAgICAgICAgICAgICAgICAgIDogIkNBIiwKICAgICAgICAiQ29sb3JhZG8iICAgICAgICAgICAgICAgICAgICAgICA6ICJDTyIsCiAgICAgICAgIkNvbm5lY3RpY3V0IiAgICAgICAgICAgICAgICAgICAgOiAiQ1QiLAogICAgICAgICJEZWxhd2FyZSIgICAgICAgICAgICAgICAgICAgICAgIDogIkRFIiwKICAgICAgICAiRmxvcmlkYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJGTCIsCiAgICAgICAgIkdlb3JnaWEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiR0EiLAogICAgICAgICJIYXdhaWkiICAgICAgICAgICAgICAgICAgICAgICAgIDogIkhJIiwKICAgICAgICAiSWRhaG8iICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJRCIsCiAgICAgICAgIklsbGlub2lzIiAgICAgICAgICAgICAgICAgICAgICAgOiAiSUwiLAogICAgICAgICJJbmRpYW5hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIklOIiwKICAgICAgICAiSW93YSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJQSIsCiAgICAgICAgIkthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiS1MiLAogICAgICAgICJLZW50dWNreSIgICAgICAgICAgICAgICAgICAgICAgIDogIktZIiwKICAgICAgICAiTG91aXNpYW5hIiAgICAgICAgICAgICAgICAgICAgICA6ICJMQSIsCiAgICAgICAgIk1haW5lIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTUUiLAogICAgICAgICJNYXJ5bGFuZCIgICAgICAgICAgICAgICAgICAgICAgIDogIk1EIiwKICAgICAgICAiTWFzc2FjaHVzZXR0cyIgICAgICAgICAgICAgICAgICA6ICJNQSIsCiAgICAgICAgIk1pY2hpZ2FuIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTUkiLAogICAgICAgICJNaW5uZXNvdGEiICAgICAgICAgICAgICAgICAgICAgIDogIk1OIiwKICAgICAgICAiTWlzc2lzc2lwcGkiICAgICAgICAgICAgICAgICAgICA6ICJNUyIsCiAgICAgICAgIk1pc3NvdXJpIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTU8iLAogICAgICAgICJNb250YW5hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIk1UIiwKICAgICAgICAiTmVicmFza2EiICAgICAgICAgICAgICAgICAgICAgICA6ICJORSIsCiAgICAgICAgIk5ldmFkYSIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTlYiLAogICAgICAgICJOZXcgSGFtcHNoaXJlIiAgICAgICAgICAgICAgICAgIDogIk5IIiwKICAgICAgICAiTmV3IEplcnNleSIgICAgICAgICAgICAgICAgICAgICA6ICJOSiIsCiAgICAgICAgIk5ldyBNZXhpY28iICAgICAgICAgICAgICAgICAgICAgOiAiTk0iLAogICAgICAgICJOZXcgWW9yayIgICAgICAgICAgICAgICAgICAgICAgIDogIk5ZIiwKICAgICAgICAiTm9ydGggQ2Fyb2xpbmEiICAgICAgICAgICAgICAgICA6ICJOQyIsCiAgICAgICAgIk5vcnRoIERha290YSIgICAgICAgICAgICAgICAgICAgOiAiTkQiLAogICAgICAgICJPaGlvIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9IIiwKICAgICAgICAiT2tsYWhvbWEiICAgICAgICAgICAgICAgICAgICAgICA6ICJPSyIsCiAgICAgICAgIk9yZWdvbiIgICAgICAgICAgICAgICAgICAgICAgICAgOiAiT1IiLAogICAgICAgICJQZW5uc3lsdmFuaWEiICAgICAgICAgICAgICAgICAgIDogIlBBIiwKICAgICAgICAiUmhvZGUgSXNsYW5kIiAgICAgICAgICAgICAgICAgICA6ICJSSSIsCiAgICAgICAgIlNvdXRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiU0MiLAogICAgICAgICJTb3V0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIlNEIiwKICAgICAgICAiVGVubmVzc2VlIiAgICAgICAgICAgICAgICAgICAgICA6ICJUTiIsCiAgICAgICAgIlRleGFzIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVFgiLAogICAgICAgICJVdGFoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlVUIiwKICAgICAgICAiVmVybW9udCIgICAgICAgICAgICAgICAgICAgICAgICA6ICJWVCIsCiAgICAgICAgIlZpcmdpbmlhIiAgICAgICAgICAgICAgICAgICAgICAgOiAiVkEiLAogICAgICAgICJXYXNoaW5ndG9uIiAgICAgICAgICAgICAgICAgICAgIDogIldBIiwKICAgICAgICAiV2VzdCBWaXJnaW5pYSIgICAgICAgICAgICAgICAgICA6ICJXViIsCiAgICAgICAgIldpc2NvbnNpbiIgICAgICAgICAgICAgICAgICAgICAgOiAiV0kiLAogICAgICAgICJXeW9taW5nIiAgICAgICAgICAgICAgICAgICAgICAgIDogIldZIgogICAgfTsKCiAgICBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU3RhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdGF0ZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5jYXBpdGFsaXplKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVTdGF0ZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLmZvcm1hdCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHZhbGlkYXRlIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmFtZSIgfHwgdGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImNvZGUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB2YWxpZCBmb3JtYXRzCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlRoZSBjb25maWd1cmVkIHN0YXRlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtuYW1lLCBjb2RlXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmFtZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmFtZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbmZpZ3VyZQogICAgICAgICAgICB2YXIgaG9sZGluZ3MgPSBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzKAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVTdGF0ZXMsCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzLAogICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIiksCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSk7CgogICAgICAgICAgICB0aGlzLnNjaGVtYVsiZW51bSJdID0gaG9sZGluZ3Mua2V5czsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IGhvbGRpbmdzLnZhbHVlczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTdGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGRyb3Bkb3duIHNlbGVjdG9yIG9mIHN0YXRlcyBhbmQvb3IgdGVycml0b3JpZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGtleWVkIGJ5IHRoZWlyIHR3by1jaGFyYWN0ZXIgY29kZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIb3cgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjpbIm5hbWUiLCAiY29kZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNhcGl0YWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgdmFsdWVzIHNob3VsZCBiZSBjYXBpdGFsaXplZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkluY2x1ZGUgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgc3RhdGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVUZXJyaXRvcmllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkluY2x1ZGUgVGVycml0b3JpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBpbmNsdWRlIHRoZSB0ZXJyaXRvcmllcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjYXBpdGFsaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlU3RhdGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzdGF0ZSIsIEFscGFjYS5GaWVsZHMuU3RhdGVGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJzdGF0ZSIsICJzdGF0ZSIpOwoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBob2xkaW5ncyBvZiBVUyBzdGF0ZXMgYW5kIHRlcnJpdG9yaWVzLgogICAgICoKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5jbHVkZVN0YXRlcyB3aGV0aGVyIHRvIGluY2x1ZGUgVVMgc3RhdGVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVUZXJyaXRvcmllcyB3aGV0aGVyIHRvIGluY2x1ZGUgVVMgdGVycml0b3JpZXMKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29kZVZhbHVlIHdoZXRoZXIgdG8gaGFuZCBiYWNrIFVTIGhvbGRpbmcgY29kZXMgKGluc3RlYWQgb2YgbmFtZXMpCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNhcGl0YWxpemUgd2hldGhlciB0byBjYXBpdGFsaXplIHRoZSB2YWx1ZXMgaGFuZGVkIGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBhbiBvYmplY3QgY29udGFpbmluZyAia2V5cyIgYW5kICJ2YWx1ZXMiLCBib3RoIG9mIHdoaWNoIGFyZSBhcnJheXMuCiAgICAgKi8KICAgIEFscGFjYS5yZXRyaWV2ZVVTSG9sZGluZ3MgPSAoZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbihpbmNsdWRlU3RhdGVzLCBpbmNsdWRlVGVycml0b3JpZXMsIGNvZGVWYWx1ZSwgY2FwaXRhbGl6ZSkgewogICAgICAgICAgICB2YXIgcmVzICA9IHsKICAgICAgICAgICAgICAgIGtleXM6ICAgW10sCiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoCiAgICAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgICAgIGluY2x1ZGVTdGF0ZXMgICAgICA/IEFscGFjYS51c0hvbGRpbmdzLnN0YXRlcyAgICAgIDoge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlVGVycml0b3JpZXMgPyBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA6IHt9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHZhciBzb3J0ZWQgPSBPYmplY3Qua2V5cyhvcHRzKTsKICAgICAgICAgICAgc29ydGVkLnNvcnQoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3J0ZWQpIHsKICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHNvcnRlZFtpXTsKICAgICAgICAgICAgICAgIHZhciBrZXkgICA9IG9wdHNbc3RhdGVdOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29kZVZhbHVlID8ga2V5IDogc3RhdGU7CiAgICAgICAgICAgICAgICBpZiAoY2FwaXRhbGl6ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5rZXlzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgIHJlcy52YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgfSkoKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlN1bW1lcm5vdGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN1bW1lcm5vdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3VtbWVybm90ZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnN1bW1lcm5vdGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3VtbWVybm90ZSA9IHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBmb2N1czogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBTdW1tZXJub3RlIEVkaXRvcgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgJC5mbi5zdW1tZXJub3RlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKHNlbGYub3B0aW9ucy5zdW1tZXJub3RlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBzdW1tZXJub3RlJ3MgZG9tIGVsZW1lbnQgZ2V0cyBkZXN0cm95ZWQsIG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cCB0aGUgZWRpdG9yIGluc3RhbmNlCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgJChzZWxmLmNvbnRyb2wpLnN1bW1lcm5vdGUoJ2Rlc3Ryb3knKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgICwKICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3VtbWVybm90ZSBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgU3VtbWVybm90ZSBFZGl0b3IgY29udHJvbCBmb3IgdXNlIGluIGVkaXRpbmcgSFRNTC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzdW1tZXJub3RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VtbWVybm90ZSBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBTdW1tZXJub3RlIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzdW1tZXJub3RlIiwgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogVGhlIHRhYmxlIGZpZWxkIGlzIHVzZWQgZm9yIGRhdGEgcmVwcmVzZW50YXRpb25zIHRoYXQgY29uc2lzdCBvZiBhbiBhcnJheSB3aXRoIG9iamVjdHMgaW5zaWRlIG9mIGl0LiAgVGhlIG9iamVjdHMKICAgICAqIG11c3QgaGF2ZSBhIHVuaWZvcm0gc3RydWN0dXJlLiAgVGhlIHRhYmxlIGZpZWxkIHJlbmRlcnMgYSBzdGFuZGFyZCBIVE1MIHRhYmxlIHVzaW5nIHRoZSB0YWJsZS4gIFRoZSBpbmRpdmlkdWFsCiAgICAgKiBjb2x1bW5zIGFyZSBlaXRoZXIgZWRpdGFibGUgKGluIGVkaXQgbW9kZSkgb3Igc2ltcGx5IGRpc3BsYXllZCBpbiByZWFkLW9ubHkgbW9kZS4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcy5UYWJsZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmFuaW1hdGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFuaW1hdGUgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHRvb2xiYXIgc3RpY2t5IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pdGVtcy50eXBlID0gInRhYmxlcm93IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgZWl0aGVyICJkYXRhdGFibGUiIG9yICJkYXRhdGFibGVzIgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMgPSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBlbXB0eSBvcHRpb25zIGZvciBkYXRhdGFibGVzCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRhdGF0YWJsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgInBhZ2luZyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJsZW5ndGhDaGFuZ2UiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaW5mbyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzZWFyY2hpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAib3JkZXJpbmciOiB0cnVlCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGRyYWdnYWJsZSByZW9yZGVyIG9mIHJvd3MKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRyYWdSb3dzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kcmFnUm93cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIGFjdGlvbnMgY29sdW1uIHRvIGJlIHNob3duCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHRydWU7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGEgdGFibGVzIGNvbHVtbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucyA9IFtdOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlcyB0byBkZXRlY3QgYWxwYWNhIGZpZWxkIHR5cGVzIGFuZCBwZXJmb3JtIGFscGFjYSBmaWVsZCBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcKICAgICAgICAgICAgaWYgKCQuZm4uZGF0YVRhYmxlRXh0ICYmICEkLmZuLkRhdGFUYWJsZS5leHQudHlwZS5zZWFyY2hbImFscGFjYSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmZuLkRhdGFUYWJsZS5leHQub3JkZXJbImFscGFjYSJdID0gZnVuY3Rpb24gKHNldHRpbmdzLCBjb2wpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZGF0YSBwcm9wZXJ0eSBoYXMgbGF0ZXN0IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVydHkgYnkgaW5kZXgKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBjb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHNlbGYuZGF0YVtpXVtwcm9wZXJ0eU5hbWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuc29ydCgpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEga2luZCBvZiBoYWNreSBmdW5jdGlvbiBhdCB0aGUgbW9tZW50LCB0cnlpbmcgdG8gZG8gZmlsdGVyaW5nIHRoYXQgdGFrZXMgaW50byBhY2NvdW50CiAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIGRhdGEgdGFibGVzIGF1dGhvcnMsIG5lZWQgdG8gd2FpdCBmb3IgbmV4dCByZWxlYXNlIGZvciByZWZhY3RvcmluZyBvZiBmaWx0ZXJpbmcKICAgICAgICAgICAgICAgIC8vIGxvZ2ljIGluIGRhdGEgdGFibGVzIHRvIHJlYWxseSB0YWtlIGNvbnRyb2wgb2YgdGhpcyBhbmQgZG8gaXQgcmlnaHQKICAgICAgICAgICAgICAgIC8vIHRoaXMgInNvcnQgb2YiIHdvcmtzIGZvciBub3cKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAkLmZuLmRhdGFUYWJsZUV4dC5hZm5GaWx0ZXJpbmcucHVzaChmdW5jdGlvbihzZXR0aW5ncywgZmllbGRzLCBmaWVsZEluZGV4LCBkYXRhLCBkYXRhSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gJChzZXR0aW5ncy5uVGFibGVXcmFwcGVyKS5maW5kKCIuZGF0YVRhYmxlc19maWx0ZXIgaW5wdXRbdHlwZT0nc2VhcmNoJ10iKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIiICsgdGV4dDsKCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICQudHJpbSh0ZXh0KTsKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFWYWx1ZSA9IGRhdGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6ID0gZGF0YVZhbHVlLmluZGV4T2YoImRhdGEtYWxwYWNhLWZpZWxkLWlkPSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHogPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhSWQgPSAkKGRhdGFWYWx1ZSkuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtaWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYVZhbHVlID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUlkXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gIiIgKyBhbHBhY2FWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhVmFsdWUgPSBhbHBhY2FWYWx1ZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYVZhbHVlLmluZGV4T2YodGV4dCkgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGUiOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBhIHNlcGFyYXRlICJpdGVtcyIgYXJyYXkgdGhhdCB3ZSdsbCB1c2UgdG8gYnVpbGQgb3V0IHRoZSB0YWJsZSBoZWFkZXIKICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmlkID0gazsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllc1trXS50aXRsZTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLml0ZW1zICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHMgJiYgc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXS5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trXS50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaGVhZGVycy5wdXNoKGhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VGFibGVFbDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuICQoJChzZWxmLmNvbnRhaW5lcikuZmluZCgidGFibGUiKVswXSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRhYmxlIGZpZWxkIHVzZXMgdGhlICJhcnJheSIgY29udGFpbmVyIGNvbnZlbnRpb24gdG8gcmVuZGVyIHRoZSBET00uICBBcyBzdWNoLCBuZXN0ZWQgb2JqZWN0cyBhcmUgd3JhcHBlZAogICAgICAgICAqIGluICJmaWVsZCIgZWxlbWVudHMgdGhhdCByZXN1bHQgaW4gc2xpZ2h0bHkgaW5jb3JyZWN0IHRhYmxlIHN0cnVjdHVyZXMuICBQYXJ0IG9mIHRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdAogICAgICAgICAqIGJyb3dzZXJzIGFyZSB2ZXJ5IGZ1c3N5IHdoZW4gaXQgY29tZXMgdG8gaW5qZWN0aW9uIG9mIG5lc3RlZCBUUiBvciBURCBwYXJ0aWFscy4gIEhlcmUsIHdlIGdlbmVyYXRlIG1vc3QKICAgICAgICAgKiB0aGluZ3MgYXMgRElWcyBhbmQgdGhlbiBkbyBzb21lIGNsZWFudXAgaW4gdGhpcyBtZXRob2QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGlzIHB1dCB0b2dlaHRlciBpbiB0aGUKICAgICAgICAgKiByaWdodCB3YXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFudXBEb21JbmplY3Rpb25zKCk7CgogICAgICAgICAgICAgICAgLy8gYXBwbHkgc3R5bGVzIG9mIHVuZGVybHlpbmcgInRhYmxlIgogICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gc2VsZi5nZXRUYWJsZUVsKCk7CiAgICAgICAgICAgICAgICBzZWxmLmFwcGx5U3R5bGUoInRhYmxlIiwgdGFibGUpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBEYXRhVGFibGVzIHBsdWdpbiBpcyBhdmFpbGFibGUsIHVzZSBpdAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhdGFibGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgkLmZuLkRhdGFUYWJsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHNldHRpbmcgdXAgZm9yIGRyYWdnaW5nIHJvd3MsIHRoZW4gYWRkIHRoYXQgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImRyYWdSb3dzSW5kZXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWRkZW4iOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0RyYWdnYWJsZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXggaW4gZmllbGRzIGZyb20gdGhlIGl0ZW1zCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbENvbmZpZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJEYXRhVHlwZSI6ICJhbHBhY2EiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaChjb2xDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGFjdGlvbnMgY29sdW1uIGVuYWJsZWQsIHRoZW4gdHVybiBvZmYgc29ydGluZyBmb3IgdGhlIGFjdGlvbnMgY29sdW1uIChhc3N1bWVkIHRvIGJlIGxhc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kcmFnUm93cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXNbInJvd1Jlb3JkZXIiXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0b3IiOiAidHIgdGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU3JjIjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic25hcFgiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGUiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFVkVOVCBIQU5ETEVSUwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgInJlYWR5IiBldmVudCBhbmQgd2hlbiBpdCBmaXJlcywgaW5pdCBkYXRhIHRhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgRE9NIGFuZCBhbnl0aGluZyB3cmFwcGluZyBvdXIgdGFibGUgZmllbGQgaW5zdGFuY2UgaXMgcmVhZHkgdG8gcm9jawogICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgd2UgcHJvY2VlZAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZigicmVhZHkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyIGRvd24gb2xkIGRhdGEgdGFibGVzIGRhdGEgaWYgaXQgaXMgc3RpbGwgYXJvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGUgZG9tIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgdGFibGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdCA9ICQodGFibGUpLkRhdGFUYWJsZShzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgInJvdy1yZW9yZGVyIiBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oInJvdy1yZW9yZGVyIiwgZnVuY3Rpb24oZSwgZGlmZiwgZWRpdCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIGRhdGEgc3RydWN0dXJlIHRvIHJlZmxlY3QgdGhlIHNoaWZ0IGluIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZlswXS5vbGRQb3NpdGlvbiAhPT0gZGlmZlswXS5uZXdQb3NpdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmVJdGVtKGRpZmZbMF0ub2xkUG9zaXRpb24sIGRpZmZbMF0ubmV3UG9zaXRpb24sIGZhbHNlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSB1bmRlcmx5aW5nIHRhYmxlIERPTSBlbGVtZW50IGJlaW5nIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGF0IGhhcHBlbnMsIHRlYXIgZG93biB0aGUgZGF0YXRhYmxlcyBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5iaW5kKCdkZXN0cm95ZWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSBzb3J0aW5nIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIG9yZGVyIG9mIGNoaWxkcmVuIGFuZCByZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5vbignb3JkZXInLCBmdW5jdGlvbiAoIGUsIGN0eCwgc29ydGluZywgY29sdW1ucyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBvcmlnaW5hbCBjb3B5IG9mIHRoZSBjaGlsZHJlbiwgbWFrZSBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBhYm91dCB0byByZS1vcmRlciB0aGUgY2hpbGRyZW4gYW5kIGRhdGF0YWJsZSBhc3N1bWVzIHdlIGtub3cgdGhlIG9yaWdpbmFsIG9yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9vcmlnaW5hbENoaWxkcmVuLnB1c2goc2VsZi5jaGlsZHJlbltrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9yZGVyIGJhc2VkIG9uIHRoZSBvcmRlciB0aGF0IGRhdGF0YWJsZXMgYmVsaWV2ZXMgaXMgcmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGN0eC5haURpc3BsYXkubGVuZ3RoOyB6KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBjdHguYWlEaXNwbGF5W3pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHNlbGYuX2R0Ll9vcmlnaW5hbENoaWxkcmVuW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX2Rpc2FibGVBbHBhY2FIYW5kbGVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGhlYWRlcnMgYW5kIGFsbG93IGZvciBjYWxsYmFjay1iYXNlZCBjb25maWcKICAgICAgICAgICAgICAgICQodGFibGUpLmNoaWxkcmVuKCJ0aGVhZCA+IHRyID4gdGhbZGF0YS1oZWFkZXItaWRdIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1oZWFkZXItaWQiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHMgJiYgc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tleV07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInRhYmxlSGVhZGVyUmVxdWlyZWQiIG9yICJ0YWJsZUhlYWRlck9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQgfHwgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInRhYmxlSGVhZGVyUmVxdWlyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJ0YWJsZUhlYWRlclJlcXVpcmVkIiwgc2NoZW1hLCBvcHRpb25zLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlck9wdGlvbmFsIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJPcHRpb25hbCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsvLy5iaW5kKHNlbGYpKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhbnVwRG9tSW5qZWN0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRha2VzIGEgRE9NIGVsZW1lbnQgYW5kIG1lcmdlcyBpdCAidXAiIHRvIHRoZSBwYXJlbnQgZWxlbWVudC4gIERhdGEgYXR0cmlidXRlcyBhbmQgc29tZSBjbGFzc2VzIGFyZQogICAgICAgICAgICAgKiBjb3BpZWQgZnJvbSBET00gZWxlbWVudCBpbnRvIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBjaGlsZHJlbiBvZiB0aGUgRE9NIGVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZQogICAgICAgICAgICAgKiBwYXJlbnQgYW5kIHRoZSBET00gZWxlbWVudCBpcyByZW1vdmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbWVyZ2VFbGVtZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50VXAgPSBmdW5jdGlvbihtZXJnZUVsZW1lbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBtZXJnZUVsZW1lbnRQYXJlbnQgPSAkKG1lcmdlRWxlbWVudCkucGFyZW50KCk7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50Q2hpbGRyZW4gPSAkKG1lcmdlRWxlbWVudCkuY2hpbGRyZW4oKTsKCiAgICAgICAgICAgICAgICAvLyBjb3B5IG1lcmdlIGVsZW1lbnQgY2xhc3NlcyB0byBwYXJlbnQKICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gJChtZXJnZUVsZW1lbnQpLmF0dHIoJ2NsYXNzJykuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAgICAgJC5lYWNoKCBjbGFzc05hbWVzLCBmdW5jdGlvbihpbmRleCwgY2xhc3NOYW1lKXsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAiYWxwYWNhLW1lcmdlLXVwIikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmFkZENsYXNzKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY29weSBhdHRyaWJ1dGVzIHRvIFRSCiAgICAgICAgICAgICAgICAkLmVhY2goJChtZXJnZUVsZW1lbnQpWzBdLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lLmluZGV4T2YoImRhdGEtIikgPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKG1lcmdlRWxlbWVudFBhcmVudCkuYXR0cih0aGlzLm5hbWUsIHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgZmllbGQgd2l0aCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKG1lcmdlRWxlbWVudENoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlcGxhY2VXaXRoKG1lcmdlRWxlbWVudENoaWxkcmVuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKG1lcmdlRWxlbWVudCkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgdHJFbGVtZW50cyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1maWVsZCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgJCh0ckVsZW1lbnRzKS5jaGlsZHJlbigiLmFscGFjYS1maWVsZCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBmaW5kIGVhY2ggVFIncyAuYWxwYWNhLWNvbnRhaW5lciBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgJCh0ckVsZW1lbnRzKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXIiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWN0aW9uIGJhcnMgZm9yIG91ciBmaWVsZCBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FBcnJheUFjdGlvbmJhciA9IHNlbGYuZ2V0RmllbGRFbCgpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoYWxwYWNhQXJyYXlBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhQXJyYXlBY3Rpb25iYXIuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FjdGlvbmJhcicgbm93cmFwPSdub3dyYXAnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCh0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVyRHJhZ2dhYmxlQ2VsbHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCc+PC90ZD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmJlZm9yZSh0ZCk7CiAgICAgICAgICAgICAgICAgICAgJCh0ZCkuYXBwZW5kKCQodGhpcykuY2hpbGRyZW4oKSk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CgogICAgICAgICAgICAvLyBmaW5kIGFueSBhbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsIGVsZW1lbnRzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGQuYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzLmVhY2goZnVuY3Rpb24oaSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCc+IiArIGkgKyAiPC90ZD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmJlZm9yZSh0ZCk7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5kIGFueXRoaW5nIGVsc2Ugd2l0aCAuYWxwYWNhLW1lcmdlLXVwIGFuZCBtZXJnZSB1cAogICAgICAgICAgICB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLW1lcmdlLXVwIFtkYXRhLW1lcmdlLXVwLWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBkb1Jlc29sdmVJdGVtQ29udGFpbmVyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5Iik7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgZHJhZ1Jvd3Mgc3VwcG9ydCwgd2UgaGF2ZSBubyBjaG9pY2UgaGVyZSBleGNlcHQgdG8gY29tcGxldGVseSByZWJvb3QgdGhlIHRhYmxlIGluIG9yZGVyCiAgICAgICAgICAgIC8vIHRvIGdldCBEYXRhVGFibGVzIHRvIGJpbmQgdGhpbmdzIGNvcnJlY3RseSBmb3IgZHJhZy1kcm9wIHN1cHBvcnQKICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIGRyYWdSb3dzIHRvIHVzZSBvdXIgb3duIGRyYWcvZHJvcCB0b29saW5nIGFuZCBnZXQgcmlkIG9mIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luCiAgICAgICAgICAgIC8vIHdlIGFsc28gaGF2ZSBkbyB0aGlzIGlmIHdlJ3ZlIGFkZGVkIHRoZSBmaXJzdCByb3cgdG8gZ2V0IERhdGFUYWJsZXMgdG8gcmVkcmF3CiAgICAgICAgICAgIHZhciB1c2luZ0RhdGFUYWJsZXMgPSBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcyAmJiAkLmZuLkRhdGFUYWJsZTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kcmFnUm93cyB8fCAodXNpbmdEYXRhVGFibGVzICYmIHNlbGYuZGF0YS5sZW5ndGggPT09IDEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZWZyZXNoCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgYWRkZWQgYSByb3cKICAgICAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYnkgZmluZGluZyB0aGUgVFIgYW5kIHRoZW4gYWRkaW5nIHRoYXQgd2F5CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgICAgIHZhciB0ciA9IHNlbGYuZmllbGQuZmluZCgiW2RhdGEtYWxwYWNhLWZpZWxkLXBhdGg9JyIgKyBpdGVtLnBhdGggKyAiJ10iKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5yb3cuYWRkKHRyKTsvLy5kcmF3KGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGNoaWxkSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgLy8gVE9ETzogc2VlIGFib3ZlCgogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbmZvcm0gZGF0YSB0YWJsZXMgdGhhdCB3ZSd2ZSByZW1vdmVkIGEgcm93CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZHQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93cyhjaGlsZEluZGV4KS5yZW1vdmUoKTsvLy5kcmF3KGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFibGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSB0YWJsZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRhdGFibGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0YVRhYmxlcyBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gYmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIERhdGFUYWJsZXMgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNob3cgQWN0aW9ucyBDb2x1bW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgYWN0aW9ucyBjb2x1bW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkcmFnUm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRyYWcgUm93cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZHJhZ2dpbmcgb2Ygcm93cyB2aWEgYSBkcmFnZ2FibGUgY29sdW1uLiAgVGhpcyByZXF1aXJlcyBEYXRhVGFibGVzIGFuZCB0aGUgRGF0YVRhYmxlcyBSb3cgUmVvcmRlciBQbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dBY3Rpb25zQ29sdW1uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkcmFnUm93cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRhYmxlIiwgQWxwYWNhLkZpZWxkcy5UYWJsZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFibGVSb3dGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIHByZXBhcmVDb250YWluZXJNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gc2VsZi5wYXJlbnQub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbjsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMuZHJhZ1Jvd3MgPSBzZWxmLnBhcmVudC5vcHRpb25zLmRyYWdSb3dzOwoKICAgICAgICAgICAgICAgIC8vIHdhbGsgYWxsIGl0ZW1zIGFuZCBtYXJrIGhpZGRlbnMgc28gdGhhdCB0aGUgdGVtcGxhdGUgY2FuIGVhc2lseSBwaWNrIHRoaXMgdXAKICAgICAgICAgICAgICAgIC8vIGhpZGRlbnMgYXJlIGFwcGxpZWQgdGhlICJhbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbiIgY3NzIGNsYXNzIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLml0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtc1tpXS5vcHRpb25zLnR5cGUgPT09ICJoaWRkZW4iKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaXRlbXNbaV0uaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWJsZXJvdyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFibGUgUm93IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBvYmplY3QgaXRlbXMgaW50byBhIHRhYmxlIHJvdyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZXJvdyIsIEFscGFjYS5GaWVsZHMuVGFibGVSb3dGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCA9IEFscGFjYS5GaWVsZHMuTG93ZXJDYXNlRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zZXBhcmF0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXBhcmF0b3IgPSAiLCI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsID09PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsLnNwbGl0KHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UoIiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsLmpvaW4odGhpcy5vcHRpb25zLnNlcGFyYXRvcikpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQmx1cgogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciB2YWxzID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSBbXTsKCiAgICAgICAgICAgICQuZWFjaCh2YWxzLCBmdW5jdGlvbihpLCB2KSB7CgogICAgICAgICAgICAgICAgaWYgKHYudHJpbSgpICE9PSAiIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnB1c2godi50cmltKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJpbW1lZCk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUYWcgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgZW50ZXJpbmcgbGlzdCBvZiB0YWdzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNlcGFyYXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZXBhcmF0b3IgdXNlZCB0byBzcGxpdCB0YWdzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiLCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWciLCBBbHBhY2EuRmllbGRzLlRhZ0ZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRpbWUiOwogICAgICAgIH0sCgogICAgICAgIGdldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmRlZmF1bHRUaW1lRm9ybWF0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRpbWUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gInRpbWUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUaW1lIEZpZWxkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFRpbWUiOiAiSW52YWxpZCB0aW1lIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0aW1lIiwgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidGltZSIsICJ0aW1lIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW55TUNFRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgICAgIC8qKgogICAgICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLnRpbnlNQ0VGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRpbnltY2UiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudG9vbGJhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudG9vbGJhciA9ICJpbnNlcnRmaWxlIHVuZG8gcmVkbyB8IHN0eWxlc2VsZWN0IHwgYm9sZCBpdGFsaWMgfCBhbGlnbmxlZnQgYWxpZ25jZW50ZXIgYWxpZ25yaWdodCBhbGlnbmp1c3RpZnkgfCBidWxsaXN0IG51bWxpc3Qgb3V0ZGVudCBpbmRlbnQgfCBsaW5rIGltYWdlIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRDb250ZW50KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0Q29udHJvbFZhbHVlOmZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5lZGl0b3IuZ2V0Q29udGVudCgpCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW5pdFRpbnlNQ0VFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbignYmx1cicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb2N1cyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Gb2N1cy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImZvY3VzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXByZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXByZXNzIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5VXAuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiBzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKHRpbnlNQ0UpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJ0ZUZpZWxkSUQgPSAkKHNlbGYuY29udHJvbClbMF0uaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnlNQ0UuaW5pdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfaW5zdGFuY2VfY2FsbGJhY2s6IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBlZGl0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0VGlueU1DRUV2ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogIiMiICsgcnRlRmllbGRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhcjogc2VsZi5vcHRpb25zLnRvb2xiYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIHBsdWdpbiBpbnN0YW5jZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfSwKCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJUaW55TUNFIEVkaXRvciI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgYSBUaW55TUNFIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidG9vbGJhciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaW55TUNFIHRvb2xiYXIgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9vbGJhciBvcHRpb25zIGZvciBUaW55TUNFIHBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0aW55bWNlIiwgQWxwYWNhLkZpZWxkcy5UaW55TUNFRmllbGQpOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0b2tlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b2tlbmZpZWxkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZC5zaG93QXV0b2NvbXBsZXRlT25Gb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9rZW5maWVsZC5zaG93QXV0b2NvbXBsZXRlT25Gb2N1cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25CbHVyOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZigkLmZuLnRva2VuZmllbGQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbihzZWxmLCB0b2tlbmZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS50b2tlbmZpZWxkKHRva2VuZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgc2VsZi5vcHRpb25zLnRva2VuZmllbGQpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUb2tlbiBmaWVsZCBmb3IgZW50ZXJpbmcgbGlzdCBvZiB0b2tlbnMgc2VwYXJhdGVkIGJ5IGRlbGltaXRlci4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdG9rZW5zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiLCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b2tlbmZpZWxkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9rZW4gRmllbGQgb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZXR0aW5ncyB0byBwYXNzIGludG8gdGhlIHVuZGVybHlpbmcgYm9vdHN0cmFwLXRva2VuZmllbGQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidG9rZW4iLCBBbHBhY2EuRmllbGRzLlRva2VuRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQgPSBBbHBhY2EuQ29udHJvbEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0cwogICAgICAgICAqIEBhdWdtZW50cyBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZAogICAgICAgICAqCiAgICAgICAgICogQGNsYXNzIEZpbGUgdXBsb2FkIGNvbnRyb2wgdGhhdCBjYW4gYmUgbW91bnRlZCBvbiB0b3Agb2YgIm9iamVjdCIgb3IgImFycmF5IiB0eXBlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWluZXIgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBkYXRhIEZpZWxkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgRmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIEZpZWxkIHNjaGVtYS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZpZXcgRmllbGQgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBGaWVsZCBjb25uZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoY29udGFpbmVyLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3Rvcik7CgogICAgICAgICAgICB0aGlzLmlzQXJyYXlUeXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuaXNPYmplY3RUeXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zY2hlbWEudHlwZSA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyB3cmFwcyBhbiBleGlzdGluZyB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGludG8gYSBtZXRob2QgdGhhdCBsb29rcyBsaWtlIGZuKG1vZGVsKQogICAgICAgICAgICAvLyB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIGZpbGVpbnB1dAogICAgICAgICAgICAvLyBjb25maWcgbG9va3MgbGlrZQogICAgICAgICAgICAvLyAgICB7CiAgICAgICAgICAgIC8vICAgICAgICJmaWxlcyI6IFtdLAogICAgICAgICAgICAvLyAgICAgICAiZm9ybWF0RmlsZVNpemUiOiBmbiwKICAgICAgICAgICAgLy8gICAgICAgIm9wdGlvbnMiOiB7fQogICAgICAgICAgICAvLyAgICB9CiAgICAgICAgICAgIC8vCgogICAgICAgICAgICB0aGlzLndyYXBUZW1wbGF0ZSA9IGZ1bmN0aW9uKHRlbXBsYXRlSWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb25maWcpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVzID0gY29uZmlnLmZpbGVzOwogICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXRGaWxlU2l6ZSA9IGNvbmZpZy5mb3JtYXRGaWxlU2l6ZTsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucyA9IHNlbGYub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZSA9IEFscGFjYS5jbG9uZU9iamVjdChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNpemUgPSBmb3JtYXRGaWxlU2l6ZShtb2RlbC5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuYnV0dG9ucyA9IHNlbGYub3B0aW9ucy5idXR0b25zOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlSW5kZXggPSBpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IEFscGFjYS50bXBsKHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGVtcGxhdGVJZCksIG1vZGVsLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHVzaChyb3dbMF0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcm93cyA9ICQocm93cyk7CiAgICAgICAgICAgICAgICAgICAgJChyb3dzKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXVwbG9hZCAmJiBvcHRpb25zLmZpbGV1cGxvYWQuYXV0b1VwbG9hZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBzdGFydCBidXR0b24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgiYnV0dG9uLnN0YXJ0IikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVXcmFwUm93KHRoaXMsIG9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBldmVudCBnZXRzIGZpcmVkIHdoZW4gZmlsZWltcGwgaGFzIGNsZWFuZWQgdXAgdGhlIERPTSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhbmRsZSBBamF4IHJlbGF0ZWQgc3R1ZmYgb24gb3VyIG93biBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImRlc3Ryb3llZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5kZWxldGUiKS5vbigiY2xpY2siLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gJChyb3cpLmZpbmQoImJ1dHRvbi5kZWxldGUiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUluZGV4ID0gJChidXR0b24pLmF0dHIoImRhdGEtZmlsZS1pbmRleCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tmaWxlSW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25GaWxlRGVsZXRlLmNhbGwoc2VsZiwgcm93LCBidXR0b24sIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGZpbGVJbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoYXJyYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VsZi5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVUlTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkKHJvd3MpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ1cGxvYWQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGJvdHRvbSBjb250cm9sIGJ1dHRvbnMgKHdlIGhhdmUgYSBjb25mbGljdCBvdmVyIHRoZSAnYnV0dG9ucycgbmFtZXNwYWNlKQogICAgICAgICAgICBzZWxmLm9wdGlvbnMucmVuZGVyQnV0dG9ucyA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJ1dHRvbnMgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuaGlkZURlbGV0ZUJ1dHRvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJ1dHRvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgImtleSI6ICJkZWxldGUiLAogICAgICAgICAgICAgICAgICAgICJpc0RlbGV0ZSI6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5zaG93VXBsb2FkUHJldmlldykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5zaG93SGVhZGVycykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYXJyYXkgaWYgbm90IGFycmF5IGFscmVhZHkKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi5kYXRhKSkgewogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gW3NlbGYuZGF0YV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHVwbG9hZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBjb3B5aW5nIGJhY2sgdGhlIG1heE51bWJlck9mRmlsZXMgZnJvbSB0aGUgdXBsb2FkIHBsdWdpbidzIHNldHRpbmdzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlndXJlIG91dCByZWFzb25hYmxlIG1heE51bWJlck9mRmlsZXMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNhZmUgZ3VhcmQKICAgICAgICAgICAgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9PT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID4gMSB8fCBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZCBwbHVnaW4gY29uZmlnCiAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlcyA9IDk5OTk7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBtYXggZmlsZSBzaXplCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IHNlbGYub3B0aW9ucy51cGxvYWQubWF4RmlsZVNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heEZpbGVTaXplID0gLTE7IC8vIG5vIGxpbWl0CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29weSBzZXR0aW5nIGludG8gdXBsb2FkCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbGUgdHlwZXMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudXBsb2FkLmFjY2VwdEZpbGVUeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IG51bGw7IC8vIG5vIHJlc3RyaWN0aW9ucwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBlcnJvciBoYW5kbGVyCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlciA9IGZ1bmN0aW9uKG1lc3NhZ2VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KG1lc3NhZ2VzLmpvaW4oIlxuIikpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgQWxwYWNhIGlzIGNvbmZpZ3VyZWQgZm9yIENTUkYgc3VwcG9ydCBhbmQgYSBDU1JGIGNvb2tpZSBvciB0b2tlbiBpcyBhdmFpbGFibGUsCiAgICAgICAgICAgIC8vIHRoZW4gYXBwbHkgaXQgdG8gdGhlIGhlYWRlcnMgdGhhdCBhcmUgc2VudCBvdmVyIHRoZSB3aXJlIHZpYSB0aGUgdW5kZXJseWluZyBhamF4CiAgICAgICAgICAgIC8vIGZvciB0aGUgZmlsZSB1cGxvYWQgY29udHJvbAoKICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIENTUkYgdG9rZW4sIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy51cGxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnRodW1ibmFpbExhYmVsID0gc2VsZi5vcHRpb25zLnRodW1ibmFpbExhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC50aHVtYm5haWxMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgidGh1bWJuYWlsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVuYW1lTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZW5hbWVMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZW5hbWVMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlbmFtZSIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlU2l6ZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVTaXplTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVTaXplTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVNpemUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlVXBsb2FkQWN0aW9uc0xhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVVcGxvYWRBY3Rpb25zTGFiZWwiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuY2hvb3NlQnV0dG9uTGFiZWwgPSBzZWxmLm9wdGlvbnMuY2hvb3NlQnV0dG9uTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmNob29zZUJ1dHRvbkxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJjaG9vc2VGaWxlcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJjaG9vc2VGaWxlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5kcm9wWm9uZU1lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmRyb3Bab25lTWVzc2FnZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoImRyb3Bab25lTXVsdGlwbGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZVNpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlID0gc2VsZi5vcHRpb25zLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgic2VsZWN0RnJvbUV4aXN0aW5nTXVsdGlwbGUiKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgic2VsZWN0RnJvbUV4aXN0aW5nU2luZ2xlIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUG9zdFJlbmRlcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gZGlzcGxheS1vbmx5IG1vZGUsIHdlIGhpZGUgYSBidW5jaCBvZiB0aGluZ3MKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiYnV0dG9uIikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0biIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3ciKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZHJvcHpvbmUtbWVzc2FnZSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHVwbG9hZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRVcGxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC11cGxvYWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREb3dubG9hZFRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcFRlbXBsYXRlKCJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLWRvd25sb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50IGZvciBtb2RpZnlpbmcgdGhlIGRhdGEgYWhlYWQgb2YgYW4gdXBsb2FkIHN1Ym1pdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlQmVmb3JlRmlsZVVwbG9hZFN1Ym1pdDogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5jb250cm9sOwoKICAgICAgICAgICAgLy8gZmlsZSB1cGxvYWQgY29uZmlnCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkQ29uZmlnID0ge307CgogICAgICAgICAgICAvLyBkZWZhdWx0cwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkYXRhVHlwZSJdID0gImpzb24iOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cGxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cGxvYWRUZW1wbGF0ZSJdID0gdGhpcy5nZXRVcGxvYWRUZW1wbGF0ZSgpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlSWQiXSA9IG51bGw7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImRvd25sb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0RG93bmxvYWRUZW1wbGF0ZSgpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJmaWxlc0NvbnRhaW5lciJdID0gJChlbCkuZmluZCgiLmZpbGVzIik7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImRyb3Bab25lIl0gPSAkKGVsKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJ1cmwiXSA9ICIvIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sibWV0aG9kIl0gPSAicG9zdCI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbInNob3dVcGxvYWRQcmV2aWV3Il0gPSBzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXc7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdba10gPSBzZWxmLm9wdGlvbnMudXBsb2FkW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQiKS5hdHRyKCJtdWx0aXBsZSIsIHRydWUpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQiKS5hdHRyKCJuYW1lIiwgc2VsZi5uYW1lICsgIl9maWxlc1tdIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYub3B0aW9ucy5uYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgcHJvZ3Jlc3MgYmFyIGF0IGZpcnN0CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSWYgYSBmaWxlIGlzIGJlaW5nIHVwbG9hZGVkLCBzaG93IHRoZSBwcm9ncmVzcyBiYXIuICBPdGhlcndpc2UsIGhpZGUgaXQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJwcm9ncmVzc2FsbCJdID0gZnVuY3Rpb24gKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sb2FkZWQgPCBkYXRhLnRvdGFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzc0JhciA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzQmFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHBhcnNlSW50KGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApOwogICAgICAgICAgICAgICAgICAgICQoJyNwcm9ncmVzcyAucHJvZ3Jlc3MtYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyArICclJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLnByb2dyZXNzIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNvbWUgbGltaXQgY2hlY2tzCiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbImFkZCJdID0gZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIHZhciB1cGxvYWRFcnJvcnMgPSBbXTsKCiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBiYWQgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IHNlbGYub3B0aW9ucy5maWxlVHlwZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZSA9IG5ldyBSZWdFeHAoc2VsZi5vcHRpb25zLmZpbGVUeXBlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRhdGEuZmlsZXNbaV1bInR5cGUiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRXJyb3JzLnB1c2goJ05vdCBhbiBhY2NlcHRlZCBmaWxlIHR5cGU6ICcgKyBkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlc1tpXS5zaXplID4gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRXJyb3JzLnB1c2goc2VsZi5nZXRNZXNzYWdlKCJmaWxlVG9vQmlnIikgKyBkYXRhLmZpbGVzW2ldLnNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChiYWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGRhdGEuZmlsZXMubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICBpZiAodXBsb2FkRXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcih1cGxvYWRFcnJvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgZXh0ZW5zaW9uCiAgICAgICAgICAgIHNlbGYuYXBwbHlDb25maWd1cmF0aW9uKGZpbGVVcGxvYWRDb25maWcpOwoKICAgICAgICAgICAgLy8gaW5zdGFudGlhdGUgdGhlIGNvbnRyb2wKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLmZpbGVVcGxvYWQgPSAkKGVsKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKS5maWxldXBsb2FkKGZpbGVVcGxvYWRDb25maWcpOwoKICAgICAgICAgICAgLy8gV2hlbiBmaWxlIHVwbG9hZCBvZiBhIGZpbGUgY29tcGxldGVzLCB3ZSBvZmZlciB0aGUgY2hhbmNlIHRvIGFkanVzdCB0aGUgZGF0YSBhaGVhZCBvZiBGaWxlVXBsb2FkCiAgICAgICAgICAgIC8vIGdldHRpbmcgaXQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgeW91IGNhbid0IGNoYW5nZSB0aGUgc2VydmVyIHNpZGUgSlNPTiBidXQgY291bGQgZG8KICAgICAgICAgICAgLy8gYSBsaXR0bGUgYml0IG9mIG1hZ2ljIGluIHRoZSBjbGllbnQuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2FkZG9uZSIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgZW5oYW5jZUZpbGVzID0gc2VsZi5vcHRpb25zLmVuaGFuY2VGaWxlczsKICAgICAgICAgICAgICAgIGlmIChlbmhhbmNlRmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW5oYW5jZUZpbGVzKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5oYW5jZUZpbGVzKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYmFjayBkb3duIGludG8gZGF0YS5maWxlcwogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGRhdGEucmVzdWx0LmZpbGVzOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0sIDI1MCk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZXMgYXJlIHN1Ym1pdHRlZCwgdGhlICJwcm9wZXJ0aWVzIiBhbmQgInBhcmFtZXRlcnMiIG9wdGlvbnMgbWFwIGFyZSBlc3BlY2lhbGx5IHRyZWF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFyZSB3cml0dGVuIGludG8gcHJvcGVydHk8aW5kZXg+X188a2V5PiBhbmQgcGFyYW08aW5kZXg+X19rZXkgZW50cmllcyBpbiB0aGUgZm9ybSBkYXRhLgogICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBmb3IgbXVsdGktcGFydCByZWNlaXZlcnMgdG8gZ2V0IHZhbHVlcyBvbiBhIHBlci1maWxlIGJhc2lzLgogICAgICAgICAgICAvLyBQbGFucyBhcmUgdG8gYWxsb3cgdG9rZW4gc3Vic3RpdHV0aW9uIGFuZCBvdGhlciBjbGllbnQtc2lkZSB0cmVhdG1lbnQgYWhlYWQgb2YgcG9zdGluZy4KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kRmlyc3QoImZpbGV1cGxvYWRzdWJtaXQiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gInByb3BlcnR5IiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVZhbHVlID0gc2VsZi5vcHRpb25zWyJwcm9wZXJ0aWVzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwcm9wZXJ0eVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRhdGEuZmlsZXMsIGZ1bmN0aW9uKGluZGV4LCBmaWxlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbU5hbWUgPSAicGFyYW0iICsgaW5kZXggKyAiX18iICsga2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtVmFsdWUgPSBzZWxmLm9wdGlvbnNbInBhcmFtZXRlcnMiXVtrZXldOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIHN1YnN0aXR1dGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBzZWxmLmFwcGx5VG9rZW5TdWJzdGl0dXRpb25zKHBhcmFtVmFsdWUsIGluZGV4LCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZm9ybURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YVtwYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQmVmb3JlRmlsZVVwbG9hZFN1Ym1pdChkYXRhKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmJlZm9yZUZpbGVVcGxvYWRTdWJtaXRIYW5kbGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlci5jYWxsKHNlbGYsIGRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hlbiBmaWxlcyBhcmUgdXBsb2FkZWQsIHdlIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZG9uZSIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICAvLyBleGlzdGluZwogICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gc2VsZi5nZXRWYWx1ZUFzQXJyYXkoKTsKCiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKGkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGRhdGEuZmlsZXMubGVuZ3RoKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0RmlsZVRvRGVzY3JpcHRvcihkYXRhLmZpbGVzW2ldLCBmdW5jdGlvbiAoZXJyLCBkZXNjcmlwdG9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChkZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZihpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGYoMCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZSB1cGxvYWRzIGZhaWwsIGFsZXJ0Li4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRmYWlsIiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yVGhyb3duKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25VcGxvYWRGYWlsKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBzdWNjZXNzIG9yIGZhaWwsIHdlIGhhbmRsZSB0aGUgcmVzdWx0cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGFsd2F5cyIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgZXh0ZW5zaW9uCiAgICAgICAgICAgIHNlbGYuYXBwbHlCaW5kaW5ncyhmaWxlVXBsb2FkLCBlbCk7CgogICAgICAgICAgICAvLyBhbGxvdyBmb3IgcHJlbG9hZGluZyBvZiBkb2N1bWVudHMKICAgICAgICAgICAgc2VsZi5wcmVsb2FkKGZpbGVVcGxvYWQsIGVsLCBmdW5jdGlvbihmaWxlcykgewoKICAgICAgICAgICAgICAgIGlmIChmaWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9ICQoc2VsZi5jb250cm9sKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKTsKICAgICAgICAgICAgICAgICAgICAkKGZvcm0pLmZpbGV1cGxvYWQoJ29wdGlvbicsICdkb25lJykuY2FsbChmb3JtLCAkLkV2ZW50KCdkb25lJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyUHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZmlsZXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihkb2N1bWVudCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5iaW5kKCdkcm9wIGRyYWdvdmVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGhhbmRsZVdyYXBSb3c6IGZ1bmN0aW9uKHJvdywgb3B0aW9ucykKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIGFwcGx5VG9rZW5TdWJzdGl0dXRpb25zOiBmdW5jdGlvbih0ZXh0LCBpbmRleCwgZmlsZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0b2tlbnMgPSB7CiAgICAgICAgICAgICAgICAiaW5kZXgiOiBpbmRleCwKICAgICAgICAgICAgICAgICJuYW1lIjogZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZmlsZS51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjogZmlsZS50aHVtYm5haWxVcmwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHN1YnN0aXR1dGUgYW55IHRva2VucwogICAgICAgICAgICB2YXIgeCA9IC0xOwogICAgICAgICAgICB2YXIgYiA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSB0ZXh0LmluZGV4T2YoInsiLCBiKTsKICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSB0ZXh0LmluZGV4T2YoIn0iLCB4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdGV4dC5zdWJzdHJpbmcoeCArIGNhci5sZW5ndGgsIHkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gdG9rZW5zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyByZXBsYWNlbWVudCArIHRleHQuc3Vic3RyaW5nKHkrMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB5ICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUoeCA+IC0xKTsKCiAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgYWRkaW5nIHByb3BlcnRpZXMgYW5kIGNhbGxiYWNrcyB0byB0aGUgZmlsZSB1cGxvYWQgY29uZmlnLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGZpbGVVcGxvYWRjb25maWcKICAgICAgICAgKi8KICAgICAgICBhcHBseUNvbmZpZ3VyYXRpb246IGZ1bmN0aW9uKGZpbGVVcGxvYWRjb25maWcpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgYmluZGluZyBldmVudCBoYW5kbGVycyB0byBmaWxlIHVwbG9hZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkCiAgICAgICAgICovCiAgICAgICAgYXBwbHlCaW5kaW5nczogZnVuY3Rpb24oZmlsZVVwbG9hZCkKICAgICAgICB7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgZnJvbSBhIGZpbGUgdG8gYSBzdG9yYWdlIGRlc2NyaXB0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBBIGRlc2NyaXB0b3IgbG9va3MgbGlrZToKICAgICAgICAgKgogICAgICAgICAqICAgICAgewogICAgICAgICAqICAgICAgICAgICJpZCI6ICIiCiAgICAgICAgICogICAgICAgICAgLi4uCiAgICAgICAgICogICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBBIGRlc2NyaXB0b3IgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFzIG5lZWRlZCBieSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICogc28gYXMgdG8gcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgdGhlIGRlc2NyaWJlZCBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIG1lY2hhbmlzbSBtYXkgbmVlZCB0byBiZSBjb25zdWx0ZWQuICBUaHVzLCB0aGlzIGlzIGFzeW5jLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGZpbGUKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBkZXNjcmlwdG9yKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnRGaWxlVG9EZXNjcmlwdG9yOiBmdW5jdGlvbihmaWxlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gewogICAgICAgICAgICAgICAgImlkIjogZmlsZS5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZmlsZS51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpmaWxlLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBmaWxlLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZmlsZS5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkZXNjcmlwdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHN0b3JhZ2UgZGVzY3JpcHRvciB0byBhIGZpbGUuCiAgICAgICAgICoKICAgICAgICAgKiBBIGZpbGUgbG9va3MgbGlrZToKICAgICAgICAgKgogICAgICAgICAqICAgICAgewogICAgICAgICAqICAgICAgICAgICJpZCI6ICIiLAogICAgICAgICAqICAgICAgICAgICJuYW1lIjogInBpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgInNpemUiOiA5MDI2MDQsCiAgICAgICAgICogICAgICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgInRodW1ibmFpbFVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3RodW1ibmFpbFwvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICAgICAiZGVsZXRlVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiCiAgICAgICAgICogICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBTaW5jZSBhbiB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtIG1heSBiZSBjb25zdWx0ZWQsIGFuIGFzeW5jIGNhbGxiYWNrIGhvb2sgaXMgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZGVzY3JpcHRvciBtaW1pY3MgdGhlIGZpbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihlcnIsIGZpbGUpCiAgICAgICAgICovCiAgICAgICAgY29udmVydERlc2NyaXB0b3JUb0ZpbGU6IGZ1bmN0aW9uKGRlc2NyaXB0b3IsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZpbGUgPSB7CiAgICAgICAgICAgICAgICAiaWQiOiBkZXNjcmlwdG9yLmlkLAogICAgICAgICAgICAgICAgIm5hbWUiOiBkZXNjcmlwdG9yLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGRlc2NyaXB0b3Iuc2l6ZSwKICAgICAgICAgICAgICAgICJ1cmwiOiBkZXNjcmlwdG9yLnVybCwKICAgICAgICAgICAgICAgICJ0aHVtYm5haWxVcmwiOmRlc2NyaXB0b3IudGh1bWJuYWlsVXJsLAogICAgICAgICAgICAgICAgImRlbGV0ZVVybCI6IGRlc2NyaXB0b3IuZGVsZXRlVXJsLAogICAgICAgICAgICAgICAgImRlbGV0ZVR5cGUiOiBkZXNjcmlwdG9yLmRlbGV0ZVR5cGUKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpbGUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgImVuaGFuY2luZyIgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgc2VydmVyIGFmdGVyIHVwbG9hZHMgaGF2ZSBiZWVuIHN1Ym1pdHRlZC4KICAgICAgICAgKiBUaGlzIHByb3ZpZGVzIGEgcGxhY2UgdG8gY29udmVydCB0aGUgZGF0YS5yb3dzIGJhY2sgaW50byB0aGUgZm9ybWF0IHdoaWNoIHRoZSB1cGxvYWQgY29udHJvbCBleHBlY3RzLgogICAgICAgICAqCiAgICAgICAgICogRXhwZWN0ZWQgZm9ybWF0OgogICAgICAgICAqCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQucm93cyA9IFt7Li4ufV0KICAgICAgICAgKiAgICBkYXRhLnJlc3VsdC5maWxlcyA9IFt7CiAgICAgICAgICogICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICJwYXRoIjogIiIsCiAgICAgICAgICogICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgInNpemUiOiA5MDI2MDQsCiAgICAgICAgICogICAgICAidXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvcGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJkZWxldGVUeXBlIjogIkRFTEVURSIqCiAgICAgICAgICogICAgfV0KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkQ29uZmlnCiAgICAgICAgICogQHBhcmFtIGRhdGEKICAgICAgICAgKi8KICAgICAgICBlbmhhbmNlRmlsZXM6IGZ1bmN0aW9uKGZpbGVVcGxvYWRDb25maWcsIGRhdGEpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByZWxvYWRzIGRhdGEgZGVzY3JpcHRvcnMgaW50byBmaWxlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVzID0gW107CgogICAgICAgICAgICAvLyBub3cgcHJlbG9hZCB3aXRoIGZpbGVzIGJhc2VkIG9uIHByb3BlcnR5IHZhbHVlCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKGkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZmlsZXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJQcmVsb2FkOiBmdW5jdGlvbihmaWxlVXBsb2FkLCBlbCwgZmlsZXMsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZWZyZXNoVUlTdGF0ZSgpOwoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kcyBiYWNrIHRoZSB2YWx1ZSBhcyBlaXRoZXIgYW4gb2JqZWN0IG9yIGFycmF5LCBkZXBlbmRpbmcgb24gdGhlIHNjaGVtYSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGF0YTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsdWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbdmFsdWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gdGhlIHZhbHVlIGFzIGFuIGFycmF5CiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWVBc0FycmF5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhIHx8IFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGFycmF5CiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWVBc0FycmF5OiBmdW5jdGlvbihhcnJheSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmlzQXJyYXlUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoYXJyYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcnJheVswXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWxvYWQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3JzID0gdGhpcy5nZXRWYWx1ZUFzQXJyYXkoKTsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZGVzY3JpcHRvcnMubGVuZ3RoKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbGwgZG9uZQoKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9ICQoc2VsZi5jb250cm9sKS5maW5kKCcuYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXQnKTsKICAgICAgICAgICAgICAgICAgICAkKGZvcm0pLmZpbGV1cGxvYWQoJ29wdGlvbicsICdkb25lJykuY2FsbChmb3JtLCAkLkV2ZW50KCdkb25lJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0RGVzY3JpcHRvclRvRmlsZShkZXNjcmlwdG9yc1tpXSwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmKGkrMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZigwKTsKICAgICAgICB9LAoKICAgICAgICBwbHVnaW46IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZGF0YSgpLmJsdWVpbXBGaWxldXBsb2FkOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hVSVN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZCA9IHNlbGYucGx1Z2luKCk7CiAgICAgICAgICAgIGlmIChmaWxlVXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWF4TnVtYmVyT2ZGaWxlcyA9IHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzOwoKICAgICAgICAgICAgICAgIGlmIChtYXhOdW1iZXJPZkZpbGVzID09PSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hCdXR0b25zKHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlVXBsb2FkLm9wdGlvbnMuZ2V0TnVtYmVyT2ZGaWxlcyAmJiBmaWxlVXBsb2FkLm9wdGlvbnMuZ2V0TnVtYmVyT2ZGaWxlcygpID49IG1heE51bWJlck9mRmlsZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hCdXR0b25zKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWZyZXNoQnV0dG9uczogZnVuY3Rpb24oZW5hYmxlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGZpbGVzIGJ1dHRvbgogICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5maWxldXBsb2FkLWFjdGl2ZS16b25lIHAuZHJvcHpvbmUtbWVzc2FnZSIpLmNzcygiZGlzcGxheSIsICJub25lIik7CgogICAgICAgICAgICBpZiAoZW5hYmxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZW5hYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsIG51bGwpOwoKICAgICAgICAgICAgICAgIC8vIHNob3cgZHJvcHpvbmUgbWVzc2FnZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5maWxldXBsb2FkLWFjdGl2ZS16b25lIHAuZHJvcHpvbmUtbWVzc2FnZSIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25GaWxlRGVsZXRlOiBmdW5jdGlvbihyb3dFbCwgYnV0dG9uRWwsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGVsZXRlVXJsID0gZmlsZS5kZWxldGVVcmw7CiAgICAgICAgICAgIHZhciBkZWxldGVNZXRob2QgPSBmaWxlLmRlbGV0ZVR5cGU7CgogICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICJtZXRob2QiOiBkZWxldGVNZXRob2QsCiAgICAgICAgICAgICAgICAidXJsIjogZGVsZXRlVXJsLAogICAgICAgICAgICAgICAgImhlYWRlcnMiOiB7fQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNzcmZUb2tlbiA9IHNlbGYuZGV0ZXJtaW5lQ3NyZlRva2VuKCk7CiAgICAgICAgICAgIGlmIChjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGMuaGVhZGVyc1tBbHBhY2EuQ1NSRl9IRUFERVJfTkFNRV0gPSBjc3JmVG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQuYWpheChjKTsKICAgICAgICB9LAoKICAgICAgICBvblVwbG9hZEZhaWw6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmVycm9ySGFuZGxlci5jYWxsKHNlbGYsIFtkYXRhLmVycm9yVGhyb3duXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YS5maWxlc1tpXS5lcnJvciA9IGRhdGEuZXJyb3JUaHJvd247CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGlzYWJsZSBzZWxlY3QgYnV0dG9uCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmZpbGVpbnB1dC1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmZpbGVpbnB1dC1idXR0b24iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gc2hvdyB0aGUgdXBsb2FkIHdlbGwKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtd2VsbCIpLmNzcygidmlzaWJpbGl0eSIsICJ2aXNpYmxlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVcGxvYWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiB1cGxvYWQgZmllbGQgd2l0aCBzdXBwb3J0IGZvciB0aHVtYm5haWwgcHJldmlldyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1heE51bWJlck9mRmlsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIE51bWJlciBvZiBGaWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdG8gYWxsb3cgdG8gYmUgdXBsb2FkZWQuICBJZiBncmVhdGVyIHRoYW4gemVybywgdGhlIG1heGltdW0gbnVtYmVyIHdpbGwgYmUgY29uc3RyYWluZWQuICBJZiAtMSwgdGhlbiBubyBsaW1pdCBpcyBpbXBvc2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEZpbGVTaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBGaWxlIFNpemUgKGluIGJ5dGVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWF4aW11bSBmaWxlIHNpemUgYWxsb3dlZCBwZXIgdXBsb2FkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSB3aWxsIGJlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIHNpemUgaW4gYnl0ZXMuICBJZiAtMSwgdGhlbiBubyBsaW1pdCBpcyBpbXBvc2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogLTEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWxlVHlwZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWxlIFR5cGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcmVndWxhciBleHByZXNzaW9uIGxpbWl0aW5nIHRoZSBmaWxlIHR5cGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIGJhc2VkIG9uIGZpbGVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBhbGxvdyBtdWx0aXBsZSBmaWxlIHVwbG9hZHMuICBJZiBtYXhOdW1iZXJPZkZpbGVzIGlzIG5vdCBzcGVjaWZpZWQsIG11bHRpcGxlIHdpbGwgdG9nZ2xlIGJldHdlZW4gMSBhbmQgdW5saW1pdGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd1VwbG9hZFByZXZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IFVwbG9hZCBQcmV2aWV3IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gc2hvdyB0aHVtYm5haWxzIGZvciB1cGxvYWRlZCBhc3NldHMgKHJlcXVpcmVzIHByZXZpZXcgc3VwcG9ydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3JIYW5kbGVyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXJyb3IgSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBmdW5jdGlvbiBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIG9uZSBvciBtb3JlIGZpbGVzIGZhaWxzIHRvIHVwbG9hZC4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgdGhlIHVuZGVybHlpbmcgeEhSIHJlcXVlc3QgYW5kIHBvcHVsYXRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugc3RhdGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwbG9hZCIsIEFscGFjYS5GaWVsZHMuVXBsb2FkRmllbGQpOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKCSJmaWxlVG9vQmlnIjogIkZpbGUgaXMgdG9vIGJpZzogIiwKCSJ0aHVtYm5haWwiOiAiVGh1bWJuYWlsIiwKCSJmaWxlbmFtZSI6ICJOYW1lIiwKCSJmaWxlU2l6ZSI6ICJTaXplIiwKCSJmaWxlVXBsb2FkQWN0aW9ucyI6ICJBY3Rpb25zIiwKICAgICAgICAiY2hvb3NlRmlsZSI6ICJDaG9vc2UgRmlsZS4uLiIsCiAgICAgICAgImNob29zZUZpbGVzIjogIkNob29zZSBGaWxlcy4uLiIsCiAgICAgICAgImRyb3Bab25lU2luZ2xlIjogIkNsaWNrIHRoZSBDaG9vc2UgYnV0dG9uIG9yIERyYWcgYW5kIERyb3AgYSBmaWxlIGhlcmUgdG8gdXBsb2FkLi4uIiwKICAgICAgICAiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkLi4uIgogICAgfSk7CgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ByaXZhdGUtZmFjZS9qcXVlcnkuYmluZC1maXJzdC9ibG9iL21hc3Rlci9kZXYvanF1ZXJ5LmJpbmQtZmlyc3QuanMKICAgIC8vIGpxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAoZnVuY3Rpb24oJCkgewogICAgICAgIHZhciBzcGxpdFZlcnNpb24gPSAkLmZuLmpxdWVyeS5zcGxpdCgiLiIpOwogICAgICAgIHZhciBtYWpvciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblswXSk7CiAgICAgICAgdmFyIG1pbm9yID0gcGFyc2VJbnQoc3BsaXRWZXJzaW9uWzFdKTsKCiAgICAgICAgdmFyIEpRX0xUXzE3ID0gKG1ham9yIDwgMSkgfHwgKG1ham9yID09PSAxICYmIG1pbm9yIDwgNyk7CgogICAgICAgIGZ1bmN0aW9uIGV2ZW50c0RhdGEoJGVsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpRX0xUXzE3ID8gJGVsLmRhdGEoJ2V2ZW50cycpIDogJC5fZGF0YSgkZWxbMF0pLmV2ZW50czsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVIYW5kbGVyVG9Ub3AoJGVsLCBldmVudE5hbWUsIGlzRGVsZWdhdGVkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBldmVudHNEYXRhKCRlbCk7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBkYXRhW2V2ZW50TmFtZV07CgogICAgICAgICAgICBpZiAoIUpRX0xUXzE3KSB7CiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGlzRGVsZWdhdGVkID8gZXZlbnRzLnNwbGljZShldmVudHMuZGVsZWdhdGVDb3VudCAtIDEsIDEpWzBdIDogZXZlbnRzLnBvcCgpOwogICAgICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpc0RlbGVnYXRlZCA/IDAgOiAoZXZlbnRzLmRlbGVnYXRlQ291bnQgfHwgMCksIDAsIGhhbmRsZXIpOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzRGVsZWdhdGVkKSB7CiAgICAgICAgICAgICAgICBkYXRhLmxpdmUudW5zaGlmdChkYXRhLmxpdmUucG9wKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXZlbnRzLnVuc2hpZnQoZXZlbnRzLnBvcCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW92ZUV2ZW50SGFuZGxlcnMoJGVsZW1zLCBldmVudHNTdHJpbmcsIGlzRGVsZWdhdGUpIHsKICAgICAgICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50c1N0cmluZy5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgICRlbGVtcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHVyZUV2ZW50TmFtZSA9ICQudHJpbShldmVudHNbaV0pLm1hdGNoKC9bXlwuXSsvaSlbMF07CiAgICAgICAgICAgICAgICAgICAgbW92ZUhhbmRsZXJUb1RvcCgkKHRoaXMpLCBwdXJlRXZlbnROYW1lLCBpc0RlbGVnYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAkLmZuLmJpbmRGaXJzdCA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gJC5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgdmFyIGV2ZW50c1N0cmluZyA9IGFyZ3Muc2hpZnQoKTsKCiAgICAgICAgICAgIGlmIChldmVudHNTdHJpbmcpIHsKICAgICAgICAgICAgICAgICQuZm4uYmluZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgbW92ZUV2ZW50SGFuZGxlcnModGhpcywgZXZlbnRzU3RyaW5nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICB9KSgkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwcGVyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBwZXJjYXNlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB1cHBlclZhbHVlID0gbnVsbDsKICAgICAgICAgICAgaWYgKHZhbCAmJiBBbHBhY2EuaXNTdHJpbmcodmFsKSkgewogICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSA9IHZhbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVcHBlcmNhc2UgVGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IGZpZWxkIGZvciB1cHBlcmNhc2UgdGV4dC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidXBwZXJjYXNlIiwgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJ1cHBlcmNhc2UiLCAidXBwZXJjYXNlIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VUkxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVVJMRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXJsIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ1cmwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ1cmwiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hbGxvd0ludHJhbmV0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hbGxvd0ludHJhbmV0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzWyJpbnRyYW5ldC11cmwiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy51cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zY2hlbWEuZm9ybWF0ID0gInVyaSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewoKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFVSTEZvcm1hdCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dJbnRyYW5ldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFsbG93IGludHJhbmV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsbG93cyBVUkxzIHdpdGggdW5xdWFsaWZpZWQgaG9zdG5hbWVzIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dJbnRyYW5ldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlVSTCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIHRleHQgY29udHJvbCB3aXRoIHZhbGlkYXRpb24gZm9yIGFuIGludGVybmV0IHdlYiBhZGRyZXNzLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRVUkxGb3JtYXQiOiAiVGhlIFVSTCBwcm92aWRlZCBpcyBub3QgYSB2YWxpZCB3ZWIgYWRkcmVzcy4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVybCIsIEFscGFjYS5GaWVsZHMuVVJMRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXJsIiwgInVybCIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiemlwY29kZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAodGhpcy5vcHRpb25zLmZvcm1hdCA/IHRoaXMub3B0aW9ucy5mb3JtYXQgOiAibmluZSIpOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzWyJ6aXBjb2RlLW5pbmUiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1maXZlIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlRoZSBjb25maWd1cmVkIHppcGNvZGUgZm9ybWF0OiAiICsgdGhpcy5vcHRpb25zLmZvcm1hdCArICIgaXMgbm90IGEgbGVnYWwgdmFsdWUgW2ZpdmUsIG5pbmVdIik7CgogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBuaW5lIGZvcm1hdAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvcm1hdCA9ICJuaW5lIjsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCBtYXNrIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OS05OTk5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1sibWFza1N0cmluZyJdID0gIjk5OTk5IjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJmaXZlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgemlwY29kZSBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImZpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJmaXZlIiwgIm5pbmUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJaaXBjb2RlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGEgZml2ZSBvciBuaW5lLWRpZ2l0YWwgVVMgemlwY29kZSBjb250cm9sIHdpdGggdmFsaWRhdGlvbi4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiOiAiSW52YWxpZCBGaXZlLURpZ2l0IFppcGNvZGUgKCMjIyMjKSIsCiAgICAgICAgImludmFsaWRaaXBjb2RlRm9ybWF0TmluZSI6ICJJbnZhbGlkIE5pbmUtRGlnaXQgWmlwY29kZSAoIyMjIyMtIyMjIykiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInppcGNvZGUiLCBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJ6aXBjb2RlIiwgInppcGNvZGUiKTsKCn0pKGpRdWVyeSk7CgovKioKICogRGVmaW5lcyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBmb3Igdmlld3MuICBBbGwgdmlld3MgaW4gQWxwYWNhIHVsdGltYXRlbHkgZXh0ZW5kIHRoaXMgZm9ybS4KICogVGhpcyBwcm92aWRlcyB0aGUgaWRlYWwgcGxhY2UgZm9yIGFueSBnbG9iYWwgb3ZlcnJpZGVzIG9mIHZpZXcgdGVtcGxhdGVzLCBtZXNzYWdlIGJ1bmRsZXMgb3Igb3RoZXIgc2V0dGluZ3MuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgInRpdGxlIjogIkFic3RyYWN0IGJhc2UgdmlldyIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiY291bnRyaWVzIjogewogICAgICAgICAgICAgICAgImFmZyI6IkFmZ2hhbmlzdGFuIiwKICAgICAgICAgICAgICAgICJhbGEiOiJBbGFuZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJhbGIiOiJBbGJhbmlhIiwKICAgICAgICAgICAgICAgICJkemEiOiJBbGdlcmlhIiwKICAgICAgICAgICAgICAgICJhc20iOiJBbWVyaWNhbiBTYW1vYSIsCiAgICAgICAgICAgICAgICAiYW5kIjoiQW5kb3JyYSIsCiAgICAgICAgICAgICAgICAiYWdvIjoiQW5nb2xhIiwKICAgICAgICAgICAgICAgICJhaWEiOiJBbmd1aWxsYSIsCiAgICAgICAgICAgICAgICAiYXRhIjoiQW50YXJjdGljYSIsCiAgICAgICAgICAgICAgICAiYXRnIjoiQW50aWd1YSBhbmQgQmFyYnVkYSIsCiAgICAgICAgICAgICAgICAiYXJnIjoiQXJnZW50aW5hIiwKICAgICAgICAgICAgICAgICJhcm0iOiJBcm1lbmlhIiwKICAgICAgICAgICAgICAgICJhYnciOiJBcnViYSIsCiAgICAgICAgICAgICAgICAiYXVzIjoiQXVzdHJhbGlhIiwKICAgICAgICAgICAgICAgICJhdXQiOiJBdXN0cmlhIiwKICAgICAgICAgICAgICAgICJhemUiOiJBemVyYmFpamFuIiwKICAgICAgICAgICAgICAgICJiaHMiOiJCYWhhbWFzIiwKICAgICAgICAgICAgICAgICJiaHIiOiJCYWhyYWluIiwKICAgICAgICAgICAgICAgICJiZ2QiOiJCYW5nbGFkZXNoIiwKICAgICAgICAgICAgICAgICJicmIiOiJCYXJiYWRvcyIsCiAgICAgICAgICAgICAgICAiYmxyIjoiQmVsYXJ1cyIsCiAgICAgICAgICAgICAgICAiYmVsIjoiQmVsZ2l1bSIsCiAgICAgICAgICAgICAgICAiYmx6IjoiQmVsaXplIiwKICAgICAgICAgICAgICAgICJiZW4iOiJCZW5pbiIsCiAgICAgICAgICAgICAgICAiYm11IjoiQmVybXVkYSIsCiAgICAgICAgICAgICAgICAiYnRuIjoiQmh1dGFuIiwKICAgICAgICAgICAgICAgICJib2wiOiJCb2xpdmlhIiwKICAgICAgICAgICAgICAgICJiaWgiOiJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwKICAgICAgICAgICAgICAgICJid2EiOiJCb3Rzd2FuYSIsCiAgICAgICAgICAgICAgICAiYnZ0IjoiQm91dmV0IElzbGFuZCIsCiAgICAgICAgICAgICAgICAiYnJhIjoiQnJhemlsIiwKICAgICAgICAgICAgICAgICJpb3QiOiJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLAogICAgICAgICAgICAgICAgImJybiI6IkJydW5laSBEYXJ1c3NhbGFtIiwKICAgICAgICAgICAgICAgICJiZ3IiOiJCdWxnYXJpYSIsCiAgICAgICAgICAgICAgICAiYmZhIjoiQnVya2luYSBGYXNvIiwKICAgICAgICAgICAgICAgICJiZGkiOiJCdXJ1bmRpIiwKICAgICAgICAgICAgICAgICJraG0iOiJDYW1ib2RpYSIsCiAgICAgICAgICAgICAgICAiY21yIjoiQ2FtZXJvb24iLAogICAgICAgICAgICAgICAgImNhbiI6IkNhbmFkYSIsCiAgICAgICAgICAgICAgICAiY3B2IjoiQ2FwZSBWZXJkZSIsCiAgICAgICAgICAgICAgICAiY3ltIjoiQ2F5bWFuIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImNhZiI6IkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAidGNkIjoiQ2hhZCIsCiAgICAgICAgICAgICAgICAiY2hsIjoiQ2hpbGUiLAogICAgICAgICAgICAgICAgImNobiI6IkNoaW5hIiwKICAgICAgICAgICAgICAgICJjeHIiOiJDaHJpc3RtYXMgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJjY2siOiJDb2NvcyAoS2VlbGluZyksIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImNvbCI6IkNvbG9tYmlhIiwKICAgICAgICAgICAgICAgICJjb20iOiJDb21vcm9zIiwKICAgICAgICAgICAgICAgICJjb2ciOiJDb25nbyIsCiAgICAgICAgICAgICAgICAiY29kIjoiQ29uZ28sIHRoZSBEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSIsCiAgICAgICAgICAgICAgICAiY29rIjoiQ29vayBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjcmkiOiJDb3N0YSBSaWNhIiwKICAgICAgICAgICAgICAgICJocnYiOiJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICJjdWIiOiJDdWJhIiwKICAgICAgICAgICAgICAgICJjeXAiOiJDeXBydXMiLAogICAgICAgICAgICAgICAgImN6ZSI6IkN6ZWNoIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICJjaXYiOiJDb3RlIGQnSXZvaXJlIiwKICAgICAgICAgICAgICAgICJkbmsiOiJEZW5tYXJrIiwKICAgICAgICAgICAgICAgICJkamkiOiJEamlib3V0aSIsCiAgICAgICAgICAgICAgICAiZG1hIjoiRG9taW5pY2EiLAogICAgICAgICAgICAgICAgImRvbSI6IkRvbWluaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiZWN1IjoiRWN1YWRvciIsCiAgICAgICAgICAgICAgICAiZWd5IjoiRWd5cHQiLAogICAgICAgICAgICAgICAgInNsdiI6IkVsIFNhbHZhZG9yIiwKICAgICAgICAgICAgICAgICJnbnEiOiJFcXVhdG9yaWFsIEd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZXJpIjoiRXJpdHJlYSIsCiAgICAgICAgICAgICAgICAiZXN0IjoiRXN0b25pYSIsCiAgICAgICAgICAgICAgICAiZXRoIjoiRXRoaW9waWEiLAogICAgICAgICAgICAgICAgImZsayI6IkZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKSwiLAogICAgICAgICAgICAgICAgImZybyI6IkZhcm9lIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImZqaSI6IkZpamkiLAogICAgICAgICAgICAgICAgImZpbiI6IkZpbmxhbmQiLAogICAgICAgICAgICAgICAgImZyYSI6IkZyYW5jZSIsCiAgICAgICAgICAgICAgICAiZ3VmIjoiRnJlbmNoIEd1aWFuYSIsCiAgICAgICAgICAgICAgICAicHlmIjoiRnJlbmNoIFBvbHluZXNpYSIsCiAgICAgICAgICAgICAgICAiYXRmIjoiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICJnYWIiOiJHYWJvbiIsCiAgICAgICAgICAgICAgICAiZ21iIjoiR2FtYmlhIiwKICAgICAgICAgICAgICAgICJnZW8iOiJHZW9yZ2lhIiwKICAgICAgICAgICAgICAgICJkZXUiOiJHZXJtYW55IiwKICAgICAgICAgICAgICAgICJnaGEiOiJHaGFuYSIsCiAgICAgICAgICAgICAgICAiZ2liIjoiR2licmFsdGFyIiwKICAgICAgICAgICAgICAgICJncmMiOiJHcmVlY2UiLAogICAgICAgICAgICAgICAgImdybCI6IkdyZWVubGFuZCIsCiAgICAgICAgICAgICAgICAiZ3JkIjoiR3JlbmFkYSIsCiAgICAgICAgICAgICAgICAiZ2xwIjoiR3VhZGVsb3VwZSIsCiAgICAgICAgICAgICAgICAiZ3VtIjoiR3VhbSIsCiAgICAgICAgICAgICAgICAiZ3RtIjoiR3VhdGVtYWxhIiwKICAgICAgICAgICAgICAgICJnZ3kiOiJHdWVybnNleSIsCiAgICAgICAgICAgICAgICAiZ2luIjoiR3VpbmVhIiwKICAgICAgICAgICAgICAgICJnbmIiOiJHdWluZWEtQmlzc2F1IiwKICAgICAgICAgICAgICAgICJndXkiOiJHdXlhbmEiLAogICAgICAgICAgICAgICAgImh0aSI6IkhhaXRpIiwKICAgICAgICAgICAgICAgICJobWQiOiJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInZhdCI6IkhvbHkgU2VlIChWYXRpY2FuIENpdHkgU3RhdGUpLCIsCiAgICAgICAgICAgICAgICAiaG5kIjoiSG9uZHVyYXMiLAogICAgICAgICAgICAgICAgImhrZyI6IkhvbmcgS29uZyIsCiAgICAgICAgICAgICAgICAiaHVuIjoiSHVuZ2FyeSIsCiAgICAgICAgICAgICAgICAiaXNsIjoiSWNlbGFuZCIsCiAgICAgICAgICAgICAgICAiaW5kIjoiSW5kaWEiLAogICAgICAgICAgICAgICAgImlkbiI6IkluZG9uZXNpYSIsCiAgICAgICAgICAgICAgICAiaXJuIjoiSXJhbiwgSXNsYW1pYyBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAiaXJxIjoiSXJhcSIsCiAgICAgICAgICAgICAgICAiaXJsIjoiSXJlbGFuZCIsCiAgICAgICAgICAgICAgICAiaW1uIjoiSXNsZSBvZiBNYW4iLAogICAgICAgICAgICAgICAgImlzciI6IklzcmFlbCIsCiAgICAgICAgICAgICAgICAiaXRhIjoiSXRhbHkiLAogICAgICAgICAgICAgICAgImphbSI6IkphbWFpY2EiLAogICAgICAgICAgICAgICAgImpwbiI6IkphcGFuIiwKICAgICAgICAgICAgICAgICJqZXkiOiJKZXJzZXkiLAogICAgICAgICAgICAgICAgImpvciI6IkpvcmRhbiIsCiAgICAgICAgICAgICAgICAia2F6IjoiS2F6YWtoc3RhbiIsCiAgICAgICAgICAgICAgICAia2VuIjoiS2VueWEiLAogICAgICAgICAgICAgICAgImtpciI6IktpcmliYXRpIiwKICAgICAgICAgICAgICAgICJwcmsiOiJLb3JlYSwgRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia29yIjoiS29yZWEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJrd3QiOiJLdXdhaXQiLAogICAgICAgICAgICAgICAgImtneiI6Ikt5cmd5enN0YW4iLAogICAgICAgICAgICAgICAgImxhbyI6IkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICJsdmEiOiJMYXR2aWEiLAogICAgICAgICAgICAgICAgImxibiI6IkxlYmFub24iLAogICAgICAgICAgICAgICAgImxzbyI6Ikxlc290aG8iLAogICAgICAgICAgICAgICAgImxiciI6IkxpYmVyaWEiLAogICAgICAgICAgICAgICAgImxieSI6IkxpYnlhbiBBcmFiIEphbWFoaXJpeWEiLAogICAgICAgICAgICAgICAgImxpZSI6IkxpZWNodGVuc3RlaW4iLAogICAgICAgICAgICAgICAgImx0dSI6IkxpdGh1YW5pYSIsCiAgICAgICAgICAgICAgICAibHV4IjoiTHV4ZW1ib3VyZyIsCiAgICAgICAgICAgICAgICAibWFjIjoiTWFjYW8iLAogICAgICAgICAgICAgICAgIm1rZCI6Ik1hY2Vkb25pYSwgdGhlIGZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAibWRnIjoiTWFkYWdhc2NhciIsCiAgICAgICAgICAgICAgICAibXdpIjoiTWFsYXdpIiwKICAgICAgICAgICAgICAgICJteXMiOiJNYWxheXNpYSIsCiAgICAgICAgICAgICAgICAibWR2IjoiTWFsZGl2ZXMiLAogICAgICAgICAgICAgICAgIm1saSI6Ik1hbGkiLAogICAgICAgICAgICAgICAgIm1sdCI6Ik1hbHRhIiwKICAgICAgICAgICAgICAgICJtaGwiOiJNYXJzaGFsbCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJtdHEiOiJNYXJ0aW5pcXVlIiwKICAgICAgICAgICAgICAgICJtcnQiOiJNYXVyaXRhbmlhIiwKICAgICAgICAgICAgICAgICJtdXMiOiJNYXVyaXRpdXMiLAogICAgICAgICAgICAgICAgIm15dCI6Ik1heW90dGUiLAogICAgICAgICAgICAgICAgIm1leCI6Ik1leGljbyIsCiAgICAgICAgICAgICAgICAiZnNtIjoiTWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZiIsCiAgICAgICAgICAgICAgICAibWRhIjoiTW9sZG92YSwgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1jbyI6Ik1vbmFjbyIsCiAgICAgICAgICAgICAgICAibW5nIjoiTW9uZ29saWEiLAogICAgICAgICAgICAgICAgIm1uZSI6Ik1vbnRlbmVncm8iLAogICAgICAgICAgICAgICAgIm1zciI6Ik1vbnRzZXJyYXQiLAogICAgICAgICAgICAgICAgIm1hciI6Ik1vcm9jY28iLAogICAgICAgICAgICAgICAgIm1veiI6Ik1vemFtYmlxdWUiLAogICAgICAgICAgICAgICAgIm1tciI6Ik15YW5tYXIiLAogICAgICAgICAgICAgICAgIm5hbSI6Ik5hbWliaWEiLAogICAgICAgICAgICAgICAgIm5ydSI6Ik5hdXJ1IiwKICAgICAgICAgICAgICAgICJucGwiOiJOZXBhbCIsCiAgICAgICAgICAgICAgICAibmxkIjoiTmV0aGVybGFuZHMiLAogICAgICAgICAgICAgICAgImFudCI6Ik5ldGhlcmxhbmRzIEFudGlsbGVzIiwKICAgICAgICAgICAgICAgICJuY2wiOiJOZXcgQ2FsZWRvbmlhIiwKICAgICAgICAgICAgICAgICJuemwiOiJOZXcgWmVhbGFuZCIsCiAgICAgICAgICAgICAgICAibmljIjoiTmljYXJhZ3VhIiwKICAgICAgICAgICAgICAgICJuZXIiOiJOaWdlciIsCiAgICAgICAgICAgICAgICAibmdhIjoiTmlnZXJpYSIsCiAgICAgICAgICAgICAgICAibml1IjoiTml1ZSIsCiAgICAgICAgICAgICAgICAibmZrIjoiTm9yZm9sayBJc2xhbmQiLAogICAgICAgICAgICAgICAgIm1ucCI6Ik5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibm9yIjoiTm9yd2F5IiwKICAgICAgICAgICAgICAgICJvbW4iOiJPbWFuIiwKICAgICAgICAgICAgICAgICJwYWsiOiJQYWtpc3RhbiIsCiAgICAgICAgICAgICAgICAicGx3IjoiUGFsYXUiLAogICAgICAgICAgICAgICAgInBzZSI6IlBhbGVzdGluaWFuIFRlcnJpdG9yeSwgT2NjdXBpZWQiLAogICAgICAgICAgICAgICAgInBhbiI6IlBhbmFtYSIsCiAgICAgICAgICAgICAgICAicG5nIjoiUGFwdWEgTmV3IEd1aW5lYSIsCiAgICAgICAgICAgICAgICAicHJ5IjoiUGFyYWd1YXkiLAogICAgICAgICAgICAgICAgInBlciI6IlBlcnUiLAogICAgICAgICAgICAgICAgInBobCI6IlBoaWxpcHBpbmVzIiwKICAgICAgICAgICAgICAgICJwY24iOiJQaXRjYWlybiIsCiAgICAgICAgICAgICAgICAicG9sIjoiUG9sYW5kIiwKICAgICAgICAgICAgICAgICJwcnQiOiJQb3J0dWdhbCIsCiAgICAgICAgICAgICAgICAicHJpIjoiUHVlcnRvIFJpY28iLAogICAgICAgICAgICAgICAgInFhdCI6IlFhdGFyIiwKICAgICAgICAgICAgICAgICJyb3UiOiJSb21hbmlhIiwKICAgICAgICAgICAgICAgICJydXMiOiJSdXNzaWFuIEZlZGVyYXRpb24iLAogICAgICAgICAgICAgICAgInJ3YSI6IlJ3YW5kYSIsCiAgICAgICAgICAgICAgICAicmV1IjoiUmV1bmlvbiIsCiAgICAgICAgICAgICAgICAiYmxtIjoiU2FpbnQgQmFydGhlbGVteSIsCiAgICAgICAgICAgICAgICAic2huIjoiU2FpbnQgSGVsZW5hIiwKICAgICAgICAgICAgICAgICJrbmEiOiJTYWludCBLaXR0cyBhbmQgTmV2aXMiLAogICAgICAgICAgICAgICAgImxjYSI6IlNhaW50IEx1Y2lhIiwKICAgICAgICAgICAgICAgICJtYWYiOiJTYWludCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KSIsCiAgICAgICAgICAgICAgICAic3BtIjoiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCiAgICAgICAgICAgICAgICAidmN0IjoiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLAogICAgICAgICAgICAgICAgIndzbSI6IlNhbW9hIiwKICAgICAgICAgICAgICAgICJzbXIiOiJTYW4gTWFyaW5vIiwKICAgICAgICAgICAgICAgICJzdHAiOiJTYW8gVG9tZSBhbmQgUHJpbmNpcGUiLAogICAgICAgICAgICAgICAgInNhdSI6IlNhdWRpIEFyYWJpYSIsCiAgICAgICAgICAgICAgICAic2VuIjoiU2VuZWdhbCIsCiAgICAgICAgICAgICAgICAic3JiIjoiU2VyYmlhIiwKICAgICAgICAgICAgICAgICJzeWMiOiJTZXljaGVsbGVzIiwKICAgICAgICAgICAgICAgICJzbGUiOiJTaWVycmEgTGVvbmUiLAogICAgICAgICAgICAgICAgInNncCI6IlNpbmdhcG9yZSIsCiAgICAgICAgICAgICAgICAic3ZrIjoiU2xvdmFraWEiLAogICAgICAgICAgICAgICAgInN2biI6IlNsb3ZlbmlhIiwKICAgICAgICAgICAgICAgICJzbGIiOiJTb2xvbW9uIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInNvbSI6IlNvbWFsaWEiLAogICAgICAgICAgICAgICAgInphZiI6IlNvdXRoIEFmcmljYSIsCiAgICAgICAgICAgICAgICAic2dzIjoiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLAogICAgICAgICAgICAgICAgImVzcCI6IlNwYWluIiwKICAgICAgICAgICAgICAgICJsa2EiOiJTcmkgTGFua2EiLAogICAgICAgICAgICAgICAgInNkbiI6IlN1ZGFuIiwKICAgICAgICAgICAgICAgICJzdXIiOiJTdXJpbmFtZSIsCiAgICAgICAgICAgICAgICAic2ptIjoiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsCiAgICAgICAgICAgICAgICAic3d6IjoiU3dhemlsYW5kIiwKICAgICAgICAgICAgICAgICJzd2UiOiJTd2VkZW4iLAogICAgICAgICAgICAgICAgImNoZSI6IlN3aXR6ZXJsYW5kIiwKICAgICAgICAgICAgICAgICJzeXIiOiJTeXJpYW4gQXJhYiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAidHduIjoiVGFpd2FuLCBQcm92aW5jZSBvZiBDaGluYSIsCiAgICAgICAgICAgICAgICAidGprIjoiVGFqaWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidHphIjoiVGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAidGhhIjoiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgInRscyI6IlRpbW9yLUxlc3RlIiwKICAgICAgICAgICAgICAgICJ0Z28iOiJUb2dvIiwKICAgICAgICAgICAgICAgICJ0a2wiOiJUb2tlbGF1IiwKICAgICAgICAgICAgICAgICJ0b24iOiJUb25nYSIsCiAgICAgICAgICAgICAgICAidHRvIjoiVHJpbmlkYWQgYW5kIFRvYmFnbyIsCiAgICAgICAgICAgICAgICAidHVuIjoiVHVuaXNpYSIsCiAgICAgICAgICAgICAgICAidHVyIjoiVHVya2V5IiwKICAgICAgICAgICAgICAgICJ0a20iOiJUdXJrbWVuaXN0YW4iLAogICAgICAgICAgICAgICAgInRjYSI6IlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidHV2IjoiVHV2YWx1IiwKICAgICAgICAgICAgICAgICJ1Z2EiOiJVZ2FuZGEiLAogICAgICAgICAgICAgICAgInVrciI6IlVrcmFpbmUiLAogICAgICAgICAgICAgICAgImFyZSI6IlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwKICAgICAgICAgICAgICAgICJnYnIiOiJVbml0ZWQgS2luZ2RvbSIsCiAgICAgICAgICAgICAgICAidXNhIjoiVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAidW1pIjoiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ1cnkiOiJVcnVndWF5IiwKICAgICAgICAgICAgICAgICJ1emIiOiJVemJla2lzdGFuIiwKICAgICAgICAgICAgICAgICJ2dXQiOiJWYW51YXR1IiwKICAgICAgICAgICAgICAgICJ2ZW4iOiJWZW5lenVlbGEiLAogICAgICAgICAgICAgICAgInZubSI6IlZpZXQgTmFtIiwKICAgICAgICAgICAgICAgICJ2Z2IiOiJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCIsCiAgICAgICAgICAgICAgICAidmlyIjoiVmlyZ2luIElzbGFuZHMsIFUuUy4iLAogICAgICAgICAgICAgICAgIndsZiI6IldhbGxpcyBhbmQgRnV0dW5hIiwKICAgICAgICAgICAgICAgICJlc2giOiJXZXN0ZXJuIFNhaGFyYSIsCiAgICAgICAgICAgICAgICAieWVtIjoiWWVtZW4iLAogICAgICAgICAgICAgICAgInptYiI6IlphbWJpYSIsCiAgICAgICAgICAgICAgICAiendlIjoiWmltYmFid2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJlbXB0eSI6ICIiLAogICAgICAgICAgICAicmVxdWlyZWQiOiAiVGhpcyBmaWVsZCBpcyByZXF1aXJlZCIsCiAgICAgICAgICAgICJ2YWxpZCI6ICIiLAogICAgICAgICAgICAiaW52YWxpZCI6ICJUaGlzIGZpZWxkIGlzIGludmFsaWQiLAogICAgICAgICAgICAibW9udGhzIjogWyJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl0sCiAgICAgICAgICAgICJ0aW1lVW5pdHMiOiB7IFNFQ09ORDogInNlY29uZHMiLCBNSU5VVEU6ICJtaW51dGVzIiwgSE9VUjogImhvdXJzIiwgREFZOiAiZGF5cyIsIE1PTlRIOiAibW9udGhzIiwgWUVBUjogInllYXJzIiB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKCS8vIGN6ZWNoIC0gY3plY2ggcmVwdWJsaWMKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJjc19DWiI6IHsKCQkJCXJlcXVpcmVkOiAiVG90byBwb2xlIGplIHZ5xb5hZG92w6FubyIsCgkJCQlpbnZhbGlkOiAiVG90byBwb2xlIGplIG5lcGxhdG7DqSIsCgkJCQltb250aHM6IFsiTGVkZW4iLCAiw5pub3IiLCAiQsWZZXplbiIsICJEdWJlbiIsICJLdsSbdGVuIiwgIsSMZXJ2ZW4iLCAixIxlcnZlbmVjIiwgIlNycGVuIiwgIlrDocWZw60iLCAixZjDrWplbiIsICJMaXN0b3BhZCIsICJQcm9zaW5lYyJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VrdW5keSIsCgkJCQkJTUlOVVRFOiAibWludXR5IiwKCQkJCQlIT1VSOiAiaG9kaW55IiwKCQkJCQlEQVk6ICJkbnkiLAoJCQkJCU1PTlRIOiAibcSbc8OtY2UiLAoJCQkJCVlFQVI6ICJyb2t5IgoJCQkJfSwKCQkJCS8vIENvbnRyb2xGaWVsZC5qcwoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IGplZG51IGhvZG5vdHUgeiB7MH0uIEFrdHXDoWxuw60gaG9kbm90YSBqZTogezF9IiwKCgkJCQkvLyBGaWVsZC5qcwoJCQkJIm5vdE9wdGlvbmFsIjogIlRvdG8gcG9sZSBuZW7DrSB2b2xpdGVsbsOpIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBqc291IHpha8OhemFuw6kgaG9kbm90eS4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9BcnJheUZpZWxkLmpzCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiTWluaW3DoWxuw60gcG/EjWV0IHBvbG/FvmVrIGplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk1heGltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkhvZG5vdHkgbmVqc291IHVuaWvDoXRuw60iLAoJCQkJIm5vdEFuQXJyYXkiOiAiVGF0byBob2Rub3RhIG5lbsOtIHBvbGUiLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJQxZlpZGF0IG5vdm91IHBvbG/Fvmt1IiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJQxZlpZGF0IiwKCQkJCSJyZW1vdmVCdXR0b25MYWJlbCI6ICJPZGVicmF0IiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIk5haG9ydSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkRvbMWvIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvTGlzdEZpZWxkLmpzCgkJCQkibm9uZUxhYmVsIjogIsW9w6FkbsO9IiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvTnVtYmVyRmllbGQuanMKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltw6FsbsOtIGhvZG5vdGEgdG9ob3RvIHBvbGUgamUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1heGltw6FsbsOtIGhvZG5vdGEgdG9ob3RvIHBvbGUgamUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkhvZG5vdGEgdG9ob3RvIHBvbGUgbXVzw60gYsO9dCB2xJt0xaHDrSBuZcW+IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgbWVuxaHDrSBuZcW+IHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiSG9kbm90YSBtdXPDrSBiw710IGTEm2xpdGVsbsOhIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJIb2Rub3RhIG5lbsOtIMSNw61zbG8uIiwKCQkJCSJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAixIzDrXNsbyBuZW7DrSBuw6Fzb2JrZW0gezB9IiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvT2JqZWN0RmllbGQuanMKCQkJCSJ0b29NYW55UHJvcGVydGllcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgdmxhc3Rub3N0w60gKHswfSkgYnlsIHDFmWVrcm/EjWVuLiIsCgkJCQkidG9vRmV3UHJvcGVydGllcyI6ICJOZW7DrSBkb3N0YXRlayB2bGFzdG5vc3TDrSAoamUgcG/FvmFkb3bDoW5vIHswfSkiLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0QXJlYUZpZWxkLmpzCgkJCQkid29yZExpbWl0RXhjZWVkZWQiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHNsb3YgKHswfSkgYnlsIHDFmWVrcm/EjWVuLiIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL1RleHRGaWVsZC5qcwoJCQkJImludmFsaWRQYXR0ZXJuIjogIlRvdG8gcG9sZSBtw6EgbcOtdCB2em9yIHswfSIsCgkJCQkic3RyaW5nVG9vU2hvcnQiOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBuZWptZW7EmyB7MH0gem5ha8WvIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbWF4aW3DoWxuxJsgezB9IHpuYWvFryIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0RhdGVGaWVsZC5qcwoJCQkJImludmFsaWREYXRlIjogIk5lc3Byw6F2bsOpIGRhdHVtIHBybyBmb3Jtw6F0IHswfSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuZWQvRWRpdG9yRmllbGQuanMKCQkJCSJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIkVkaXRvciBtw6EgdiBzb2LEmyBjaHlieSwga3RlcsOpIG11c8OtIGLDvXQgb3ByYXZlbnkiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9FbWFpbEZpZWxkLmpzCgkJCQkiaW52YWxpZEVtYWlsIjogIkNoeWJuw6EgZS1tYWlsb3bDoSBhZHJlc2EsIHDFmS46IGluZm9AY2xvdWRjbXMuY29tIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQuSW50ZWdlckZpZWxkLmpzCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlRhdG8gaG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0lQdjRGaWVsZC5qcwoJCQkJImludmFsaWRJUHY0IjogIkNoeWJuw6EgSVB2NCBhZHJlc2EsIGV4OiAxOTIuMTY4LjAuMSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0pTT05GaWVsZC5qcwoJCQkJInN0cmluZ05vdEFKU09OIjogIlRhdG8gaG9kbm90YSBuZW7DrSBwbGF0bsO9IEpTT04gdGV4dC4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9NYXBGaWVsZC5qcwoJCQkJImtleU1pc3NpbmciOiAiTWFwYSBvYnNhaHVqZSBwcsOhemRuw70ga2zDrcSNLiIsCgkJCQkia2V5Tm90VW5pcXVlIjogIktsw63EjWUgbmVqc291IGplZGluZcSNbsOpLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1Bhc3N3b3JkRmllbGQuanMKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAixaBwYXRuw6kgaGVzbG8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBob25lIjogIsWgcGF0bsOpIHRlbGVmb25uw60gxI3DrXNsbywgcMWZLjogKDEyMykgNDU2LTk5OTkiLCAvLyBUT0RPOiBpbnZhbGlkIHBhdHRlcm4gZm9yIGN6ZWNoIGxvY2FsZQoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9VcGxvYWRGaWVsZC5qcwoJCQkJImNob29zZUZpbGUiOiAiVnliZXJ0ZSBzb3Vib3IuLi4iLAoJCQkJImNob29zZUZpbGVzIjogIlZ5YmVydGUgc291Ym9yeS4uLiIsCgkJCQkiZHJvcFpvbmVTaW5nbGUiOiAiVnliZXJ0ZSBzb3Vib3IgbmVibyBqZWogcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgkJCQkiZHJvcFpvbmVNdWx0aXBsZSI6ICJWeWJlcnRlIHNvdWJvcnkgbmVibyBqZSBwxZlldMOhaG7Em3RlIHNlbSBwcm8gbmFocsOhbsOtLi4uIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVVJMRmllbGQuanMKCQkJCSJpbnZhbGlkVVJMRm9ybWF0IjogIlV2ZWRlbsOhIFVSTCBuZW7DrSBwbGF0bmEgd2Vib3bDoSBhZHJlc2EuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvQ2lwY29kZUZpZWxkLmpzCgkJCQkiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkNoeWJuw6kgcG/FoXRvdm7DrSBzbcSbcm92YWPDrSDEjcOtc2xvICgjIyMjIykiLAoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0TmluZSI6ICJDaHlibsOpIGRldsOtdGktbcOtc3Ruw6kgcG/FoXRvdm7DrSBzbcSbcm92YWPDrSDEjcOtc2xvICgjIyMjIy0jIyMjKSIKCQkJfQogICAgICAgIH0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gYXVzdHJpYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0FUIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSBpbnZhbGlkIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKw6RubmVyIiwgIkZlYnJ1YXIiLCAiTcOkcnoiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGV6ZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVuIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dGVuIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiU3R1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiVGFnZSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNb25hdGUiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJKYWhyZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGllc2VzIEZlbGQgaXN0IG5pY2h0IG9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZXJsYXVidDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGllc2UgRmVsZCBzb2xsdGUgZWluZW4gZGVyIGZvbGdlbmRlbiBXZXJ0ZSBlbnRoYWx0ZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRpZSBNaW5kZXN0YW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiRGllc2UgV2VydGUgc2luZCBuaWNodCBlaW5kZXV0aWciLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiS2VpbmUgTGlzdGUgdm9uIFdlcnRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmFsc2NoZXMgRGF0dW1zZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVbmfDvGx0aWdlIGUtTWFpbCBBZHJlc3NlLCB6LkIuOiBpbmZvQGNsb3VkY21zLmNvbSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIkVpbmdhYmUgaXN0IGtlaW5lIEdhbnogWmFobC4iLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlVuZ8O8bHRpZ2UgSVB2NCBBZHJlc3NlLCB6LkIuOiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBaZWljaGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGdyw7bDn2VyIHNlaW4gYWxzIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEaWUgQW56YWhsIGRlciBaZWljaGVuIG11c3Mga2xlaW5lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkRlciBXZXJ0IG11c3MgZHVyY2ggezB9IGRpdmlkaWVyYmFyIHNlaW4iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiRGllIEVpbmdhYmUgaXN0IGtlaW5lIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJVbmfDvGx0aWdlcyBQYXNzd29ydC4iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIsIHouQi46ICgxMjMpIDQ1Ni05OTk5IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJEaWVzZSBGZWxkIHN0aW1tdCBuaWNodCBtaXQgZm9sZ2VuZGVyIFZvcmdhYmUgw7xiZXJlaW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGllc2VzIEZlbGQgc29sbHRlIGjDtmNoc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBnZXJtYW4gLSBnZXJtYW55CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZGVfREUiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkVpbmdhYmUgZXJmb3JkZXJsaWNoIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJFaW5nYWJlIHVuZ8O8bHRpZyIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyIiwgIkZlYnJ1YXIiLCAiTcOkcnoiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGV6ZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVuIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dGVuIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiU3R1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiVGFnZSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNb25hdGUiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJKYWhyZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGllc2VzIEZlbGQgaXN0IG5pY2h0IG9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZXJsYXVidDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGllc2UgRmVsZCBzb2xsdGUgZWluZW4gZGVyIGZvbGdlbmRlbiBXZXJ0ZSBlbnRoYWx0ZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRpZSBNaW5kZXN0YW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRpZSBNYXhpbWFsYW56YWhsIHZvbiBFbGVtZW50ZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiRGllc2UgV2VydGUgc2luZCBuaWNodCBlaW5kZXV0aWciLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiS2VpbmUgTGlzdGUgdm9uIFdlcnRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmFsc2NoZXMgRGF0dW1zZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJLZWluZSBnw7xsdGlnZSBFLU1haWwgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIktlaW5lIEdhbnplIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlVuZ8O8bHRpZ2UgSVB2NCBBZHJlc3NlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgZ3LDtnNzdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGllIGtsZWluc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGdyw7bDn2VyIHNlaW4gYWxzIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEaWUgZ3LDtnNzdG3DtmdsaWNoZSBaYWhsIG11c3Mga2xlaW5lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkRlciBXZXJ0IG11c3MgZHVyY2ggezB9IGRpdmlkaWVyYmFyIHNlaW4iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiRGllIEVpbmdhYmUgaXN0IGtlaW5lIFphaGwiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJVbmfDvGx0aWdlcyBQYXNzd29ydCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVuZ8O8bHRpZ2UgVGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ3JlZWsgLSBncmVlY2UKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJlbF9HUiI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAizqXPgM6/z4fPgc61z4nPhM65zrrPjCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAizpvOrM64zr/PgiIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsizpnOsc69zr/Phc6sz4HOuc6/z4IiLCAizqbOtc6yz4HOv8+FzqzPgc65zr/PgiIsICLOnM6sz4HPhM65zr/PgiIsICLOkc+Az4HOr867zrnOv8+CIiwgIs6czqzOuc6/z4IiLCAizpnOv8+Nzr3Ouc6/z4IiLCAizpnOv8+NzrvOuc6/z4IiLCAizpHPjc6zzr/Phc+Dz4TOv8+CIiwgIs6jzrXPgM+Ezq3OvM6yz4HOuc6/z4IiLCAizp/Ous+Ez47Oss+BzrnOv8+CIiwgIs6dzr/Orc68zrLPgc65zr/PgiIsICLOlM61zrrOrc68zrLPgc65zr/PgiJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAizpTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLOm861z4DPhM6sIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAizo/Pgc61z4IiLAogICAgICAgICAgICAgICAgICAgIERBWTogIs6czq3Pgc61z4IiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAizpzOrs69zrXPgiIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIs6nz4HPjM69zrnOsSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAizpHPhc+Ez4wgz4TOvyDPgM61zrTOr86/IM60zrXOvSDOtc6vzr3Osc65IM+Az4HOv86xzrnPgc61z4TOuc66z4wiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAizpzOtyDOtc+AzrnPhM+BzrXPgM+Ezq4gz4TOuc68zq46IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDPgM61z4HOuc6tz4fOtc65IM68zq/OsSDOsc+Az4wgz4TOuc+CIM6xzrrPjM67zr/Phc64zrXPgiDPhM65zrzOrc+COiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICLOnyDOtc67zqzPh865z4PPhM6/z4IgzrHPgc65zrjOvM+Mz4IgzrXOs86zz4HOsc+Gz47OvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIs6fIM68zq3Os865z4PPhM6/z4IgzrHPgc65zrjOvM+Mz4IgzrXOs86zz4HOsc+Gz47OvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAizp/OuSDPhM65zrzOrc+CIM60zrXOvSDOtc6vzr3Osc65IM68zr/Ovc6xzrTOuc66zq3PgiIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICLOlM61zr0gz4XPgM6sz4HPh86/z4XOvSDOtc6zzrPPgc6xz4bOrc+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICLOm86szrjOv8+CIM68zr/Pgc+Gzq4gzrfOvM61z4HOv868zrfOvc6vzrHPgjogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAizpzOtyDOrc6zzrrPhc+Bzr8gZW1haWwiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLOlM61zr0gzrXOr869zrHOuSDOsc66zq3Pgc6xzrnOv8+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICLOnM63IM6tzrPOus+Fz4HOtyBJUHY0IM60zrnOtc+NzrjPhc69z4POtyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLOpM6/IM61zrvOrM+HzrnPg8+Ezr8gz4DOu86uzrjOv8+CIM+HzrHPgc6xzrrPhM6uz4HPic69IM61zq/Ovc6xzrkgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIs6kzr8gzrzOrc6zzrnPg8+Ezr8gz4DOu86uzrjOv8+CIM+HzrHPgc6xzrrPhM6uz4HPic69IM61zq/Ovc6xzrkgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIs6Rz4DOsc65z4TOv8+Nzr3PhM6xzrkgz4DOtc+BzrnPg8+Dz4zPhM61z4HOv865IM+HzrHPgc6xzrrPhM6uzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIs6Rz4DOsc65z4TOv8+Nzr3PhM6xzrkgzrvOuc6zz4zPhM61z4HOv865IM+HzrHPgc6xzrrPhM6uz4HOtc+CIM6xz4DPjCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgz4DOv867zrvOsc+AzrvOrM+DzrnOvyDPhM6/z4UgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIs6XIM+EzrnOvM6uIM60zrXOvSDOtc6vzr3Osc65IM6xz4HOuc64zrzPjM+CIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAizpzOtyDOrc6zzrrPhc+Bzr8gcGFzc3dvcmQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLOnM63IM6tzrPOus+Fz4HOv8+CIM6xz4HOuc64zrzPjM+CIM+EzrfOu861z4bPjs69zr/PhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAizpHPhc+Ez4wgz4TOvyDPgM61zrTOr86/IM60zrXOvSDOrc+HzrXOuSDPhM63zr0gzrHPgM6xzrnPhM6/z43OvM61zr3OtyDOvM6/z4HPhs6uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAizqTOvyDPgM61zrTOr86/IM+Az4HOrc+AzrXOuSDOvc6xIM6tz4fOtc65IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+HzrHPgc6xzrrPhM6uz4HOtc+CIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIs6kzr8gz4DOtc60zq/OvyDOvM+Azr/Pgc61zq8gzr3OsSDOrc+HzrXOuSDPhM6/IM+Azr/Ou8+NIHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gc3BhbmlzaCAtIHNwYWluCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZXNfRVMiOiB7CgkJCQlyZXF1aXJlZDogIkVzdGUgY2FtcG8gZXMgb2JsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIkVzdGUgY2FtcG8gZXMgaW52w6FsaWRvIiwKCQkJCW1vbnRoczogWyJFbmVybyIsICJGZWJyZXJvIiwgIk1hcnpvIiwgIkFicmlsIiwgIk1heW8iLCAiSnVuaW8iLCAiSnVsaW8iLCAiQWdvc3RvIiwgIlNlcHRpZW1icmUiLCAiT2N0dWJyZSIsICJOb3ZpZW1icmUiLCAiRGljaWVtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWd1bmRvcyIsCgkJCQkJTUlOVVRFOiAibWludXRvcyIsCgkJCQkJSE9VUjogImhvcmFzIiwKCQkJCQlEQVk6ICJkw61hcyIsCgkJCQkJTU9OVEg6ICJtZXNlcyIsCgkJCQkJWUVBUjogImHDsW9zIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJFc3RlIGNhbXBvIG5vIGVzIG9wY2lvbmFsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gc29uIGxvcyB2YWxvcmVzIHJlY2hhemFkb3MuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZWJlIHRlbmVyIHVubyBkZSBsb3MgdmFsb3JlcyBhZGVudHJvIHswfS4gW3sxfV0iLAoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIkVsIG7Dum1lcm8gbcOtbmltbyBkZSBhcnTDrWN1bG9zIGVzIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkVsIG7Dum1lcm8gbcOheGltbyBkZSBhcnTDrWN1bG9zIGVzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiTG9zIHZhbG9yZXMgbm8gc29uIMO6bmljb3MiLAoJCQkJIm5vdEFuQXJyYXkiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBhcnNlbmFsIiwKCQkJCSJpbnZhbGlkRGF0ZSI6ICJGZWNoYSBpbnbDoWxpZGEgcGFyYSBlbCBmb3JtYXRvIHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkVtYWlsIGFkZHJlc3MgaW52w6FsaWRvLCBleDogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG5vIGVzIHVuIG7Dum1lcm8gZW50ZXJvLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiRGlyZWNjacOzbiBpbnbDoWxpZGEgSVB2NCwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkVsIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIGVzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJFbCB2YWxvciBtw6F4aW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRWwgdmFsb3IgZGUgZXN0ZSBjYW1wbyBkZWJlIHNlciBtYXlvciBxdWUgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWVub3MgcXVlIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRWwgdmFsb3IgZGViZSBzZXIgZGl2aXNpYmxlIGNlcmNhIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG5vIGVzIHVuIG7Dum1lcm8uIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiQ29udHJhc2XDsWEgaW52w6FsaWRhIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiTsO6bWVybyBkZSB0ZWzDqWZvbm8gaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciBwYXRyw7NuIHswfSIsCgkJCQkic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZWJlIGNvbnRlbmVyIHBvciBsbyBtZW5vcyB7MH0gbsO6bWVyb3MgbyBjYXJhY3RlcmVzIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBhIGxvIG3DoXMgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkibm9uZUxhYmVsIjogIk5pbmd1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBw7FhZGlyIiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJBw7FhZGlyIiwKCQkJCSJyZW1vdmVCdXR0b25MYWJlbCI6ICJRdWl0YXIiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiQXJyaWJhIiwKCQkJCSJkb3duQnV0dG9uTGFiZWwiOiAiQWJham8iCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGZpbm5pc2ggLSBmaW5sYW5kCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZmlfRkkiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIktlbnR0w6Qgb24gcGFrb2xsaW5lbiIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiU3nDtnRlIG9uIHZpcmhlZWxsaW5lbiIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiVGFtbWlrdXUiLCAiSGVsbWlrdXUiLCAiTWFhbGlza3V1IiwgIkh1aHRpa3V1IiwgIlRvdWtva3V1IiwgIktlc8Oka3V1IiwgIkhlaW7DpGt1dSIsICJFbG9rdXUiLCAiU3l5c2t1dSIsICJMb2tha3V1IiwgIk1hcnJhc2t1dSIsICJKb3VsdWt1dSJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW50aWEiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV1dHRpYSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogInR1bnRpYSIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAicMOkaXbDpMOkIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogImt1dWthdXR0YSIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogInZ1b3R0YSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiVMOkbcOkIGtlbnR0w6Qgb24gcGFrb2xsaW5lbiIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJTZXVyYWF2YXQgc3nDtnR0ZWV0IGVpdsOkdCBvbGUgc2FsbGl0dHVqYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiS2VudMOkbiBwaXTDpMOkIHNpc8OkbHTDpMOkIHlrc2kgc2V1cmFhdmlzdGEgYXJ2b2lzdGE6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlBpZW5pbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiU3V1cmluIHNhbGxpdHR1IG3DpMOkcsOkIGFydm9qYSBvbiB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlN5w7Z0ZXR5dCBhcnZvdCBlaXbDpHQgb2xlIHVuaWlra2VqYSIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICJTecO2dGUgZWkgb2xlIGxpc3RhIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJWaXJoZWVsbGluZW4gcMOkaXbDpG3DpMOkcsOkbXVvdG86IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIlZpcmhlZWxsaW5lbiBzw6Roa8O2cG9zdGlvc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJBcnZvIGVpIG9sZSBrb2tvbmFpc2x1a3UiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIlZpcmhlZWxsaW5lbiBJUHY0LW9zb2l0ZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJQaWVuaW4gc2FsbGl0dHUgYXJ2byBvbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiU3V1cmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkFydm9uIHBpdMOkw6Qgb2xsYSBzdXVyZW1waSBrdWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgcGllbmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIkx1dnVuIHBpdMOkw6Qgb2xsYSBqYW9sbGluZW4gbHV2dWxsYSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiU3nDtnRlIGVpIG9sZSBsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVmlyaGVlbGxpbmVuIHNhbGFzYW5hIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVmlyaGVlbGxpbmVuIHB1aGVsaW5udW1lcm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlN5w7Z0dGVlbiB0w6R5dHl5IG9sbGEgc2V1cmFhdmFzc2EgbXVvZG9zc2E6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiU3nDtnR0ZWVuIG1pbmltaXBpdHV1cyBvbiB7MH0gbWVya2tpw6QiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiU3nDtnR0ZWVuIG1ha3NpbWlwaXR1dXMgb24gezB9IG1lcmtracOkIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmcmVuY2ggLSBmcmFuY2UKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJmcl9GUiI6IHsKCQkJCXJlcXVpcmVkOiAiQ2UgY2hhbXAgZXN0IHJlcXVpcyIsCgkJCQlpbnZhbGlkOiAiQ2UgY2hhbXAgZXN0IGludmFsaWRlIiwKCQkJCW1vbnRoczogWyJKYW52aWVyIiwgIkbDqXZyaWVyIiwgIk1hcnMiLCAiQXZyaWwiLCAiTWFpIiwgIkp1aW4iLCAiSnVpbGxldCIsICJBb8O7dCIsICJTZXB0ZW1icmUiLCAiT2N0b2JyZSIsICJOb3ZlbWJyZSIsICJEw6ljZW1icmUiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNlY29uZGVzIiwKCQkJCQlNSU5VVEU6ICJtaW51dGVzIiwKCQkJCQlIT1VSOiAiaGV1cmVzIiwKCQkJCQlEQVk6ICJqb3VycyIsCgkJCQkJTU9OVEg6ICJtb2lzIiwKCQkJCQlZRUFSOiAiYW5uw6llcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiQ2UgY2hhbXAgbidlc3QgcGFzIG9wdGlvbm5lbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbnQgZGVzIHZhbGV1cnMgaW50ZXJkaXRlcy4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJDZSBjaGFtcCBkb2l0IHByZW5kcmUgdW5lIGRlcyB2YWxldXJzIHN1aXZhbnRlcyA6IHswfS4gW3sxfV0iLAoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIkxlIG5vbWJyZSBtaW5pbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiTGUgbm9tYnJlIG1heGltdW0gZCfDqWzDqW1lbnRzIGVzdCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxlcyB2YWxldXJzIHNvbnQgdW5pcXVlcyIsCgkJCQkibm90QW5BcnJheSI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuZSBsaXN0ZSIsCgkJCQkiaW52YWxpZERhdGUiOiAiQ2V0dGUgZGF0ZSBuZSBjb3JyZXNwb25kIHBhcyBhdSBmb3JtYXQgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiQWRyZXNzZSBkZSBjb3VycmllbCBpbnZhbGlkZSwgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1biBub21icmUgZW50aWVyLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiQWRyZXNzZSBJUHY0IGludmFsaWRlLCBleDogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiTGEgdmFsZXVyIG1pbmltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJMYSB2YWxldXIgbWF4aW1hbGUgcG91ciBjZSBjaGFtcCBlc3QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkxhIHZhbGV1ciBkb2l0LcOqdHJlIHN1cMOpcmlldXJlIMOgIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBpbmbDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkxhIHZhbGV1ciBkb2l0LcOqdHJlIGRpdmlzaWJsZSBwYXIgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk1vdCBkZSBwYXNzZSBpbnZhbGlkZSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bcOpcm8gZGUgdMOpbMOpcGhvbmUgaW52YWxpZGUsIGV4OiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiQ2UgY2hhbXAgZG9pdCBjb3JyZXNwb25kcmUgYXUgbW90aWYgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJDZSBjaGFtcCBkb2l0IGNvbnRlbmlyIGF1IG1vaW5zIHswfSBjYXJhY3TDqHJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJDZSBjaGFtcCBkb2l0IGNvbnRlbmlyIGF1IHBsdXMgezB9IGNhcmFjdMOocmVzIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjcm9hdGlhbiAtIGNyb2F0aWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJocl9IUiI6IHsKCQkJCXJlcXVpcmVkOiAiUG9samUgamUgb2JhdmV6bm8iLAoJCQkJaW52YWxpZDogIlBvZ3JlxaFuYSB2cmlqZWRub3N0IiwKCQkJCW1vbnRoczogWyJTaWplxI1hbmoiLCAiVmVsamHEjWEiLCAiT8W+dWphayIsICJUcmF2YW5qIiwgIlN2aWJhbmoiLCAiTGlwYW5qIiwgIlNycGFuaiIsICJLb2xvdm96IiwgIlJ1amFuIiwgIkxpc3RvcGFkIiwgIlN0dWRlbmkiLCAiUHJvc2luYWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZGEiLAoJCQkJCU1JTlVURTogIm1pbnV0YSIsCgkJCQkJSE9VUjogInNhdGkiLAoJCQkJCURBWTogImRhbiIsCgkJCQkJTU9OVEg6ICJtamVzZWMiLAoJCQkJCVlFQVI6ICJnb2RpbmEiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIlBvbGplIG5pamUgb3BjaW9uby4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHZyaWplZG5vc3QgbmlqZSBkb3p2b2xqZW5hLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIk1vZ3XEh2UgdnJpamVkbm9zdGkgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJPZGFiZXJpdGUgbmFqbWFuamUgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiT2RhYmVyaXRlIG5hanZpxaFlIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiVnJpamVkbm9zdCBuaWplIGplZGluc3R2ZW5hIiwKCQkJCSJub3RBbkFycmF5IjogIlZyaWplZG5vc3QgbmlqZSBwb3BpcyIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0dW0gbmlqZSB1IGZvcm1hdHUgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiRS1tYWlsIGFkcmVzYSBuaWplIHUgaXNwcmF2bm9tIGZvcm1hdHUsIG5wcjogaW1lLnByZXppbWVAaW50ZXJuZXQuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiVnJpamVkbm9zdCBuaWplIGNpamVsaSBicm9qLiIsCgkJCQkiaW52YWxpZElQdjQiOiAiSVB2NCBhZHJlc2EgbmlqZSBpc3ByYXZuYSwgbnByOiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJWcmlqZWRub3N0IGplIGlzcG9kIGRvcHXFoXRlbm9nIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJWcmlqZWRub3N0IGplIGl6bmFkIGRvcHXFoXRlbm9nIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWcmlqZWRub3N0IG1vcmEgYml0aSB2ZcSHYSBvZCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgbWFuamEgb2QgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJWcmlqZWRub3N0IG1vcmEgYml0aSBkamVsaml2YSBzYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiVnJpamVkbm9zdCBuaWplIGJyb2ouIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiTmVpc3ByYXZuYSBsb3ppbmthIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiVGVsZWZvbiBuaWplIGlzcHJhdmFuLCBucHI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJQb2dyZcWhYW4gdXpvcmFrIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiUG9samUgbW9yYSBpbWF0aSBuYW1qYW5qZSB7MH0gem5ha292YSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJQb2xqZSBtb3JhIGltYXRpIG5hanZpxaFlIHswfSB6bmFrb3ZhIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBpdGFsaWFuIC0gaXRhbHkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJpdF9JVCI6IHsKCQkJCXJlcXVpcmVkOiAiUXVlc3RvIGNhbXBvIMOoIG9iYmxpZ2F0b3JpbyIsCgkJCQlpbnZhbGlkOiAiUXVlc3RvIGNhbXBvIMOoIGludmFsaWRvIiwKCQkJCW1vbnRoczogWyJHZW5uYWlvIiwgIkZlYmJyYWlvIiwgIk1hcnpvIiwgIkFwcmlsZSIsICJNYWdnaW8iLCAiR2l1Z25vIiwgIkx1Z2xpbyIsICJBZ29zdG8iLCAiU2V0dGVtYnJlIiwgIk90dG9icmUiLCAiTm92ZW1icmUiLCAiRGljZW1icmUiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNlY29uZGkiLAoJCQkJCU1JTlVURTogIm1pbnV0aSIsCgkJCQkJSE9VUjogIm9yZSIsCgkJCQkJREFZOiAiZ2lvcm5pIiwKCQkJCQlNT05USDogIm1lc2kiLAoJCQkJCVlFQVI6ICJhbm5pIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJRdWVzdG8gY2FtcG8gbm9uIMOoIG9wemlvbmFsZSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gc29ubyB2YWxvcmkgaW52YWxpZGkiLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJRdWVzdG8gY2FtcG8gZGV2ZSBhdmVyZSB1bm8gZGVpIHNlZ3VlbnRpIHZhbG9yaSB7MH0gKHZhbG9yZSBhdHR1YWxlOiB7MX0pIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJJbCBudW1lcm8gbWluaW1vIGRpIGVsZW1lbnRpIHJpY2hpZXN0aSDDqCB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJJbCBudW1lcm8gbWFzc2ltbyBkaSBlbGVtZW50aSBhbW1lc3NpIMOoIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiSSB2YWxvcmkgbm9uIHNvbm8gdW5pdm9jaSIsCgkJCQkibm90QW5BcnJheSI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCBkaSB0aXBvIGFycmF5IiwKCQkJCSJpbnZhbGlkRGF0ZSI6ICJEYXRhIGludmFsaWRhIHBlciBpbCBmb3JtYXRvIHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkluZGlyaXp6byBlbWFpbCBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8gaW50ZXJvIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJJbmRpcml6em8gSVB2NCBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiSWwgdmFsb3JlIG1pbmltbyBwZXIgcXVlc3RvIGNhbXBvIMOoIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJJbCB2YWxvcmUgbWFzc2ltbyBwZXIgcXVlc3RvIGNhbXBvIMOoIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIG1hZ2dpb3JlIGRpIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIG1pbm9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIklsIHZhbG9yZSBkaSBxdWVzdG8gY2FtcG8gZGV2ZSBlc3NlcmUgZGl2aXNpYmlsZSBwZXIgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlF1ZXN0byB2YWxvcmUgbm9uIMOoIHVuIG51bWVybyIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIlBhc3N3b3JkIGludmFsaWRhIiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiTnVtZXJvIGRpIHRlbGVmb25vIGludmFsaWRvLCBzaSBhdHRlbmRvbm8gdmFsb3JpIGRlbCB0aXBvOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgbGEgc2VndWVudGUgc3RydXR0dXJhOiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlF1ZXN0byBjYW1wbyBub24gZGV2ZSBjb250ZW5lcmUgbWVubyBkaSB7MH0gY2FyYXR0ZXJpIiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIlF1ZXN0byBjYW1wbyBub24gZGV2ZSBjb250ZW5lcmUgcGnDuSBkaSB7MH0gY2FyYXR0ZXJpIiwKCQkJCSJub25lTGFiZWwiOiAiTmVzc3VubyIsCgkJCQkiYWRkSXRlbUJ1dHRvbkxhYmVsIjogIkFnZ2l1bmdpIiwKCQkJCSJhZGRCdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmltdW92aSIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJTdSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkdpw7kiCgkJCX0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGphcGFuZXNlIC0gamFwYW4KCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyAoewogICAgICAgICJpZCI6ICJiYXNlIiwKICAgICAgICAibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJqYV9KUCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAi44GT44Gu6aCF55uu44Gv5b+F6aCI44Gn44GZIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICLjgZPjga7poIXnm67jga/mraPjgZfjgYTlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIjHmnIgiLCAiMuaciCIsICIz5pyIIiwgIjTmnIgiLCAiNeaciCIsICI25pyIIiwgIjfmnIgiLCAiOOaciCIsICI55pyIIiwgIjEw5pyIIiwgIjEx5pyIIiwgIjEy5pyIIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICLnp5IiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIuWIhiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIuaZgiIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAi5pelIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIuaciCIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIuW5tCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAi44GT44Gu6aCF55uu44Gv5Lu75oSP44Gu5Zue562U6aCF55uu44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSDjga/npoHmraLjgZXjgozjgabjgYTjgovlgKTjgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruS4reOBi+OCiemBuOOBsOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAguePvuWcqOOBruWApOOBryB7MX0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4iuW/heimgeOBp+OBmSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIumgheebruaVsOOBryB7MH0g5Lul5LiL44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICLlgKTjgYzkuIDmhI/jgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM6YWN5YiX44Gn44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIuOBk+OBrumgheebruOBruacgOWwj+WApOOBryB7MH0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIuOBk+OBrumgheebruOBruacgOWkp+WApOOBryB7MH0g44Gn44GZIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIuOBk+OBrumgheebruOBruWApOOBryB7MH0g44KI44KK5bCP44GV44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIuOBk+OBrumgheebruOBruWApOOBryB7MH0g44KI44KK5aSn44GN44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLlgKTjga8gezB9IOOBq+OCiOOBo+OBpuWJsuOCiuWIh+OCjOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbDlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICLlgKTjgYwgezB9IOOBruWAjeaVsOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIuOBk+OBrumgheebruOBruWApOOBjOaVtOaVsOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QUpTT04iOiAi5YCk44GM5q2j44GX44GEIEpTT04g5b2i5byP44Gu5paH5a2X5YiX44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICLjgZPjga7poIXnm67jga8gezB9IOaWh+Wtl+S7peS4iuW/heimgeOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLjgZPjga7poIXnm67jga8gezB9IOaWh+Wtl+S7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFRpbWUiOiAi5pmC6ZaT44GM5q2j44GX44GP44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICLml6Xku5jjgYwgezB9IOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIuODoeODvOODq+OCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCBpbmZvQGNsb3VkY21zLmNvbSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIklQdjQg44Ki44OJ44Os44K544GM5q2j44GX44GP44GC44KK44G+44Gb44KT44CC5L6L44GI44GwIDE5Mi4xNjguMC4xIOOBruOCiOOBhuOBquW9ouW8j+OBp+OBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIuODkeOCueODr+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIumbu+ipseeVquWPt+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAoMTIzKSA0NTYtOTk5OSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIuOBk+OBrumgheebruOBryB7MH0g44Gu44OR44K/44O844Oz44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlVSTCDjgYzmraPjgZfjgYTlvaLlvI/jgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImtleU1pc3NpbmciOiAi5Zyw5Zuz44GM56m644Gu44Kt44O844KS5ZCr44KT44Gn44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJrZXlOb3RVbmlxdWUiOiAi5Zyw5Zuz44Gu44Kt44O844GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJPYmplY3R0b29GZXdQcm9wZXJ0aWVzIjogIuODl+ODreODkeODhuOCo+OBjOi2s+OCiuOBvuOBm+OCkyAoezB9IOOBjOW/heimgeOBp+OBmSkiLAogICAgICAgICAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIuODl+ODreODkeODhuOCoyAoezB9KSDjga7mnIDlpKfmlbDjgpLotoXjgYjjgabjgYTjgb7jgZkiLAogICAgICAgICAgICAgICAgIndvcmRMaW1pdEV4Y2VlZGVkIjogInswfSDjga7ljZjoqp7mlbDjga7liLbpmZDjgpLotoXjgYjjgabjgYTjgb7jgZkiLAogICAgICAgICAgICAgICAgImVkaXRvckFubm90YXRpb25zRXhpc3QiOiAi44Ko44OH44Kj44K/44GM5L+u5q2j44GZ44G544GN44Ko44Op44O844KS5aCx5ZGK44GX44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiOiAiNeahgeOBriBaaXBjb2RlICgjIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiOeahgeOBriBaaXBjb2RlICgjIyMjIy0jIyMjKSDjgafjga/jgYLjgorjgb7jgZvjgpMiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIG5vcndlZ2lhbiAtIG5vcndheQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgIm5iX05PIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJGZWx0ZXQgZXIgb2JsaWdhdG9yaXNrIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJWZXJkaWVuIGVyIHVneWxkaWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk1hcnMiLCAiQXByaWwiLCAiTWFpIiwgIkp1bmkiLCAiSnVsaSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVzZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIlNla3VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJNaW51dHRlciIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlRpbWVyIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJEYWdlciIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJNw6VuZWRlciIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIsOFciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGV0dGUgZmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZW5uZSB2ZXJkaWVuIGVyIGlra2UgdGlsbGF0dDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRmVsdGV0IG3DpSBpbm5laG9sZGUgZW4gYXYgZsO4bGdlbmRlIHZlcmRpZXI6IHswfS4gTsOldsOmcmVuZGUgdmVyZGkgZXI6IHsxfSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiRGV0IG1pbnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7hyc3RlIHRpbGxhdHRlIGFudGFsbGV0IGVsZW1lbnRlciBlciB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZlcmRpZW5lIGVyIGlra2UgdW5pa2UiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSWtrZSBlbiBsaXN0ZSBhdiB2ZXJkaWVyIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJVZ3lsZGlnIGRhdG9mb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIlVneWxkaWcgZS1wb3N0YWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZlcmRpZW4gZXIgaWtrZSBldCBoZWx0YWxsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVZ3lsZGlnIElQdjQtYWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEZW4gbWluc3RlIHRpbGxhdHRlIHZlcmRpZW4gZXIgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRlbiBzdMO4cnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWZXJkaWVuIG3DpSB2w6ZyZSBzdMO4cnJlIGVubiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgbWluZHJlIGVubiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRhbGxldCBtw6UgdsOmcmUgZGVsYmFydCBtZWQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlZlcmRpZW4gZXIgaWtrZSBldCB0YWxsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVWd5bGRpZyBwYXNzb3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVWd5bGRpZyB0ZWxlZm9ubnVtbWVyIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJGZWx0ZXQgbcOlIHbDpnJlIGkgZsO4bGdlbmRlIGZvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJEZXR0ZSBmZWx0ZXQgbcOlIG1pbnN0IGlubmVob2xkZSB7MH0gdGVnbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0ZSBmZWx0ZXQga2FuIG1ha3MgaW5uZWhvbGRlIHswfSB0ZWduIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBkdXRjaCAtIGJlbGdpdW0KCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJubF9CRSI6IHsKCQkJCXJlcXVpcmVkOiAiRGl0IHZlbGQgaXMgdmVycGxpY2h0IiwKCQkJCWludmFsaWQ6ICJEaXQgdmVsZCBpcyBvbmdlbGRpZyIsCgkJCQltb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYWFydCIsICJBcHJpbCIsICJNZWkiLCAiSnVuaSIsICJKdWx5IiwgIkF1Z3VzdHVzIiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlbiIsCgkJCQkJTUlOVVRFOiAibWludXRlbiIsCgkJCQkJSE9VUjogInVyZW4iLAoJCQkJCURBWTogImRhZ2VuIiwKCQkJCQlNT05USDogIm1hYW5kZW4iLAoJCQkJCVlFQVI6ICJqYXJlbiIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRGl0IHZlbGQgaXMgbmlldCBvcHRpb25lZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB6aWpuIHZlcmJvZGVuIHdhYXJkZW4uIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRGl0IHZlbGQgbW9ldCDDqcOpbiB2YW4gdm9sZ2VuZGUgYmV2YXR0ZW4gOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJIZXQgbWluaW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkhldCBtYXhpbXVtIGFhbnRhbCBlbGVtZW50ZW4gaXMgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJEZSB3YWFyZGVuIHppam4gdW5pZWsiLAoJCQkJIm5vdEFuQXJyYXkiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBsaWpzdCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGUgZGF0dW0ga29tdCBuaWV0IG92ZXJlZW4gbWV0IGZvcm1hYXQgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiT25nZWxkaWcgZS1tYWlsYWRyZXMsIHZiLjogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdlaGVlbCBnZXRhbC4iLAoJCQkJImludmFsaWRJUHY0IjogIk9uZ2VsZGlnIElQdjQgYWRyZXMsIHZiLjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGUgbWluaW1hbGUgd2FhcmRlIHZvb3IgZGl0IHZlbGQgaXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIkRlIG1heGltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBncm90ZXIgemlqbiBkYW4gezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIkRlIHdhYXJkZSBtb2V0IGtsZWluZXIgemlqbiBkYW4gezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJEZSB3YWFyZGUgbW9ldCBkZWVsYmFhciB6aWpuIGRvb3IgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIkRlemUgd2FhcmRlIGlzIGdlZW4gZ2V0YWwuIiwKCQkJCSJpbnZhbGlkUGFzc3dvcmQiOiAiT25nZWxkaWcgd2FjaHR3b29yZCIsCgkJCQkiaW52YWxpZFBob25lIjogIk9uZ2VsZGlnIHRlbGVmb29ubnVtbWVyLCB2YjogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkRpdCB2ZWxkIG1vZXQgb3ZlcmVlbmtvbWVuIG1ldCBwYXRyb29uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGl0IHZlbGQgbW9ldCBtaW5zdGVucyB7MH0gdGVrZW5zIGJldmF0dGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpdCB2ZWxkIG1vZXQgbWluZGVyIGRhbiB7MH0gdGVrZW5zIGJldmF0dGVuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBwb2xpc2ggLSBwb2xhbmQKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyAoewogICAgICAgICJpZCI6ICJiYXNlIiwKICAgICAgICAibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJwbF9QTCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiVG8gcG9sZSBqZXN0IHd5bWFnYW5lIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJUbyBwb2xlIGplc3QgbmllcHJhd2lkxYJvd2UiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlN0eWN6ZcWEIiwgIkx1dHkiLCAiTWFyemVjIiwgIkt3aWVjaWXFhCIsICJNYWoiLCAiQ3plcndpZWMiLCAiTGlwaWVjIiwgIlNpZXJwaWXFhCIsICJXcnplc2llxYQiLCAiUGHFumR6aWVybmlrIiwgIkxpc3RvcGFkIiwgIkdydWR6aWXFhCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5keSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXR5IiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiZ29kemlueSIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiZG5pIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1pZXNpxIVjZSIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogImxhdGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlRvIHBvbGUgbmllIGplc3Qgb3Bjam9uYWxuZSIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgZG96d29sb25hOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGplZG7EhSB6IG5hc3TEmXB1asSFY3ljaCB3YXJ0b8WbY2k6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltYWxuYSBsaWN6YmEgZWxlbWVudMOzdyB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiTWFrc3ltYWxuYSBsaWN6YmEgZWxlbWVudMOzdyB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJUZSB3YXJ0b8WbY2kgbmllIHPEhSB1bmlrYWxuZSIsCiAgICAgICAgICAgICAgICAibm90QW5BcnJheSI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgdGFibGljxIUiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIk5pZXBvcHJhd255IGZvcm1hdCBkYXR5OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJOaWVwb3ByYXdueSBhZHJlcyBlbWFpbCwgbi5wLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYSB3YXJ0b8WbxIcgbmllIGplc3QgbGljemLEhSBjYcWCa293aXTEhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiTmllcG9wcmF3bnkgYWRyZXMgSVB2NCwgbi5wLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiTWluaW1hbG5hIHdhcnRvxZvEhyBkbGEgdGVnbyBwb2xhIHd5bm9zaSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTWFrc3ltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIldhcnRvxZvEhyBkbGEgdGVnbyBwb2xhIG11c2kgYnnEhyB3acSZa3N6YSBuacW8IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgbW5pZWpzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIldhcnRvxZvEhyBtdXNpIGJ5xIcgcG9kemllbG5hIHByemV6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJXYXJ0b8WbxIcgbmllIGplc3QgbGljemLEhSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIk5pZXBvcHJhd25lIGhhc8WCbyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk5pZXBvcHJhd255IG51bWVyIHRlbGVmb251LCBuLnAuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiVG8gcG9sZSBwb3dpbm5vIG1pZcSHIGZvcm1hdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgY28gbmFqbW5pZWogezB9IHpuYWvDs3ciLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBuYWp3ecW8ZWogezB9IHpuYWvDs3ciCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9ydHVndWVzZSAtIHBvcnR1Z2FsCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicHRfQlIiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkVzdGUgY2FtcG8gw6kgb2JyaWdhdMOzcmlvIiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJFc3RlIGNhbXBvIMOpIGludsOhbGlkbyIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFuZWlybyIsICJGZXZlcmVpcm8iLCAiTWFyw6dvIiwgIkFicmlsIiwgIk1haW8iLCAiSnVuaG8iLCAiSnVsaG8iLCAiQWdvc3RvIiwgIlNldGVtYnJvIiwgIk91dHVicm8iLCAiTm92ZW1icm8iLCAiRGV6ZW1icm8iXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNlZ3VuZG9zIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dG9zIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAiaG9yYXMiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRpYXMiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAibWVzZXMiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJhbm9zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJFc3RlIGNhbXBvIG7Do28gw6kgb3BjaW9uYWwiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IHPDo28gdmFsb3JlcyBwcm9pYmlkb3MiLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICJFc3RlIGNhbXBvIGRldmUgdGVyIHVtIGRvcyBzZWd1aW50ZXMgdmFsb3JlczogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAiTyBuw7ptZXJvIG3DrW5pbW8gZGUgZWxlbWVudG9zIMOpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk8gbsO6bWVybyBtw6F4aW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIk9zIHZhbG9yZXMgbsOjbyBzw6NvIMO6bmljb3MiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiRXN0ZSB2YWxvciBuw6NvIMOpIHVtYSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRXN0YSBkYXRhIG7Do28gdGVtIG8gZm9ybWF0byB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJFbmRlcmXDp28gZGUgZS1tYWlsIGludsOhbGlkbyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bSBuw7ptZXJvIGludGVpcm8iLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIkVuZGVyZcOnbyBJUHY0IGludsOhbGlkbywgZXg6IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk8gdmFsb3IgbcOtbmltbyBwYXJhIGVzdGUgY2FtcG8gw6kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk8gdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gw6kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIk8gdmFsb3IgZGVzdGUgY2FtcG8gZGV2ZSBzZXIgbWFpb3IgcXVlIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1lbm9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIk8gdmFsb3IgZGV2ZSBzZXIgZGl2aXPDrXZlbCBwb3IgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bSBuw7ptZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiU2VuaGEgaW52w6FsaWRhIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiTsO6bWVybyBkZSB0ZWxlZm9uZSBpbnbDoWxpZG8sIGV4OiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciBvIHBhZHLDo28gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJFc3RlIGNhbXBvIGRldmUgaW5jbHVpciBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkVzdGUgY2FtcG8gcG9kZSBpbmNsdWlyIG5vIG3DoXhpbW8gezB9IGNhcmFjdGVyZXMiLAoJCSJ0aHVtYm5haWwiOiAiTWluaWF0dXJhIiwKICAgICAgICAJImZpbGVuYW1lIjogIkFycXVpdm8iLAogICAgICAgIAkiZmlsZVNpemUiOiAiVGFtYW5obyhieXRlcykiLAogICAgICAgIAkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQ29tYW5kb3MiLAogICAgICAgIAkiY2hvb3NlRmlsZSI6ICJFc2NvbGhlciBhcnF1aXZvLi4uIiwKICAgICAgICAJImNob29zZUZpbGVzIjogIkVzY29saGVyIGFycXVpdm9zLi4uIiwKICAgICAgICAJImRyb3Bab25lU2luZ2xlIjogIkNsaXF1ZSBlbSBFc2NvbGhlciBvdSBhcnJhc3RlIHVtIGFycXVpdm8gYXF1aS4uLiIsCiAgICAgICAgCSJkcm9wWm9uZU11bHRpcGxlIjogIkNsaXF1ZSBlbSBFc2NvbGhlciBvdSBhcnJhc3RlIGFycXVpdm9zIGFxdWkuLi4iLAoJCSJmaWxlVG9vQmlnIjogIkFycXVpdm8gbXVpdG8gZ3JhbmRlOiAiLAogICAgICAgICJub25TZWxlY3RlZFRleHQiOiAiLSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gc3dlZGlzaCAtIHN3ZWRlbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInN2X1NFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJGw6RsdGV0IMOkciBvYmxpZ2F0b3Jpc2t0IiwKICAgICAgICAgICAgICAgIGludmFsaWQ6ICJWw6RyZGV0IMOkciBmZWxha3RpZ3QiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFycyIsICJBcHJpbCIsICJNYWoiLCAiSnVuaSIsICJKdWxpIiwgIkF1Z3VzdGkiLCAiU2VwdGVtYmVyIiwgIk9rdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dGVyIiwKICAgICAgICAgICAgICAgICAgICBIT1VSOiAidGltbWFyIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkYWdhciIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtw6VuYWRlciIsCiAgICAgICAgICAgICAgICAgICAgWUVBUjogIsOlciIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRGV0dGEgZsOkbHQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVzc2EgdsOkcmRlbiDDpHIgaW50ZSB0aWxsw6V0bmE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkbDpGx0ZXQgbcOlc3RlIGlubmVow6VsbGEgZXR0IGF2IGbDtmxqYW5kZSB2w6RyZGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEZXQgbWluc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO2cnN0YSB0aWxsw6V0bmEgYW50YWxldCBlbGVtZW50IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlbDpHJkZW5hIMOkciBpbnRlIHVuaWthIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkludGUgZW4gbGlzdGEgYXYgdsOkcmRlbiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiRmVsYWt0aWd0IGZvcm1hdCBmw7ZyIGRhdHVtOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJPZ2lsdGlnIGUtcG9zdGFkcmVzcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QW5JbnRlZ2VyIjogIlbDpHJkZXQgw6RyIGludGUgZXR0IGhlbHRhbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiT2dpbHRpZyBJUHY0LWFkcmVzcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEZXQgbWluc3RhIHRpbGzDpXRuYSB2w6RyZGV0IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSB2w6RyZGV0IMOkciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVsOkcmRldCBtw6VzdGUgdmFyYSBzdMO2cnJlIMOkbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiVsOkcmRldCBtw6VzdGUgdmFyYSBtaW5kcmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAiVGFsZXQgbcOlc3RlIHZhcmEgZGVsYmFydCBtZWQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlbDpHJkZXQgw6RyIGludGUgZXR0IHRhbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIk9naWx0aWd0IGzDtnNlbm9yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk9naWx0aWd0IHRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkbDpGx0ZXQgbcOlc3RlIHZhcmEgaSBmw7ZsamFuZGUgZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRldHRhIGbDpGx0IG3DpXN0ZSBpbm5laMOlbGxhIG1pbnN0IHswfSB0ZWNrZW4iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGEgZsOkbHQgZsOlciBpbm5laMOlbGxhIGjDtmdzdCB7MH0gdGVja2VuIgogICAgICAgICAgICB9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBjaGluZXNlIC0gY2hpbmEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CgkJCSJ6aF9DTiI6IHsKCQkJCXJlcXVpcmVkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjQ1MTc7JiMzOTAzNTsiLAoJCQkJaW52YWxpZDogIiYjMjc0OTI7JiMyMjQ5NTsmIzE5OTgxOyYjMjE1MTI7JiMyNjY4NDsiLAoJCQkJbW9udGhzOiBbIiYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMDEwODsmIzI2Mzc2OyIsICImIzE5OTc3OyYjMjYzNzY7IiwgIiYjMjIyMzU7JiMyNjM3NjsiLCAiJiMyMDExNjsmIzI2Mzc2OyIsICImIzIwODQ1OyYjMjYzNzY7IiwgIiYjMTk5NzE7JiMyNjM3NjsiLCAiJiMyMDg0MzsmIzI2Mzc2OyIsICImIzIwMDYxOyYjMjYzNzY7IiwgIiYjMjEzMTM7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzE5OTY4OyYjMjYzNzY7IiwgIiYjMjEzMTM7JiMyMDEwODsmIzI2Mzc2OyJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAiJiMzMTE4NjsiLAoJCQkJCU1JTlVURTogIiYjMjA5OTg7IiwKCQkJCQlIT1VSOiAiJiMyNjEwMjsiLAoJCQkJCURBWTogIiYjMjYwODU7IiwKCQkJCQlNT05USDogIiYjMjYzNzY7IiwKCQkJCQlZRUFSOiAiJiMyNDE4MDsiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM4NzUwOyYjMjAyMTk7JiMzNjg3MzsiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzY3NTU7JiMyMDgzNzsmIzIxMjUzOyYjMjUzMjQ7IHswfS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICImIzIwODAxOyYjMzU3Njg7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiJiMyNjM2ODsmIzIzNTY3OyYjMjAwMTA7JiMyNTk2ODsgezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjAwMTA7JiMyNTk2ODsgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICImIzM2NzU1OyYjMjA4Mzc7JiMyMDU0MDsmIzE5OTgxOyYjMjk0MjA7JiMyOTMwNTsiLAoJCQkJIm5vdEFuQXJyYXkiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjU5Njg7JiMzMjQ1MjsiLAoJCQkJImludmFsaWREYXRlIjogIiYjMjYwODU7JiMyNjM5OTsmIzI2Njg0OyYjMjQzMzU7JiMyMjI0MDsmIzM1ODEzOyYjMjYxNTk7IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIiYjMjAyMzQ7JiMyMjk2OTsmIzIwNzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzE5OTgxOyYjMjM1NDU7LCBleDogaW5mb0BjbG91ZGNtcy5jb20iLAoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk3MjsmIzI1OTY4Oy4iLAoJCQkJImludmFsaWRJUHY0IjogIiYjMTk5ODE7JiMyNjE1OTsmIzIxNTEyOyYjMjc4NjE7SVAmIzIyMzIwOyYjMjIzMzY7LCBleDogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiJiMyNjM2ODsmIzIzNTY3OyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIiYjMjYzNjg7JiMyMjgyMzsmIzIwNTQwOyYjMjYxNTk7IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzIyODIzOyYjMjAxMTA7IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzIzNTY3OyYjMjAxMTA7IHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiJiMyMDU0MDsmIzI0NTE3OyYjMzkwMzU7JiMzMzAyMTsmIzM0OTg3OyB7MH0gJiMyNTk3MjsmIzM4NTAwOyIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzIzMzgzOy4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICImIzM4NzUwOyYjMjc4NjE7JiMyMzQ5NDsmIzMwNzIxOyIsCgkJCQkiaW52YWxpZFBob25lIjogIiYjMzg3NTA7JiMyNzg2MTsmIzMwMDA1OyYjMzU4MDU7JiMyMTQ5NTsmIzMwNzIxOywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICImIzI3NDkyOyYjMjI0OTU7JiMzOTAzNTsmIzI2Mzc3OyYjMjY2ODQ7JiMyNDMzNTsgezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICImIzI3NDkyOyYjMjI0OTU7JiMzMzI2NzsmIzIzNTY5OyYjMzgyNzE7JiMyNDIzMDsgezB9IiwKCQkJCSJzdHJpbmdUb29Mb25nIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzI2MzY4OyYjMjI4MTA7JiMzODI3MTsmIzI0MjMwOyB7MH0iCgkJCX0KICAgICAgICB9CiAgICB9KTsKCn0pKGpRdWVyeSk7CgovKioKICogV2ViIFRoZW1lICgid2ViIikKICoKICogRGVmaW5lcyB0aGUgZGVmYXVsdCB3ZWIgdGhlbWUgZm9yIHB1cmUgSFRNTDUgZm9ybXMuCiAqCiAqIFRoZSB2aWV3cyBhcmU6CiAqCiAqICAgIHdlYi12aWV3CiAqICAgIHdlYi1lZGl0CiAqICAgIHdlYi1jcmVhdGUKICoKICogVGhpcyB0aGVtZSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgdmlldzoKICoKICogICAgewogKiAgICAgICAidWkiOiAid2ViIiwKICogICAgICAgInR5cGUiOiBudWxsIHwgInZpZXciIHwgImVkaXQiIHwgImNyZWF0ZSIKICogICAgfQogKgogKi8KCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbmplY3RvciAoIndlYiIpLgogICAgICoKICAgICAqIFRoZSBob29rcyBwcm92aWRlZCBoZXJlIGFyZSBlbXB0eS4gIFRoZSB3ZWIgdmlldyBmYWxscyBiYWNrIG9uIHN0cmFpZ2h0IEhUTUw1IGZvciBwcmV0dHkgbXVjaCBldmVyeXRoaW5nLgogICAgICogQXMgc3VjaCwgdGhlc2UgbW9zdGx5IHNlcnZlIGFzIGEgcmVmZXJlbmNlIGZvciBleHRlbnNpb24uCiAgICAgKi8KICAgIHZhciBjYWxsYmFja3MgPSB7fTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgZmllbGQgcmVuZGVycwogICAgY2FsbGJhY2tzWyJmaWVsZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udHJvbCByZW5kZXJzCiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyBhZnRlciBhIGNvbnRhaW5lciByZW5kZXJzCiAgICBjYWxsYmFja3NbImNvbnRhaW5lciJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgZm9ybSByZW5kZXJzCiAgICBjYWxsYmFja3NbImZvcm0iXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIHJlcXVpcmVkCiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyBvcHRpb25hbAogICAgY2FsbGJhY2tzWyJvcHRpb25hbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVhZG9ubHkKICAgIGNhbGxiYWNrc1sicmVhZG9ubHkiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyBlbmFibGVkCiAgICBjYWxsYmFja3NbImVuYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBjYWxsZWQgd2hlbiB2YWxpZGl0eSBzdGF0ZSBmb3IgYSBmaWVsZCBpcyBiZWluZyBjbGVhcmVkCiAgICBjYWxsYmFja3NbImNsZWFyVmFsaWRpdHkiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGludmFsaWQKICAgIGNhbGxiYWNrc1siaW52YWxpZCJdID0gZnVuY3Rpb24oaGlkZGVuKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYSB2YWxpZAogICAgY2FsbGJhY2tzWyJ2YWxpZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBhIG1lc3NhZ2UgdG8gYW4gaW52YWxpZCBmaWVsZAogICAgY2FsbGJhY2tzWyJhZGRNZXNzYWdlIl0gPSBmdW5jdGlvbihpbmRleCwgbWVzc2FnZUlkLCBtZXNzYWdlVGV4dCwgaGlkZGVuKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHRvIHJlbW92ZSBhbGwgbWVzc2FnZXMgZm9yIGEgZmllbGQKICAgIGNhbGxiYWNrc1sicmVtb3ZlTWVzc2FnZXMiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlQnV0dG9uIl0gPSBmdW5jdGlvbihidXR0b24pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgd2hlbiBhIGJ1dHRvbiBpcyBiZWluZyBkaXNhYmxlZAogICAgY2FsbGJhY2tzWyJkaXNhYmxlQnV0dG9uIl0gPSBmdW5jdGlvbihidXR0b24pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIG9yIHJlbW92ZSB0aGUgYXJyYXkgdG9vbGJhciBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJhcnJheVRvb2xiYXIiXSA9IGZ1bmN0aW9uKHJlbW92ZSkKICAgIHsKICAgICAgICAvLyBOT1RFOiB0aGlzID0gYXJyYXkgZmllbGQKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3dhcCBleGlzdGluZyB0b29sYmFyIHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgZXhpc3RpbmdUb29sYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS10b29sYmFyW2RhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVG9vbGJhci5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgKyAiJyAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX1RPT0xCQVJfRklFTERfSUQgKyAiPSciICsgc2VsZi5nZXRJZCgpICsgIic+PC9kaXY+Iik7CgoJCQkJaWYgKHNlbGYub3B0aW9ucy50b29sYmFyUG9zaXRpb24gJiYgc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiA9PT0gImJvdHRvbSIpIHsKCQkJCQl2YXIgY29udGFpbmVyTGFzdEl0ZW0gPSAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwoJCQkJCWlmIChjb250YWluZXJMYXN0SXRlbS5sZW5ndGggPiAwKXsKCQkJCQkJY29udGFpbmVyTGFzdEl0ZW0uYWZ0ZXIoaW5zZXJ0aW9uUG9pbnRFbCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWV4aXN0aW5nVG9vbGJhci5iZWZvcmUoaW5zZXJ0aW9uUG9pbnRFbCk7CgkJCQl9CgkJCQlleGlzdGluZ1Rvb2xiYXIucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gZmluZCB0aGUgdGhlIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRvb2xiYXIKICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItYXJyYXktdG9vbGJhciIsIHNlbGYpOwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9vbGJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9ucyI6IHNlbGYudG9vbGJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMudG9vbGJhclN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAidG9vbGJhclBvc2l0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUodG9vbGJhcik7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSBhY3Rpb25iYXJzIGFsbCBjaGlsZHJlbiBvZiBhbiBhcnJheSBmaWVsZAogICAgY2FsbGJhY2tzWyJhcnJheUFjdGlvbmJhcnMiXSA9IGZ1bmN0aW9uKHJlbW92ZSkKICAgIHsKICAgICAgICAvLyBOT1RFOiB0aGlzID0gYXJyYXkgZmllbGQKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAvLyB3YWxrIG92ZXIgYWxsIGNoaWxkcmVuCiAgICAgICAgZm9yICh2YXIgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2NoaWxkSW5kZXhdOwogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZElkID0gY2hpbGRGaWVsZC5nZXRJZCgpOwoKICAgICAgICAgICAgaWYgKHJlbW92ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgZXhpc3RpbmcgYWN0aW9uIGJhciBmb3IgdGhpcyBjaGlsZAogICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBvbmUsIHJlbW92ZSBpdCBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0FjdGlvbmJhciA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD0nIiArIGNoaWxkRmllbGRJZCArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKCI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgY2hpbGRGaWVsZC5uYW1lICsgIic+PC9kaXY+Iik7CgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbmJhci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludCBtYXJrZXIKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZpbmQgb25lLCBiaW5kIGluIHRoZSBhY3Rpb24gdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIGluc2VydGlvblBvaW50RWwgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgY2hpbGRGaWVsZC5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItYXJyYXktYWN0aW9uYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXIgPSBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2hpbGRGaWVsZC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRJZCI6IGNoaWxkRmllbGQuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtSW5kZXgiOiBjaGlsZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbmJhclN0eWxlIjogc2VsZi5vcHRpb25zLmFjdGlvbmJhclN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoYWN0aW9uYmFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgLy8gZmlyZWQgYWZ0ZXIgYSB0ZXh0IGZpZWxkIGlzIGRlZW1lZCB0byBiZSBhdXRvY29tcGxldGUtYWJsZQogICAgY2FsbGJhY2tzWyJhdXRvY29tcGxldGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CgoKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiIjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJhZGRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZXhwYW5kZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gIiI7CiAgICBzdHlsZXNbInRhYmxlIl0gPSAiIjsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJwYXJlbnQiOiAiYmFzZSIsCiAgICAgICAgInR5cGUiOiAiZGlzcGxheSIsCiAgICAgICAgInVpIjogIndlYiIsCiAgICAgICAgInRpdGxlIjogIkRlZmF1bHQgSFRNTDUgZGlzcGxheSB2aWV3IiwKICAgICAgICAiZGlzcGxheVJlYWRvbmx5IjogdHJ1ZSwKICAgICAgICAidGVtcGxhdGVzIjoge30sCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJob3Jpem9udGFsIjogZmFsc2UKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBlZGl0IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWVkaXQiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgInRpdGxlIjogIkRlZmF1bHQgSFRNTDUgY3JlYXRlIHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiBmYWxzZSwKICAgICAgICAidGVtcGxhdGVzIjoge30sCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1jcmVhdGUtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItY3JlYXRlIiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBUd2l0dGVyIEJvb3RzdHJhcCBUaGVtZSAoImJvb3RzdHJhcCIpCiAqCiAqIERlZmluZXMgdGhlIEFscGFjYSB0aGVtZSBmb3IgVHdpdHRlciBCb290c3RyYXAgdjMuCiAqCiAqIFRoZSB2aWV3cyBhcmU6CiAqCiAqICAgIGJvb3RzdHJhcC12aWV3CiAqICAgIGJvb3RzdHJhcC1lZGl0CiAqICAgIGJvb3RzdHJhcC1jcmVhdGUKICoKICogVGhpcyB0aGVtZSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgdmlldzoKICoKICogICAgewogKiAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICogICAgICAgInR5cGUiOiAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvLyBjdXN0b20gc3R5bGVzCiAgICB2YXIgc3R5bGVzID0ge307CiAgICBzdHlsZXNbImJ1dHRvbiJdID0gImJ0biBidG4tZGVmYXVsdCI7CiAgICBzdHlsZXNbInNtYWxsQnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLXBsdXMtc2lnbiI7CiAgICBzdHlsZXNbInJlbW92ZUljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLW1pbnVzLXNpZ24iOwogICAgc3R5bGVzWyJ1cEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tdXAiOwogICAgc3R5bGVzWyJkb3duSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duIjsKICAgIHN0eWxlc1siZXhwYW5kZWRJY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93biI7CiAgICBzdHlsZXNbImNvbGxhcHNlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1yaWdodCI7CiAgICBzdHlsZXNbInRhYmxlIl0gPSAidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI7CgogICAgLy8gY3VzdG9tIGNhbGxiYWNrcwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgY2FsbGJhY2tzWyJyZXF1aXJlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcyBnZXQgYSBsaXR0bGUgc3RhciBpbiB0aGVpciBsYWJlbAogICAgICAgIHZhciBsYWJlbCA9ICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKTsKICAgICAgICAkKCc8c3BhbiBjbGFzcz0iYWxwYWNhLWljb24tcmVxdWlyZWQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGFyIj48L3NwYW4+JykucHJlcGVuZFRvKGxhYmVsKTsKCiAgICB9OwogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGNvbnRyb2wgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udHJvbEZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmdldEZpZWxkRWwoKSkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udGFpbmVyIGZpZWxkLCBhZGQgY2xhc3MgImhhcy1lcnJvciIKICAgICAgICBpZiAodGhpcy5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmdldEZpZWxkRWwoKSkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgIH0KICAgICAgICAqLwoKICAgIH07CiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gdmFsaWQgZmllbGRzIHJlbW92ZSB0aGUgY2xhc3MgJ2hhcy1lcnJvcicKICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJyk7CiAgICB9OwogICAgY2FsbGJhY2tzWyJjb250cm9sIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgLy8gY29udHJvbHMgZ2V0IHNvbWUgc3BlY2lhbCBmb3JtYXR0aW5nCgogICAgICAgIC8vIGZpZWxkRWwKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwoKICAgICAgICAvLyBjb250cm9sRWwKICAgICAgICB2YXIgY29udHJvbEVsID0gdGhpcy5nZXRDb250cm9sRWwoKTsKCiAgICAgICAgLy8gYWxsIGNvbnRyb2xzIGdldCB0aGUgImZvcm0tY29udHJvbCIgY2xhc3MgaW5qZWN0ZWQKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikuYWRkQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgidGV4dGFyZWEiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJzZWxlY3QiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgLy8gZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9ZmlsZV0iKS5yZW1vdmVDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKCiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0eXBlID09IGNvbG9yLCByZW1vdmUgZm9ybS1jb250cm9sCiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAiY29sb3IiKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dCIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFueSBjaGVja2JveCBpbnB1dHMgZ2V0IHRoZSAiY2hlY2tib3giIGNsYXNzIG9uIHRoZWlyIGNoZWNrYm94CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPWNoZWNrYm94XSIpLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCJjaGVja2JveCIpOwogICAgICAgIC8vIGFueSByYWRpbyBpbnB1dHMgZ2V0IHRoZSAicmFkaW8iIGNsYXNzIG9uIHRoZWlyIHJhZGlvCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpbyIpOwoKICAgICAgICAvLyBpZiBmb3JtIGhhcyAiZm9ybS1pbmxpbmUiIGNsYXNzLCB0aGVuIHJhZGlvIGFuZCBjaGVja2JveCBsYWJlbHMgZ2V0IGlubGluZSBjbGFzc2VzCiAgICAgICAgaWYgKCQoZmllbGRFbCkucGFyZW50cygiZm9ybSIpLmhhc0NsYXNzKCJmb3JtLWlubGluZSIpKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY2hlY2tib3hlcwogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94LWlubGluZSIpOwoKICAgICAgICAgICAgLy8gcmFkaW9zCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1yYWRpb10iKS5wYXJlbnQoKS5hZGRDbGFzcygicmFkaW8taW5saW5lIik7CiAgICAgICAgfQoKICAgICAgICAvLyBhbGwgY29udHJvbCBsYWJlbHMgZ2V0IGNsYXNzICJjb250cm9sLWxhYmVsIgogICAgICAgICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKS5hZGRDbGFzcygiY29udHJvbC1sYWJlbCIpOwoKICAgICAgICAvLyBpZiBpbiBob3Jpem9udGFsIG1vZGUsIGFkZCBhIHdyYXBwZXIgZGl2IChjb2wtc20tOSkgYW5kIGxhYmVsIGdldHMgKGNvbC1zbS0zKQogICAgICAgIGlmICh0aGlzLnZpZXcuaG9yaXpvbnRhbCkKICAgICAgICB7CiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgibGFiZWwuYWxwYWNhLWNvbnRyb2wtbGFiZWwiKS5hZGRDbGFzcygiY29sLXNtLTMiKTsKCiAgICAgICAgICAgIC8vYWxpZ24gaGVscCB0ZXh0IHdpdGggaW5wdXQuCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiLmhlbHAtYmxvY2siKS5hZGRDbGFzcygiY29sLXNtLW9mZnNldC0zIGNvbC1zbS05Iik7CgogICAgICAgICAgICB2YXIgd3JhcHBlciA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2xhc3MoImNvbC1zbS05Iik7CgogICAgICAgICAgICAkKGNvbnRyb2xFbCkuYWZ0ZXIod3JhcHBlcik7CiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kKGNvbnRyb2xFbCk7CgogICAgICAgICAgICAkKGZpZWxkRWwpLmFwcGVuZCgiPGRpdiBzdHlsZT0nY2xlYXI6Ym90aDsnPjwvZGl2PiIpOwogICAgICAgIH0KICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRhaW5lciJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBjb250YWluZXJFbCA9IHRoaXMuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImZvcm0taG9yaXpvbnRhbCIpOwogICAgICAgIH0KICAgIH07CiAgICBjYWxsYmFja3NbImZvcm0iXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZm9ybUVsID0gdGhpcy5nZXRGb3JtRWwoKTsKCiAgICAgICAgLy8gdXNlIHB1bGwtcmlnaHQgZm9yIGZvcm0gYnV0dG9ucwogICAgICAgIC8vJChmb3JtRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b25zLWNvbnRhaW5lciIpLmFkZENsYXNzKCJwdWxsLXJpZ2h0Iik7CiAgICB9OwogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgICAgICAkKGJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgICAgICAkKGJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbGxhcHNpYmxlIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKICAgICAgICB2YXIgbGVnZW5kRWwgPSAkKGZpZWxkRWwpLmZpbmQoImxlZ2VuZCIpLmZpcnN0KCk7CiAgICAgICAgdmFyIGFuY2hvckVsID0gJCgiW2RhdGEtdG9nZ2xlPSdjb2xsYXBzZSddIiwgbGVnZW5kRWwpOwogICAgICAgIGlmICgkKGFuY2hvckVsKS5sZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICAgICAgLy8gY29udGFpbmVyIGlkCiAgICAgICAgICAgIHZhciBpZCA9ICQoY29udGFpbmVyRWwpLmF0dHIoImlkIik7CiAgICAgICAgICAgIGlmICghaWQpIHsKICAgICAgICAgICAgICAgIGlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmF0dHIoImlkIiwgaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgdXAgY29udGFpbmVyIHRvIGJlIGNvbGxhcHNpYmxlCiAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmFkZENsYXNzKCJjb2xsYXBzZSIpOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb2xsYXBzZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoY29udGFpbmVyRWwpLmFkZENsYXNzKCJpbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgdXAgbGVnZW5kIGFuY2hvcgogICAgICAgICAgICBpZiAoISQoYW5jaG9yRWwpLmF0dHIoImRhdGEtdGFyZ2V0IikpIHsKICAgICAgICAgICAgICAgICQoYW5jaG9yRWwpLmF0dHIoImRhdGEtdGFyZ2V0IiwgIiMiICsgaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKGFuY2hvckVsKS5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoImN1cnNvciIsICJwb2ludGVyIik7CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfTsKCiAgICAvLyB0YWJsZS1jb250cm9sIGNhbGxiYWNrcwogICAgY2FsbGJhY2tzWyJ0YWJsZUhlYWRlclJlcXVpcmVkIl0gPSBmdW5jdGlvbihzY2hlbWEsIG9wdGlvbnMsIGRvbUVsKQogICAgewogICAgICAgIC8vIHJlcXVpcmVkIGZpZWxkcyBnZXQgYSBsaXR0bGUgc3RhciBpbiB0aGVpciBsYWJlbAogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8oZG9tRWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyT3B0aW9uYWwiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInR5cGUiOiAiZGlzcGxheSIsCiAgICAgICAgInVpIjogImJvb3RzdHJhcCIsCiAgICAgICAgInRpdGxlIjogIkRpc3BsYXkgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAidGVtcGxhdGVzIjoge30KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZGlzcGxheS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZWRpdCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiZWRpdCIsCiAgICAgICAgInVpIjogImJvb3RzdHJhcCIsCiAgICAgICAgInRpdGxlIjogIkVkaXQgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAidGVtcGxhdGVzIjoge30KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtZWRpdC1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJib290c3RyYXAtY3JlYXRlIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAidGl0bGUiOiAiQ3JlYXRlIFZpZXcgZm9yIEJvb3RzdHJhcCAzIiwKICAgICAgICAidHlwZSI6ICJjcmVhdGUiLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJib290c3RyYXAtY3JlYXRlIiwKICAgICAgICAiaG9yaXpvbnRhbCI6IHRydWUKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCiAgICAgICAgCiAgICAgICAgICAgIEFscGFjYS5kZWZhdWx0VmlldyA9ICdib290c3RyYXAnOwogICAgICAgIAogICAgICAgIHJldHVybiBBbHBhY2E7CgogICAgCgp9KSk7Cg==</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigndmFsJywgJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCQkJZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CQkJCgkJfSwgMjAwMCk7Cgl9CgkKCWNhcnJlZ2FDdXN0b21Qcm9wcyhhY3RpdmVRdWV1ZSk7Cn07CgoKdmFyIHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYyA9IGZ1bmN0aW9uKGZvcm0pIHsKCWZvcm1PcHRpb25zID0gZm9ybS5vcHRpb25zLmZpZWxkczsKCWZvcm1BbHBhY2EgPSBmb3JtOwoJCglpZiAoZm9ybSkgewoJCSQoJy5zZWxlY3RwaWNrZXInKS5zZWxlY3RwaWNrZXIoKTsKCQkvLyQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.2</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.2">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-20 18:41:56</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAoJCQkJICAidHlwZSI6IHsKICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAiZW51bSI6IFsKICAgICAgT1RSU190eXBlX3ZhbHVlcwogICAgXSwKICAgICJyZXF1aXJlZCI6ICJ0cnVlIgogIH0KICBDRl9TQ0hFTUEKICAsCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKCSJhdHRhY2htZW50IjogewogICAgInR5cGUiOiAic3RyaW5nIiwKCSJmb3JtYXQiOiAidXJpIgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmQiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTG9jYWw6IgogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJOb21lOiIKICAgIAogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAiZW1haWwiLAogICAgImxhYmVsIjogIkUtbWFpbDoiLAoJImhlbHBlciI6ICJBYnJpbmRvIGNvbSBzZXUgZS1tYWlsIGluc3RpdHVjaW9uYWwsIHNldSBhdGVuZGltZW50byBzZXLDoSBtYWlzIHLDoXBpZG8iCiAgICAKICB9LAkJCQkJCQkJCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiVGVsZWZvbmU6IiwKICAgICJjb250cm9sX3dpZHRoIjogMTAwCiAgfSwKICAidHlwZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwKICAgICJsYWJlbCI6ICJNb3Rpdm86IiwKICAgICJvcHRpb25MYWJlbHMiOiBbCiAgICAgIE9UUlNfdHlwZV9sYWJlbHMKICAgIF0KICB9LAogICJzZXJ2aWNlIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KICBDRl9GT1JNLAogICJzdWJqZWN0IjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiQXNzdW50bzoiLAogICAgInNpemUiOiA4MAogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAiY2tlZGl0b3IiLAogICAgImxhYmVsIjogIkRlc2NyacOnw6NvOiIsCiAgICAiY29scyI6IDgwLAoJImNrZWRpdG9yIjogewoJCSJ0b29sYmFyIjogWwogICAgICAgICAgICBbIkZvbnQiLCAiRm9udFNpemUiLCAiLSIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiLSIsICJOdW1iZXJlZExpc3QiLCAiQnVsbGV0ZWRMaXN0IiwgIi0iLCAiUGFzdGUiXSwKICAgICAgICAJWyJJbWFnZSIsICJUYWJsZSIsICItIiwgIkxpbmsiXQogICAgCV0KCX0KICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTG9jYWw6IgogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJOb21lOiIKICAgIAogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAiZW1haWwiLAogICAgImxhYmVsIjogIkUtbWFpbDoiLAoJImhlbHBlciI6ICJBYnJpbmRvIGNvbSBzZXUgZS1tYWlsIGluc3RpdHVjaW9uYWwsIHNldSBhdGVuZGltZW50byBzZXLDoSBtYWlzIHLDoXBpZG8iCiAgICAKICB9LAkJCQkJCQkJCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiVGVsZWZvbmU6IiwKICAgICJjb250cm9sX3dpZHRoIjogMTAwCiAgfSwKICAidHlwZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwKICAgICJsYWJlbCI6ICJNb3Rpdm86IiwKICAgICJvcHRpb25MYWJlbHMiOiBbCiAgICAgIE9UUlNfdHlwZV9sYWJlbHMKICAgIF0KICB9LAogICJzZXJ2aWNlIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KICBDRl9GT1JNLAogICJzdWJqZWN0IjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiQXNzdW50bzoiLAogICAgInNpemUiOiA4MAogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAiY2tlZGl0b3IiLAogICAgImxhYmVsIjogIkRlc2NyacOnw6NvOiIsCiAgICAiY29scyI6IDgwLAoJImNrZWRpdG9yIjogewoJCSJ0b29sYmFyIjogWwogICAgICAgICAgICBbIkZvbnQiLCAiRm9udFNpemUiLCAiLSIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiLSIsICJOdW1iZXJlZExpc3QiLCAiQnVsbGV0ZWRMaXN0IiwgIi0iLCAiUGFzdGUiXSwKICAgICAgICAJWyJJbWFnZSIsICJUYWJsZSIsICItIiwgIkxpbmsiXQogICAgCV0KCX0KICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPVVwbG9hZEZpbGUiLAogICAgICAiYXV0b1VwbG9hZCIgOiB0cnVlLAogICAgICAibWV0aG9kIjogInBvc3QiCiAgCX0sCiAgCSJsYWJlbCI6ICJBbmV4bzoiLAogIAkiaGVscGVyIjogIkFuZXhlIHVtIGFycXVpdm8gc2UgbmVjZXNzw6FyaW8uIgogIH0sCQogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfSwgIAogICJGb3JtSUQiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfSwKICAiU3ViYWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjU2hvd1F1ZXVlIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPldoZW4gZmFsc2UsIGZvcmNlcyB0aGUgcXVldWUgdG8gYmUgcHJlLXNlbGVjdGVkLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZz4wPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNDdXN0b21UZW1wbGF0ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b20gdGVtcGxhdGUgc3VmZml4IGZvciBoZWFkZXIgYW5kIGZvb3Rlci48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+PC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgkgIDxDb25maWdJdGVtIE5hbWU9IlB1YmxpY0Zyb250ZW5kOjpNb2R1bGUjIyNQaWN0dXJlVXBsb2FkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5QaWN0dXJlIHVwbG9hZCBtb2R1bGU8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlBpY3R1cmUtVXBsb2FkPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgkKCQkJCQo8L290cnNfY29uZmlnPg==</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VzUGFuZWwiKSAlXQo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC13YXJuaW5nIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24td2FybmluZy1zaWduIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPiA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzIikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KICAJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPG9sIj4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQk8Zm9ybT4KCQkJPHNwYW4+CgkJICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOgogICAgICAgICAJPC9zcGFuPgoJCQk8c3BhbiBpZD0ic2VydmljZURJViI+CQogICAgICAgICAJCVslIERhdGEuU2VydmljZVN0cmcgJV0gICAgICAKICAgICAgICAgCTwvc3Bhbj4gICAgICAgICAgICAgIAoJCTwvZm9ybT4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9IiI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSIpIHwgaHRtbCAlXTwvQT4KWyUgUmVuZGVyQmxvY2tFbmQoIlVuYXV0aGVudGljYXRlZE1lc3NhZ2UiKSAlXQkJCQoJPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiIGlkPSJmb3JtUGFuZWwiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlBsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0IikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5IiBpZD0iZm9ybVRpY2tldCI+CgkKCTwvZGl2Pgo8L2Rpdj4KIAogPHNjcmlwdCBzcmM9IlslIENvbmZpZygiRnJvbnRlbmQ6OlJpY2hUZXh0UGF0aCIpICVdY2tlZGl0b3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkvLyBUbyB0dXJuIG9uIGRlYnVnZ2luZywgdW5jb21tZW50IHRoaXMgbGluZQoJLy9BbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuREVCVUc7CgkvL0FscGFjYS51cGxvYWRJbWFnZVVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJLy9BbHBhY2EuZmlsZWJyb3dzZXJJbWFnZVVwbG9hZFVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCgkkLmFscGFjYS5zZXREZWZhdWx0TG9jYWxlKCJwdF9CUiIpOwoJCQkKCSQuYWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewoJCSJub25lTGFiZWwiOiAiLSIsCgl9KTsKCQoJJCgiI1NlcnZpY2VJRCIpLmNoYW5nZShmdW5jdGlvbigpIHsKCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CgkgICAJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsKICAgCQl9IGVsc2UgewogICAJCQlkZXN0cnVpckZvcm0oKTsKICAgCQkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoIiIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuaGlkZSgpOwogICAJCX0gIAkKICAJfSk7CiAgCQogICAJaWYgKCQoIiNTZXJ2aWNlSUQiKS5oYXMoJ1tzZWxlY3RlZF0nKSkgewogIAkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewogIAkJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iKTsKICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOyAgCQkJICAJCQkKICAJCX0KICAJfQo8L3NjcmlwdD4gICAgClslIEVORCAlXQ==</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgZGF0YS13aWR0aD1cImF1dG9cIiBpZD1cIlNlcnZpY2VJRFwiIGNsYXNzPVwic2VsZWN0cGlja2VyXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIj5cbjxvcHRpb24gdmFsdWU9XCJcIj4tPC9vcHRpb24+IjsKCW15ICRpbk9wdCA9IDA7CgoJZm9yIG15ICRzZXJ2aWNlIChAU2VydmljZXNDb21ibykgewoJCWlmICgkc2VydmljZS0+e0Rpc2FibGVkfSkgewoJCQlpZiAoJGluT3B0KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJCQl9CgkJCSRpbk9wdCA9IDE7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGdyb3VwIGxhYmVsPSciIC4gJHNlcnZpY2UtPntWYWx1ZX0gLiAiJz5cbiI7CgkJfSBlbHNlIHsKCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8b3B0aW9uIHZhbHVlPSciIC4gJHNlcnZpY2UtPntLZXl9IC4gIic+IiAuICRTZWxmLT5MYXN0UGFydCgkc2VydmljZS0+e1ZhbHVlfSkgLiAiPC9vcHRpb24+XG4iOwoJCX0KCX0KCQoJaWYgKCRpbk9wdCkgewoJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9vcHRncm91cD5cbiI7Cgl9CgkKCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9zZWxlY3Q+XG4iOwoKCXJldHVybiAkcmV0b3JubzsKfQoKPWhlYWQKUmV0dXJucyBzZXJ2aWNlIG5hbWUgd2l0aG91dCB0aGUgcGFyZW50IHNlcnZpY2VzIG5hbWVzCj1jdXQKc3ViIExhc3RQYXJ0IHsKCW15ICRTZWxmICA9IHNoaWZ0OwoJbXkgJHF1ZXVlID0gc2hpZnQ7CglteSBAcGFydHMgPSBzcGxpdCggIjo6IiwgJHF1ZXVlICk7CglyZXR1cm4gJHBhcnRzWy0xXTsKfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgkKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIlVwbG9hZEZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJVcGxvYWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlUmVjZWl2ZSgpOwkJCgl9IGVsc2lmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIkRlbGV0ZUZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJEZWxldGUgdXBsb2FkZWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlRGVsZXRlKCk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJVbmtub3duIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAxOwoJfQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVcGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVEZWxldGUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkZmlsZU5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGaWxlbmFtZSIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZSBmaWxlICRmaWxlTmFtZSBmcm9tIGZvcm0gJGZvcm1JZCIpOwoJCglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJbXkgJGZpbGVEZWxldGVkID0gMDsKCQkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCWlmICgkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9IGVxICRmaWxlTmFtZSkgewoJCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZUlEfSk7CgkJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkZmlsZU5hbWUpOwoJCQkkZmlsZURlbGV0ZWQgPSAxOwoJCX0KCX0KCQoJaWYgKCRmaWxlRGVsZXRlZCkgewoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCQlDb250ZW50ICAgICA9PiAieyAkZmlsZU5hbWU6IHRydWV9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsJCQkKCX0gZWxzZSB7CgkJcmV0dXJuIDE7Cgl9CQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVUGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVSZWNlaXZlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoKCW15ICV0bXBGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoUGFyYW0gPT4gImF0dGFjaG1lbnRfZmlsZXMiKTsJCglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZvcm1JRCIgKTsKCglpZiAoISAkdG1wRmlsZXtGaWxlbmFtZX0gfHwgISAkZm9ybUlkKSB7CgkJbXkgJG1zZ0Vycm9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbnZhbGlkIGZpbGUhIik7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7IFwiZXJyb3JcIjogXCIkbXNnRXJyb3JcIiwgXCJmaWxlc1wiOiBbXSB9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsKCX0KCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IEFkZGluZyBmaWxlIHRvIGNhY2hlLiBGb3JtSUQ6ICIgLiAkZm9ybUlkIC4gIiBcdCBGaWxlbmFtZTogIiAuICR0bXBGaWxle0ZpbGVuYW1lfSAuICIgXHQgQ29udGVudFR5cGU6ICIgLiAkdG1wRmlsZXtDb250ZW50VHlwZX0gKTsKCQoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoKCW15ICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApID0gJFNlbGYtPkdldEZvcm0oIFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSwgU2VydmljZUZvcm0gPT4gXCVzZXJ2aWNlRm9ybSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCglyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+ICJbeyIgLiAkc2NoZW1hIC4gIn0sIHsiIC4gJGZpZWxkcyAuICJ9LCBcIiIgLiAkaW50cm9kdWN0aW9uIC4gIlwiXSIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkCkFsbG93cyB1c2luZyBhIGZpZWxkIGluIHRoZSBmb3JtIHRvIHNlbGVjdCBhIHRhcmdldCBxdWV1ZS4KSWYgYSBxdWV1ZSB3YXMgZGVmaW5lZCBpbiByZXF1ZXN0IHBhcmFtZXRlciwgdXNlcyBpdC4KSWYgdGhlcmUgaXMgYSBwcmVmaXggZGVmaW5lZCBmb3IgdGhlIHF1ZXVlcyB0byBhdXRvbWF0aWNhbGx5IGZvcndhcmQgdGlja2V0cywKYW5kIGFsc28gYSBmaWVsZCB3YXMgZGVmaW5lZCBhcyBoYW5kbGluZyB0aGUgdGFyZ2V0IHF1ZXVlLCB0cnkgdG8gbG9jYXRlIG9uZS4KCklmIG5vbmUgaXMgZm91bmQsIHVzZXMgdGhlIGRlZmF1bHQgcXVldWUuCgpGb3IgZXhhbXBsZToKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZVByZWZpeCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZUZpZWxkID0gVW5pZGFkZQoJCglBdmFpbGFibGVRdWV1ZXMgPSBQcmltZWlybyBOaXZlbCBDQ0IsIFByaW1laXJvIE5pdmVsIENDRSwgUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCgkKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NCLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NCCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDSiAobm8gcXVldWUgYnkgdGhhdCBzdWZmaXgpLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NFLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NFCj1jdXQKc3ViIEdldFF1ZXVlSUQoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CgkKCSMgQ2hlY2sgaWYgcXVldWVJRCB3YXMgc2VudAoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkKCWlmICgkUXVldWVJRCkgewoJCW15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFF1ZXVlSUQpOwoJCXJldHVybiAoJFF1ZXVleyJOYW1lIn0sICRRdWV1ZUlEKTsgCgl9CgoJIyBHZXRzIGRlZmF1bHQgUXVldWUKCW15ICRDb25maWdUaWNrZXQgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoJbXkgJENvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJCgoJbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWdUaWNrZXQtPnsiUXVldWVEZWZhdWx0In07CgoJIyBDaGVja3MgaWYgdGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHF1ZXVlCglteSAkUXVldWVQcmVmaXggPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlUHJlZml4In07CglteSAkUXVldWVGaWVsZCAgPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlRmllbGQifTsKCglteSAlUXVldWVMaXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgICAgICAgICA9PiAxICk7CglteSAlUXVldWVMaXN0ICAgPSByZXZlcnNlICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAxICk7CgkkUXVldWVJRCAgICAgPSAkUXVldWVMaXN0eyRRdWV1ZURlZmF1bHR9OwoJbXkgJFF1ZXVlICAgICAgID0gJFF1ZXVlTGlzdElEeyRRdWV1ZUlEfTsKCglpZiAoICRRdWV1ZVByZWZpeCAmJiAkUXVldWVGaWVsZCApIHsKCQlteSAkUXVldWVTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRRdWV1ZUZpZWxkICk7CgkJbXkgJFF1ZXVlTmFtZSA9ICIkUXVldWVQcmVmaXggJFF1ZXVlU2VsZWN0ZWQiOwoKCQlpZiAoICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX0gKSB7CgkJCSRRdWV1ZUlEID0gJFF1ZXVlTGlzdHskUXVldWVOYW1lfTsKCQkJJFF1ZXVlICAgPSAkUXVldWVOYW1lOwoJCX0KCX0KCQoJcmV0dXJuICggJFF1ZXVlLCAkUXVldWVJRCApOwp9Cgo9aGVhZApSZXR1cm5zIHRoZSBmb3JtIGNvZGUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkc2NoZW1hOwoJbXkgJGZpZWxkczsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBwdWJsaWMgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljKCk7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBhdXRoZW50aWNhdGVkIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9ucygpOwoJfQoJCglteSAkaW50cm9kdWN0aW9uOwoKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNWYWx1ZXMoCgkJU2NoZW1hICA9PiAkc2NoZW1hLAoJCU9wdGlvbnMgPT4gJGZpZWxkcywKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0KCSk7CgkKCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX0gKSB7CgkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQkkaW50cm9kdWN0aW9uID0gIiI7Cgl9CgllbHNlIHsKCQlteSAlc2VydmljZUZvcm0gPSAleyAkUGFyYW17U2VydmljZUZvcm19IH07CgkJJGludHJvZHVjdGlvbiA9ICRzZXJ2aWNlRm9ybXtJbnRyb2R1Y3Rpb259OwoKCQlpZiAoICEkUGFyYW17U2VydmljZUZvcm19e1NjaGVtYX0gKSB7CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCX0KCQllbHNlIHsKCQkJbXkgJHNjaGVtYUZvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJbXkgJGZpZWxkc0Zvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17Rm9ybX07CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvJHNjaGVtYUZvcm0vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vJGZpZWxkc0Zvcm0vZzsKCQl9CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQoJaWYgKCRQYXJhbXsiUXVldWVJRCJ9KSB7CQkJCgkJJHNjaGVtYSA9ICRzY2hlbWEgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcInN0cmluZ1wiLFxuXCJkZWZhdWx0XCI6IFwiIiAuICRQYXJhbXsiUXVldWVJRCJ9IC4gIlwifSI7CgkJJGZpZWxkcyA9ICRmaWVsZHMgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcImhpZGRlblwiXG59IjsKCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICk7Cn0KCj1oZWFkCklmIHNvbWUgZmllbGRzIGhhdmUgZml4ZWQgdmFsdWVzIGluIHNlcnZpY2UgZGVmaW5pdGlvbiwgc2V0cyB0aGVtCj1jdXQKc3ViIEFkanVzdEZpeGVkRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hID0gJFBhcmFte1NjaGVtYX07CglteSAkZm9ybSA9ICRQYXJhbXtGaWVsZHN9OwoJbXkgJGZpeGVkVmFsdWVzID0gJFBhcmFte0ZpeGVkVmFsdWVzfTsKCQoJbXkgQHZhbHVlcyA9IHNwbGl0KC9cbi8sICRmaXhlZFZhbHVlcyk7CgkKCWZvciBteSAkdmFsdWUgKEB2YWx1ZXMpIHsKCgkJJHZhbHVlID1+IHMvXHIvL2c7CgkJbXkgQGRhdGEgPSBzcGxpdCgnPScsICR2YWx1ZSk7CgkJCQkJCgkJbXkgJGZpZWxkS2V5ID0gJGRhdGFbMF07CgkJbXkgJGZpeGVkVmFsdWUgPSAkZGF0YVsxXTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoJCQoJCSRzY2hlbWEgPX4gcy8ka2V5LyRyZXBsYWNlLzsKCQkKCQkka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIjogeyJ0eXBlIjogImhpZGRlbiInIC4gIlxufSI7CgkJJGZvcm0gPX4gcy8ka2V5LyRyZXBsYWNlLzsKCX0JCQoJCglyZXR1cm4gKCRzY2hlbWEsICRmb3JtKTsJCn0KCj1oZWFkCkNyZWF0ZXMgYSBuZXcgdGlja2V0LCBnaXZlbiB0aGUgaW5wdXQgZGF0YSBhbmQgc2VudCBhdHRhY2htZW50cy9pbWFnZXMKPWN1dApzdWIgQ3JlYXRlVGlja2V0IHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJE1haW50ZW5hbmNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06Ok1haW50ZW5hbmNlIik7CglteSAkRGF0ZVV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkRhdGVVdGlscyIpOwoKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe0F1dGhlbnRpY2F0ZVVSTH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpDQVM6OkNBU1VybCcpCgkJCSAgLiAiL2xvZ2luP3NlcnZpY2U9IgoJCQkgIC4gImh0dHBzOi8vIgoJCQkgIC4gJEVOVntTRVJWRVJfTkFNRX0KCQkJICAuICRFTlZ7U0NSSVBUX05BTUV9CgkJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiOwoJfQoJCgkjIENoZWNrIGlmIHF1ZXVlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIikpIHsJCQoJCSREYXRhe1F1ZXVlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCSRTZWxmLT5EZWJ1ZygiU3BlY2lmaWMgcXVldWUgZGVmaW5lZCA9PiAiIC4gJERhdGF7UXVldWVJRH0pOwoJfSBlbHNlIHsKCQkgIyBDaGVjayBpZiBtdXN0IHNob3cgcXVldWUgLSBpZiBzbywgcmVkaXJlY3QgdXNlcgogICAgICAgIG15ICRfQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CiAgICAgICAgbXkgJF9TaG93UXVldWUgICAgICAgICAgPSAkX0NvbmZpZ1RpY2tldFdpemFyZC0+eyJTaG93UXVldWUifTsKICAgICAgICBpZiAoISAkX1Nob3dRdWV1ZSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIlF1ZXVlIHNlbGVjdGlvbiBtdXN0IGJlIHNob3duIC0gcmVkaXJlY3Rpb24gdG8gUXVldWVQYW5lbFB1YmxpYyBhY3Rpb24iKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPVF1ZXVlc1BhbmVsUHVibGljIiApOwogICAgICAgIH0JCQoJfQoJCglteSAoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPkdldEZvcm0oUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCQoJJERhdGF7U2NoZW1hRm9ybX0gPSAkc2NoZW1hOwoJJERhdGF7RmllbGRzRm9ybX0gPSAkZmllbGRzOwoKCSMgQ29tbW9uIGluZm8KCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJbXkgJG1zZ0Nob29zZVNlcnZpY2U7CQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMifTsKCX0gZWxzZSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2UifTsKCX0KCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSApIHsKCQlteSAlcXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSk7CgkJbXkgJHF1ZXVlTmFtZSA9ICRxdWV1ZURhdGF7TmFtZX07CQkKCQkkbXNnQ2hvb3NlU2VydmljZSA9fiBzL1BMQUNFXF9OQU1FLyRxdWV1ZU5hbWUvZzsKCX0KCSREYXRhe01zZ0Nob29zZVNlcnZpY2V9ID0gJG1zZ0Nob29zZVNlcnZpY2U7CQoJCgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCQoKCSMgQnVpbGQgc2VydmljZSBjaG9vc2VyCgkkRGF0YXtTZXJ2aWNlU3RyZ30gPSAkVGlja2V0V2l6YXJkLT5CdWlsZFNlcnZpY2VzKFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApKTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnVxaXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwogICAgCSQoIltuYW1lPSdzdWJtaXQnXSIpLmNzcygiZm9udC1zaXplIiwgIjE4cHgiKTsKICAgIAkJCQoJCWZvcm0uZm9ybS5yZWdpc3RlclN1Ym1pdEhhbmRsZXIoZnVuY3Rpb24oZSwgZm9ybSkgewogICAgICAgIAkvLyB2YWxpZGF0ZSB0aGUgZW50aXJlIGZvcm0gKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnZhbGlkYXRlKHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZHJhdyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0ucmVuZGVyVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyBub3cgZGlzcGxheSBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGZvcm0uaXNGb3JtVmFsaWQoKSkgewogICAgICAgICAgICAJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7CgkJCQlhbGVydCgiRGFkb3MgaW52w6FsaWRvcyEiKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAJfSk7CgkJCgkJCgkJLy8gRml4IENLRWRpdG9yCgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJZm9yKHZhciBpIGluIENLRURJVE9SLmluc3RhbmNlcykgewoJCQkJdmFyIGVkaXRvciA9IENLRURJVE9SLmluc3RhbmNlc1tpXTsKCQkgICAgICAgIGlmIChlZGl0b3IpIHsKCQkgICAgICAgICAgICAvLyBDYWxsIHNob3dUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgZ2V0IHRoZSBmb2N1cwoJCSAgICAgICAgICAgIGVkaXRvci5vbignZm9jdXMnLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgc2hvd1Rvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoKCQkgICAgICAgICAgICAvLyBDYWxsIGhpZGVUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgbG9zZXMgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGV2ZW50KSB7CgkJICAgICAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KGV2ZW50KTsKCQkgICAgICAgICAgICB9KTsKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAvL1doZW5ldmVyIENLRWRpdG9yIGdldCBmb2N1cy4gV2Ugd2lsbCBzaG93IHRoZSB0b29sYmFyIHNwYW4uCgkJICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1Rvb2xCYXJEaXYoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5zaG93KCk7CgkJICAgICAgICAgICAgfQoKCQkgICAgICAgICAgICBmdW5jdGlvbiBoaWRlVG9vbEJhckRpdihldmVudCkgeyAgICAgICAgICAgICAgICAgICAgCgkJICAgICAgICAgICAgICAgIC8vJ2V2ZW50LmVkaXRvci5pZCcgcmV0dXJucyB0aGUgaWQgb2YgdGhlIHNwYW5zIHVzZWQgaW4gY2tlZGl0ci4KCQkgICAgICAgICAgICAgICAgJCgnIycrZXZlbnQuZWRpdG9yLmlkKydfdG9wJykuaGlkZSgpCgkJICAgICAgICAgICAgfQoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KHsgZWRpdG9yOiBlZGl0b3J9KTsKCgkJICAgICAgICAgICAKCQkgICAgICAgIH0KCQkJfQkJCQoJCX0sIDIwMDApOwoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHMoYWN0aXZlUXVldWUpOwp9OwoKCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2tQdWJsaWMgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwkJCiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCSAgICAgICAgaWYgKGVkaXRvcikgewoJCSAgICAgICAgICAgIC8vIENhbGwgc2hvd1Rvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBnZXQgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdmb2N1cycsIGZ1bmN0aW9uIChldmVudCkgewoJCSAgICAgICAgICAgICAgICBzaG93VG9vbEJhckRpdihldmVudCk7CgkJICAgICAgICAgICAgfSk7CgoJCSAgICAgICAgICAgIC8vIENhbGwgaGlkZVRvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBsb3NlcyB0aGUgZm9jdXMKCQkgICAgICAgICAgICBlZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIC8vV2hlbmV2ZXIgQ0tFZGl0b3IgZ2V0IGZvY3VzLiBXZSB3aWxsIHNob3cgdGhlIHRvb2xiYXIgc3Bhbi4KCQkgICAgICAgICAgICBmdW5jdGlvbiBzaG93VG9vbEJhckRpdihldmVudCkgewoJCSAgICAgICAgICAgICAgICAvLydldmVudC5lZGl0b3IuaWQnIHJldHVybnMgdGhlIGlkIG9mIHRoZSBzcGFucyB1c2VkIGluIGNrZWRpdHIuCgkJICAgICAgICAgICAgICAgICQoJyMnK2V2ZW50LmVkaXRvci5pZCsnX3RvcCcpLnNob3coKTsKCQkgICAgICAgICAgICB9CgoJCSAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVUb29sQmFyRGl2KGV2ZW50KSB7ICAgICAgICAgICAgICAgICAgICAKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5oaWRlKCkKCQkgICAgICAgICAgICB9CgkJICAgICAgICAgICAgCgkJICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoeyBlZGl0b3I6IGVkaXRvcn0pOwkJICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgIH0KCQkgICAgICAgIAoJCSAgICAgICAgZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CgkJCgkJfSwgMjAwMCk7CQkKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzUHVibGljKGFjdGl2ZVF1ZXVlKTsKfTsKCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wc1B1YmxpYyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQoJCgl2YXIgdXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljO1N1YmFjdGlvbj1HZXRGb3JtQ3VzdG9tUHJvcHMiICsgcXVldWU7CgkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldFNjcmlwdCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIGFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhQ3VzdG9tUHJvcHMocXVldWUpIHsKCWlmICghIHF1ZXVlKSB7CgkJcXVldWUgPSAiIjsKCX0JCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KICAgIApmdW5jdGlvbiBjYXJyZWdhRm9ybShkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsJCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9IAoJCglhY3RpdmVRdWV1ZSA9IHF1ZXVlOwkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9CgkKCWFjdGl2ZVF1ZXVlID0gcXVldWU7CQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0SlNPTih1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKGRhdGFbMl0pOwoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5zaG93KCk7CgkJCgkJdmFyIGZvcm0gPSAkKCIjZm9ybVRpY2tldCIpLmFscGFjYSh7CiAgICAgICAJCSJkYXRhIjogZGF0YUZvcm0sCiAgICAgICAgCSJzY2hlbWEiOiBidWlsZFNjaGVtYShkYXRhWzBdKSwKICAgICAgICAJIm9wdGlvbnMiOiBidWlsZE9wdGlvbnMoZGF0YVsxXSwgc2VuZFRleHQsIGFjdGlvbiksCQkJCiAgICAgICAgCSJwb3N0UmVuZGVyIjogcG9zdFJlbmRlckNhbGxiYWNrUHVibGljLAoJCQkidmlldyI6ICJib290c3RyYXAtY3JlYXRlIiwKCQkJInVpIjogImJvb3RzdHJhcC11aSIKICAgIAl9KTsgCgkJCgkJCiAgICAJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KCJFcnJvIGFvIHJlY3VwZXJhcjogIiArIHVybCArICIgPT4gIiArIHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBkZXN0cnVpckZvcm0oKSB7CgkkKCIjZm9ybVRpY2tldCIpLmFscGFjYSgpLmRlc3Ryb3koKTsKfQoK</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.3</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.3">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-20 19:16:54</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiAidHJ1ZSIKICB9LAoJCQkJICAidHlwZSI6IHsKICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAiZW51bSI6IFsKICAgICAgT1RSU190eXBlX3ZhbHVlcwogICAgXSwKICAgICJyZXF1aXJlZCI6ICJ0cnVlIgogIH0KICBDRl9TQ0hFTUEKICAsCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogInRydWUiCiAgfSwKCSJhdHRhY2htZW50IjogewogICAgInR5cGUiOiAic3RyaW5nIiwKCSJmb3JtYXQiOiAidXJpIgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmQiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTG9jYWw6IgogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJOb21lOiIKICAgIAogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAiZW1haWwiLAogICAgImxhYmVsIjogIkUtbWFpbDoiLAoJImhlbHBlciI6ICJBYnJpbmRvIGNvbSBzZXUgZS1tYWlsIGluc3RpdHVjaW9uYWwsIHNldSBhdGVuZGltZW50byBzZXLDoSBtYWlzIHLDoXBpZG8iCiAgICAKICB9LAkJCQkJCQkJCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiVGVsZWZvbmU6IiwKICAgICJjb250cm9sX3dpZHRoIjogMTAwCiAgfSwKICAidHlwZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwKICAgICJsYWJlbCI6ICJNb3Rpdm86IiwKICAgICJvcHRpb25MYWJlbHMiOiBbCiAgICAgIE9UUlNfdHlwZV9sYWJlbHMKICAgIF0KICB9LAogICJzZXJ2aWNlIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KICBDRl9GT1JNLAogICJzdWJqZWN0IjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiQXNzdW50bzoiLAogICAgInNpemUiOiA4MAogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAiY2tlZGl0b3IiLAogICAgImxhYmVsIjogIkRlc2NyacOnw6NvOiIsCiAgICAiY29scyI6IDgwLAoJImNrZWRpdG9yIjogewoJCSJ0b29sYmFyIjogWwogICAgICAgICAgICBbIkZvbnQiLCAiRm9udFNpemUiLCAiLSIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiLSIsICJOdW1iZXJlZExpc3QiLCAiQnVsbGV0ZWRMaXN0IiwgIi0iLCAiUGFzdGUiXSwKICAgICAgICAJWyJJbWFnZSIsICJUYWJsZSIsICItIiwgIkxpbmsiXQogICAgCV0KCX0KICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiTG9jYWw6IgogIH0sCiAgIm5hbWUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJOb21lOiIKICAgIAogIH0sCiAgImVtYWlsIjogewogICAgInR5cGUiOiAiZW1haWwiLAogICAgImxhYmVsIjogIkUtbWFpbDoiLAoJImhlbHBlciI6ICJBYnJpbmRvIGNvbSBzZXUgZS1tYWlsIGluc3RpdHVjaW9uYWwsIHNldSBhdGVuZGltZW50byBzZXLDoSBtYWlzIHLDoXBpZG8iCiAgICAKICB9LAkJCQkJCQkJCiAgIkRGX3RlbGVmb25lIjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiVGVsZWZvbmU6IiwKICAgICJjb250cm9sX3dpZHRoIjogMTAwCiAgfSwKICAidHlwZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwKICAgICJsYWJlbCI6ICJNb3Rpdm86IiwKICAgICJvcHRpb25MYWJlbHMiOiBbCiAgICAgIE9UUlNfdHlwZV9sYWJlbHMKICAgIF0KICB9LAogICJzZXJ2aWNlIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KICBDRl9GT1JNLAogICJzdWJqZWN0IjogewogICAgInR5cGUiOiAidGV4dCIsCiAgICAibGFiZWwiOiAiQXNzdW50bzoiLAogICAgInNpemUiOiA4MAogIH0sCiAgImRlc2NyaXB0aW9uIjogewogICAgInR5cGUiOiAiY2tlZGl0b3IiLAogICAgImxhYmVsIjogIkRlc2NyacOnw6NvOiIsCiAgICAiY29scyI6IDgwLAoJImNrZWRpdG9yIjogewoJCSJ0b29sYmFyIjogWwogICAgICAgICAgICBbIkZvbnQiLCAiRm9udFNpemUiLCAiLSIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiLSIsICJOdW1iZXJlZExpc3QiLCAiQnVsbGV0ZWRMaXN0IiwgIi0iLCAiUGFzdGUiXSwKICAgICAgICAJWyJJbWFnZSIsICJUYWJsZSIsICItIiwgIkxpbmsiXQogICAgCV0KCX0KICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPVVwbG9hZEZpbGUiLAogICAgICAiYXV0b1VwbG9hZCIgOiB0cnVlLAogICAgICAibWV0aG9kIjogInBvc3QiCiAgCX0sCiAgCSJsYWJlbCI6ICJBbmV4bzoiLAogIAkiaGVscGVyIjogIkFuZXhlIHVtIGFycXVpdm8gc2UgbmVjZXNzw6FyaW8uIgogIH0sCQogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfSwgIAogICJGb3JtSUQiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfSwKICAiU3ViYWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjU2hvd1F1ZXVlIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPldoZW4gZmFsc2UsIGZvcmNlcyB0aGUgcXVldWUgdG8gYmUgcHJlLXNlbGVjdGVkLjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZz4wPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNDdXN0b21UZW1wbGF0ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b20gdGVtcGxhdGUgc3VmZml4IGZvciBoZWFkZXIgYW5kIGZvb3Rlci48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+PC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgkgIDxDb25maWdJdGVtIE5hbWU9IlB1YmxpY0Zyb250ZW5kOjpNb2R1bGUjIyNQaWN0dXJlVXBsb2FkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5QaWN0dXJlIHVwbG9hZCBtb2R1bGU8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlBpY3R1cmUtVXBsb2FkPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgkKCQkJCQo8L290cnNfY29uZmlnPg==</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VzUGFuZWwiKSAlXQo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC13YXJuaW5nIj4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24td2FybmluZy1zaWduIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPiA8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzIikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KICAJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPG9sIj4KCQkJWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFpbnRlbmFuY2VMaW5lIikgJV0KCQkJPGxpPlslIERhdGEuTWVzc2FnZSAlXSAoWyUgVHJhbnNsYXRlKCJTdGFydGVkIGF0OiAiKSB8IGh0bWwgJV0gWyUgRGF0YS5TdGFydERhdGUgJV0pPC9saT4KCQkJWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJPC9vbD4KICAJPC9kaXY+CiAgCQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLXByaW1hcnkiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBEYXRhLk1zZ0Nob29zZVNlcnZpY2UgJV08L3N0cm9uZz4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5Ij4KCQk8Zm9ybT4KCQkJPHNwYW4+CgkJICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOgogICAgICAgICAJPC9zcGFuPgoJCQk8c3BhbiBpZD0ic2VydmljZURJViI+CQogICAgICAgICAJCVslIERhdGEuU2VydmljZVN0cmcgJV0gICAgICAKICAgICAgICAgCTwvc3Bhbj4gICAgICAgICAgICAgIAoJCTwvZm9ybT4KCTwvZGl2PgoJCgk8ZGl2IGNsYXNzPSJwYW5lbC1mb290ZXIiIGlkPSJzZXJ2aWNlRGVzY3JpcHRpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlIikgJV0JCgkJCVslIFRyYW5zbGF0ZSgiRGlkIHlvdSBrbm93IHRoYXQsIGlmIHlvdSBoYXZlIGEgbG9naW4sIHlvdSBjYW4gYXV0aGVudGljYXRlIGZpcnN0IGFuZCBkbyBub3QgaGF2ZSB0byBwcm92aWRlIHlvdXIgbmFtZSBhbmQgZS1tYWlsLiBBbHNvLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIG1vbml0b3IgeW91ciB0aWNrZXQgbGF0ZXIuIikgfCBodG1sICVdOgoJCQk8QSB0YXJnZXQ9Il9uZXciIEhSRUY9IiI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSIpIHwgaHRtbCAlXTwvQT4KWyUgUmVuZGVyQmxvY2tFbmQoIlVuYXV0aGVudGljYXRlZE1lc3NhZ2UiKSAlXQkJCQoJPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiIGlkPSJmb3JtUGFuZWwiPgoJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+CgkJPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlBsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0IikgfCBodG1sICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCgk8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5IiBpZD0iZm9ybVRpY2tldCI+CgkKCTwvZGl2Pgo8L2Rpdj4KIAogPHNjcmlwdCBzcmM9IlslIENvbmZpZygiRnJvbnRlbmQ6OlJpY2hUZXh0UGF0aCIpICVdY2tlZGl0b3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkvLyBUbyB0dXJuIG9uIGRlYnVnZ2luZywgdW5jb21tZW50IHRoaXMgbGluZQoJLy9BbHBhY2EubG9nTGV2ZWwgPSBBbHBhY2EuREVCVUc7CgkvL0FscGFjYS51cGxvYWRJbWFnZVVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJLy9BbHBhY2EuZmlsZWJyb3dzZXJJbWFnZVVwbG9hZFVSTCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJQ0tFRElUT1IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZyZXNwb25zZVR5cGU9anNvbiZGb3JtSUQ9WyUgRGF0YS5Gb3JtSUQgJV0iOwoJCgkkLmFscGFjYS5zZXREZWZhdWx0TG9jYWxlKCJwdF9CUiIpOwoJCQkKCSQuYWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewoJCSJub25lTGFiZWwiOiAiLSIsCgl9KTsKCQoJJCgiI1NlcnZpY2VJRCIpLmNoYW5nZShmdW5jdGlvbigpIHsKCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CgkgICAJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsKICAgCQl9IGVsc2UgewogICAJCQlkZXN0cnVpckZvcm0oKTsKICAgCQkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoIiIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuaGlkZSgpOwogICAJCX0gIAkKICAJfSk7CiAgCQogICAJaWYgKCQoIiNTZXJ2aWNlSUQiKS5oYXMoJ1tzZWxlY3RlZF0nKSkgewogIAkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewogIAkJCWNhcnJlZ2FGb3JtWyUgRGF0YS5QdWJsaWNNb2RlICVdKHsiRm9ybUlEIjogIlslIERhdGEuRm9ybUlEICVdIn0sICJbJSBUcmFuc2xhdGUoIlNlbmQiKSB8IGh0bWwgJV0iLCAiWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIsICI7UXVldWVJRD1bJSBEYXRhLlF1ZXVlSUQgJV0iKTsKICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOyAgCQkJICAJCQkKICAJCX0KICAJfQo8L3NjcmlwdD4gICAgClslIEVORCAlXQ==</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgZGF0YS13aWR0aD1cImF1dG9cIiBpZD1cIlNlcnZpY2VJRFwiIGNsYXNzPVwic2VsZWN0cGlja2VyXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIj5cbjxvcHRpb24gdmFsdWU9XCJcIj4tPC9vcHRpb24+IjsKCW15ICRpbk9wdCA9IDA7CgoJZm9yIG15ICRzZXJ2aWNlIChAU2VydmljZXNDb21ibykgewoJCWlmICgkc2VydmljZS0+e0Rpc2FibGVkfSkgewoJCQlpZiAoJGluT3B0KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJCQl9CgkJCSRpbk9wdCA9IDE7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGdyb3VwIGxhYmVsPSciIC4gJHNlcnZpY2UtPntWYWx1ZX0gLiAiJz5cbiI7CgkJfSBlbHNlIHsKCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8b3B0aW9uIHZhbHVlPSciIC4gJHNlcnZpY2UtPntLZXl9IC4gIic+IiAuICRTZWxmLT5MYXN0UGFydCgkc2VydmljZS0+e1ZhbHVlfSkgLiAiPC9vcHRpb24+XG4iOwoJCX0KCX0KCQoJaWYgKCRpbk9wdCkgewoJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9vcHRncm91cD5cbiI7Cgl9CgkKCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9zZWxlY3Q+XG4iOwoKCXJldHVybiAkcmV0b3JubzsKfQoKPWhlYWQKUmV0dXJucyBzZXJ2aWNlIG5hbWUgd2l0aG91dCB0aGUgcGFyZW50IHNlcnZpY2VzIG5hbWVzCj1jdXQKc3ViIExhc3RQYXJ0IHsKCW15ICRTZWxmICA9IHNoaWZ0OwoJbXkgJHF1ZXVlID0gc2hpZnQ7CglteSBAcGFydHMgPSBzcGxpdCggIjo6IiwgJHF1ZXVlICk7CglyZXR1cm4gJHBhcnRzWy0xXTsKfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgkKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIlVwbG9hZEZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJVcGxvYWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlUmVjZWl2ZSgpOwkJCgl9IGVsc2lmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIkRlbGV0ZUZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJEZWxldGUgdXBsb2FkZWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlRGVsZXRlKCk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJVbmtub3duIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAxOwoJfQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVcGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVEZWxldGUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkZmlsZU5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGaWxlbmFtZSIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZSBmaWxlICRmaWxlTmFtZSBmcm9tIGZvcm0gJGZvcm1JZCIpOwoJCglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJbXkgJGZpbGVEZWxldGVkID0gMDsKCQkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCWlmICgkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9IGVxICRmaWxlTmFtZSkgewoJCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZUlEfSk7CgkJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkZmlsZU5hbWUpOwoJCQkkZmlsZURlbGV0ZWQgPSAxOwoJCX0KCX0KCQoJaWYgKCRmaWxlRGVsZXRlZCkgewoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCQlDb250ZW50ICAgICA9PiAieyAkZmlsZU5hbWU6IHRydWV9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsJCQkKCX0gZWxzZSB7CgkJcmV0dXJuIDE7Cgl9CQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVUGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVSZWNlaXZlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoKCW15ICV0bXBGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoUGFyYW0gPT4gImF0dGFjaG1lbnRfZmlsZXMiKTsJCglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZvcm1JRCIgKTsKCglpZiAoISAkdG1wRmlsZXtGaWxlbmFtZX0gfHwgISAkZm9ybUlkKSB7CgkJbXkgJG1zZ0Vycm9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbnZhbGlkIGZpbGUhIik7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7IFwiZXJyb3JcIjogXCIkbXNnRXJyb3JcIiwgXCJmaWxlc1wiOiBbXSB9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsKCX0KCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IEFkZGluZyBmaWxlIHRvIGNhY2hlLiBGb3JtSUQ6ICIgLiAkZm9ybUlkIC4gIiBcdCBGaWxlbmFtZTogIiAuICR0bXBGaWxle0ZpbGVuYW1lfSAuICIgXHQgQ29udGVudFR5cGU6ICIgLiAkdG1wRmlsZXtDb250ZW50VHlwZX0gKTsKCQoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoKCW15ICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApID0gJFNlbGYtPkdldEZvcm0oIFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSwgU2VydmljZUZvcm0gPT4gXCVzZXJ2aWNlRm9ybSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCglyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+ICJbeyIgLiAkc2NoZW1hIC4gIn0sIHsiIC4gJGZpZWxkcyAuICJ9LCBcIiIgLiAkaW50cm9kdWN0aW9uIC4gIlwiXSIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkCkFsbG93cyB1c2luZyBhIGZpZWxkIGluIHRoZSBmb3JtIHRvIHNlbGVjdCBhIHRhcmdldCBxdWV1ZS4KSWYgYSBxdWV1ZSB3YXMgZGVmaW5lZCBpbiByZXF1ZXN0IHBhcmFtZXRlciwgdXNlcyBpdC4KSWYgdGhlcmUgaXMgYSBwcmVmaXggZGVmaW5lZCBmb3IgdGhlIHF1ZXVlcyB0byBhdXRvbWF0aWNhbGx5IGZvcndhcmQgdGlja2V0cywKYW5kIGFsc28gYSBmaWVsZCB3YXMgZGVmaW5lZCBhcyBoYW5kbGluZyB0aGUgdGFyZ2V0IHF1ZXVlLCB0cnkgdG8gbG9jYXRlIG9uZS4KCklmIG5vbmUgaXMgZm91bmQsIHVzZXMgdGhlIGRlZmF1bHQgcXVldWUuCgpGb3IgZXhhbXBsZToKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZVByZWZpeCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZUZpZWxkID0gVW5pZGFkZQoJCglBdmFpbGFibGVRdWV1ZXMgPSBQcmltZWlybyBOaXZlbCBDQ0IsIFByaW1laXJvIE5pdmVsIENDRSwgUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCgkKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NCLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NCCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDSiAobm8gcXVldWUgYnkgdGhhdCBzdWZmaXgpLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NFLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NFCj1jdXQKc3ViIEdldFF1ZXVlSUQoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CgkKCSMgQ2hlY2sgaWYgcXVldWVJRCB3YXMgc2VudAoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkKCWlmICgkUXVldWVJRCkgewoJCW15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFF1ZXVlSUQpOwoJCXJldHVybiAoJFF1ZXVleyJOYW1lIn0sICRRdWV1ZUlEKTsgCgl9CgoJIyBHZXRzIGRlZmF1bHQgUXVldWUKCW15ICRDb25maWdUaWNrZXQgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoJbXkgJENvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJCgoJbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWdUaWNrZXQtPnsiUXVldWVEZWZhdWx0In07CgoJIyBDaGVja3MgaWYgdGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHF1ZXVlCglteSAkUXVldWVQcmVmaXggPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlUHJlZml4In07CglteSAkUXVldWVGaWVsZCAgPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlRmllbGQifTsKCglteSAlUXVldWVMaXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgICAgICAgICA9PiAxICk7CglteSAlUXVldWVMaXN0ICAgPSByZXZlcnNlICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAxICk7CgkkUXVldWVJRCAgICAgPSAkUXVldWVMaXN0eyRRdWV1ZURlZmF1bHR9OwoJbXkgJFF1ZXVlICAgICAgID0gJFF1ZXVlTGlzdElEeyRRdWV1ZUlEfTsKCglpZiAoICRRdWV1ZVByZWZpeCAmJiAkUXVldWVGaWVsZCApIHsKCQlteSAkUXVldWVTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRRdWV1ZUZpZWxkICk7CgkJbXkgJFF1ZXVlTmFtZSA9ICIkUXVldWVQcmVmaXggJFF1ZXVlU2VsZWN0ZWQiOwoKCQlpZiAoICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX0gKSB7CgkJCSRRdWV1ZUlEID0gJFF1ZXVlTGlzdHskUXVldWVOYW1lfTsKCQkJJFF1ZXVlICAgPSAkUXVldWVOYW1lOwoJCX0KCX0KCQoJcmV0dXJuICggJFF1ZXVlLCAkUXVldWVJRCApOwp9Cgo9aGVhZApSZXR1cm5zIHRoZSBmb3JtIGNvZGUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkc2NoZW1hOwoJbXkgJGZpZWxkczsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBwdWJsaWMgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljKCk7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBhdXRoZW50aWNhdGVkIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9ucygpOwoJfQoJCglteSAkaW50cm9kdWN0aW9uOwoKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNWYWx1ZXMoCgkJU2NoZW1hICA9PiAkc2NoZW1hLAoJCU9wdGlvbnMgPT4gJGZpZWxkcywKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0KCSk7CgkKCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX0gKSB7CgkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQkkaW50cm9kdWN0aW9uID0gIiI7Cgl9CgllbHNlIHsKCQlteSAlc2VydmljZUZvcm0gPSAleyAkUGFyYW17U2VydmljZUZvcm19IH07CgkJJGludHJvZHVjdGlvbiA9ICRzZXJ2aWNlRm9ybXtJbnRyb2R1Y3Rpb259OwoKCQlpZiAoICEkUGFyYW17U2VydmljZUZvcm19e1NjaGVtYX0gKSB7CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCX0KCQllbHNlIHsKCQkJbXkgJHNjaGVtYUZvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJbXkgJGZpZWxkc0Zvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17Rm9ybX07CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvJHNjaGVtYUZvcm0vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vJGZpZWxkc0Zvcm0vZzsKCQl9CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQoJaWYgKCRQYXJhbXsiUXVldWVJRCJ9KSB7CQkJCgkJJHNjaGVtYSA9ICRzY2hlbWEgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcInN0cmluZ1wiLFxuXCJkZWZhdWx0XCI6IFwiIiAuICRQYXJhbXsiUXVldWVJRCJ9IC4gIlwifSI7CgkJJGZpZWxkcyA9ICRmaWVsZHMgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcImhpZGRlblwiXG59IjsKCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICk7Cn0KCj1oZWFkCklmIHNvbWUgZmllbGRzIGhhdmUgZml4ZWQgdmFsdWVzIGluIHNlcnZpY2UgZGVmaW5pdGlvbiwgc2V0cyB0aGVtCj1jdXQKc3ViIEFkanVzdEZpeGVkRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hID0gJFBhcmFte1NjaGVtYX07CglteSAkZm9ybSA9ICRQYXJhbXtGaWVsZHN9OwoJbXkgJGZpeGVkVmFsdWVzID0gJFBhcmFte0ZpeGVkVmFsdWVzfTsKCQoJbXkgQHZhbHVlcyA9IHNwbGl0KC9cbi8sICRmaXhlZFZhbHVlcyk7CgkKCWZvciBteSAkdmFsdWUgKEB2YWx1ZXMpIHsKCgkJJHZhbHVlID1+IHMvXHIvL2c7CgkJbXkgQGRhdGEgPSBzcGxpdCgnPScsICR2YWx1ZSk7CgkJCQkJCgkJbXkgJGZpZWxkS2V5ID0gJGRhdGFbMF07CgkJbXkgJGZpeGVkVmFsdWUgPSAkZGF0YVsxXTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoJCQoJCSRzY2hlbWEgPX4gcy8ka2V5LyRyZXBsYWNlLzsKCQkKCQkka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIjogeyJ0eXBlIjogImhpZGRlbiInIC4gIlxufSI7CgkJJGZvcm0gPX4gcy8ka2V5LyRyZXBsYWNlLzsKCX0JCQoJCglyZXR1cm4gKCRzY2hlbWEsICRmb3JtKTsJCn0KCj1oZWFkCkNyZWF0ZXMgYSBuZXcgdGlja2V0LCBnaXZlbiB0aGUgaW5wdXQgZGF0YSBhbmQgc2VudCBhdHRhY2htZW50cy9pbWFnZXMKPWN1dApzdWIgQ3JlYXRlVGlja2V0IHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJE1haW50ZW5hbmNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06Ok1haW50ZW5hbmNlIik7CglteSAkRGF0ZVV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkRhdGVVdGlscyIpOwoKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe0F1dGhlbnRpY2F0ZVVSTH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpDQVM6OkNBU1VybCcpCgkJCSAgLiAiL2xvZ2luP3NlcnZpY2U9IgoJCQkgIC4gImh0dHBzOi8vIgoJCQkgIC4gJEVOVntTRVJWRVJfTkFNRX0KCQkJICAuICRFTlZ7U0NSSVBUX05BTUV9CgkJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiOwoJfQoJCgkjIENoZWNrIGlmIHF1ZXVlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIikpIHsJCQoJCSREYXRhe1F1ZXVlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCSRTZWxmLT5EZWJ1ZygiU3BlY2lmaWMgcXVldWUgZGVmaW5lZCA9PiAiIC4gJERhdGF7UXVldWVJRH0pOwoJfSBlbHNlIHsKCQkgIyBDaGVjayBpZiBtdXN0IHNob3cgcXVldWUgLSBpZiBzbywgcmVkaXJlY3QgdXNlcgogICAgICAgIG15ICRfQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CiAgICAgICAgbXkgJF9TaG93UXVldWUgICAgICAgICAgPSAkX0NvbmZpZ1RpY2tldFdpemFyZC0+eyJTaG93UXVldWUifTsKICAgICAgICBpZiAoISAkX1Nob3dRdWV1ZSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIlF1ZXVlIHNlbGVjdGlvbiBtdXN0IGJlIHNob3duIC0gcmVkaXJlY3Rpb24gdG8gUXVldWVQYW5lbFB1YmxpYyBhY3Rpb24iKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPVF1ZXVlc1BhbmVsUHVibGljIiApOwogICAgICAgIH0JCQoJfQoJCglteSAoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPkdldEZvcm0oUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCQoJJERhdGF7U2NoZW1hRm9ybX0gPSAkc2NoZW1hOwoJJERhdGF7RmllbGRzRm9ybX0gPSAkZmllbGRzOwoKCSMgQ29tbW9uIGluZm8KCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJbXkgJG1zZ0Nob29zZVNlcnZpY2U7CQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMifTsKCX0gZWxzZSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2UifTsKCX0KCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSApIHsKCQlteSAlcXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSk7CgkJbXkgJHF1ZXVlTmFtZSA9ICRxdWV1ZURhdGF7TmFtZX07CQkKCQkkbXNnQ2hvb3NlU2VydmljZSA9fiBzL1BMQUNFXF9OQU1FLyRxdWV1ZU5hbWUvZzsKCX0KCSREYXRhe01zZ0Nob29zZVNlcnZpY2V9ID0gJG1zZ0Nob29zZVNlcnZpY2U7CQoJCgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCQoKCSMgQnVpbGQgc2VydmljZSBjaG9vc2VyCgkkRGF0YXtTZXJ2aWNlU3RyZ30gPSAkVGlja2V0V2l6YXJkLT5CdWlsZFNlcnZpY2VzKFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApKTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubXVsdGlwbGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9zZWxlY3Q+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnVxaXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwogICAgCSQoIltuYW1lPSdzdWJtaXQnXSIpLmNzcygiZm9udC1zaXplIiwgIjE4cHgiKTsKICAgIAkJCQoJCWZvcm0uZm9ybS5yZWdpc3RlclN1Ym1pdEhhbmRsZXIoZnVuY3Rpb24oZSwgZm9ybSkgewogICAgICAgIAkvLyB2YWxpZGF0ZSB0aGUgZW50aXJlIGZvcm0gKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnZhbGlkYXRlKHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZHJhdyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0ucmVuZGVyVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyBub3cgZGlzcGxheSBzb21ldGhpbmcKICAgICAgICAgICAgaWYgKGZvcm0uaXNGb3JtVmFsaWQoKSkgewogICAgICAgICAgICAJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7CgkJCQlhbGVydCgiRGFkb3MgaW52w6FsaWRvcyEiKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAJfSk7CgkJCgkJCgkJLy8gRml4IENLRWRpdG9yCgkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJZm9yKHZhciBpIGluIENLRURJVE9SLmluc3RhbmNlcykgewoJCQkJdmFyIGVkaXRvciA9IENLRURJVE9SLmluc3RhbmNlc1tpXTsKCQkgICAgICAgIGlmIChlZGl0b3IpIHsKCQkgICAgICAgICAgICAvLyBDYWxsIHNob3dUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgZ2V0IHRoZSBmb2N1cwoJCSAgICAgICAgICAgIGVkaXRvci5vbignZm9jdXMnLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgc2hvd1Rvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoKCQkgICAgICAgICAgICAvLyBDYWxsIGhpZGVUb29sQmFyRGl2KCkgd2hlbiBlZGl0b3IgbG9zZXMgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGV2ZW50KSB7CgkJICAgICAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KGV2ZW50KTsKCQkgICAgICAgICAgICB9KTsKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgICAgICAvL1doZW5ldmVyIENLRWRpdG9yIGdldCBmb2N1cy4gV2Ugd2lsbCBzaG93IHRoZSB0b29sYmFyIHNwYW4uCgkJICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1Rvb2xCYXJEaXYoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5zaG93KCk7CgkJICAgICAgICAgICAgfQoKCQkgICAgICAgICAgICBmdW5jdGlvbiBoaWRlVG9vbEJhckRpdihldmVudCkgeyAgICAgICAgICAgICAgICAgICAgCgkJICAgICAgICAgICAgICAgIC8vJ2V2ZW50LmVkaXRvci5pZCcgcmV0dXJucyB0aGUgaWQgb2YgdGhlIHNwYW5zIHVzZWQgaW4gY2tlZGl0ci4KCQkgICAgICAgICAgICAgICAgJCgnIycrZXZlbnQuZWRpdG9yLmlkKydfdG9wJykuaGlkZSgpCgkJICAgICAgICAgICAgfQoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIGhpZGVUb29sQmFyRGl2KHsgZWRpdG9yOiBlZGl0b3J9KTsKCgkJICAgICAgICAgICAKCQkgICAgICAgIH0KCQkJfQkJCQoJCX0sIDIwMDApOwoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHMoYWN0aXZlUXVldWUpOwp9OwoKCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2tQdWJsaWMgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCJbbmFtZT0nc2VydmljZSddIikudmFsKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSk7CgkJJCgiW25hbWU9J0Zvcm1JRCddIikudmFsKGZvcm0uZGF0YS5Gb3JtSUQpOwkJCiAgICAJJCgiW25hbWU9J3N1Ym1pdCddIikuY3NzKCJmb250LXNpemUiLCAiMThweCIpOwogICAgCQkJCgkJZm9ybS5mb3JtLnJlZ2lzdGVyU3VibWl0SGFuZGxlcihmdW5jdGlvbihlLCBmb3JtKSB7CiAgICAgICAgCS8vIHZhbGlkYXRlIHRoZSBlbnRpcmUgZm9ybSAodG9wIGNvbnRyb2wgKyBhbGwgY2hpbGRyZW4pCiAgICAgICAgICAgIGZvcm0udmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSB2YWxpZGF0aW9uIHN0YXRlICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS5yZW5kZXJWYWxpZGF0aW9uU3RhdGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkaXNwbGF5IHNvbWV0aGluZwogICAgICAgICAgICBpZiAoZm9ybS5pc0Zvcm1WYWxpZCgpKSB7CiAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWFsZXJ0KCJEYWRvcyBpbnbDoWxpZG9zISIpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIAl9KTsKCQkKCQkvLyBGaXggQ0tFZGl0b3IKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQlmb3IodmFyIGkgaW4gQ0tFRElUT1IuaW5zdGFuY2VzKSB7CgkJCQl2YXIgZWRpdG9yID0gQ0tFRElUT1IuaW5zdGFuY2VzW2ldOwoJCSAgICAgICAgaWYgKGVkaXRvcikgewoJCSAgICAgICAgICAgIC8vIENhbGwgc2hvd1Rvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBnZXQgdGhlIGZvY3VzCgkJICAgICAgICAgICAgZWRpdG9yLm9uKCdmb2N1cycsIGZ1bmN0aW9uIChldmVudCkgewoJCSAgICAgICAgICAgICAgICBzaG93VG9vbEJhckRpdihldmVudCk7CgkJICAgICAgICAgICAgfSk7CgoJCSAgICAgICAgICAgIC8vIENhbGwgaGlkZVRvb2xCYXJEaXYoKSB3aGVuIGVkaXRvciBsb3NlcyB0aGUgZm9jdXMKCQkgICAgICAgICAgICBlZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZXZlbnQpIHsKCQkgICAgICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoZXZlbnQpOwoJCSAgICAgICAgICAgIH0pOwoJCSAgICAgICAgICAgIAoJCSAgICAgICAgICAgIC8vV2hlbmV2ZXIgQ0tFZGl0b3IgZ2V0IGZvY3VzLiBXZSB3aWxsIHNob3cgdGhlIHRvb2xiYXIgc3Bhbi4KCQkgICAgICAgICAgICBmdW5jdGlvbiBzaG93VG9vbEJhckRpdihldmVudCkgewoJCSAgICAgICAgICAgICAgICAvLydldmVudC5lZGl0b3IuaWQnIHJldHVybnMgdGhlIGlkIG9mIHRoZSBzcGFucyB1c2VkIGluIGNrZWRpdHIuCgkJICAgICAgICAgICAgICAgICQoJyMnK2V2ZW50LmVkaXRvci5pZCsnX3RvcCcpLnNob3coKTsKCQkgICAgICAgICAgICB9CgoJCSAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVUb29sQmFyRGl2KGV2ZW50KSB7ICAgICAgICAgICAgICAgICAgICAKCQkgICAgICAgICAgICAgICAgLy8nZXZlbnQuZWRpdG9yLmlkJyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc3BhbnMgdXNlZCBpbiBja2VkaXRyLgoJCSAgICAgICAgICAgICAgICAkKCcjJytldmVudC5lZGl0b3IuaWQrJ190b3AnKS5oaWRlKCkKCQkgICAgICAgICAgICB9CgkJICAgICAgICAgICAgCgkJICAgICAgICAgICAgaGlkZVRvb2xCYXJEaXYoeyBlZGl0b3I6IGVkaXRvcn0pOwkJICAgICAgICAgICAKCQkgICAgICAgICAgICAKCQkgICAgICAgIH0KCQkgICAgICAgIAoJCSAgICAgICAgZWRpdG9yLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmRm9ybUlEPSIgKyBmb3JtLmRhdGEuRm9ybUlEOwoJCQl9CgkJCgkJfSwgMjAwMCk7CQkKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzUHVibGljKGFjdGl2ZVF1ZXVlKTsKfTsKCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wc1B1YmxpYyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQoJCgl2YXIgdXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljO1N1YmFjdGlvbj1HZXRGb3JtQ3VzdG9tUHJvcHMiICsgcXVldWU7CgkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldFNjcmlwdCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIGFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhQ3VzdG9tUHJvcHMocXVldWUpIHsKCWlmICghIHF1ZXVlKSB7CgkJcXVldWUgPSAiIjsKCX0JCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KICAgIApmdW5jdGlvbiBjYXJyZWdhRm9ybShkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsJCgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9IAoJCglhY3RpdmVRdWV1ZSA9IHF1ZXVlOwkKCXVybCArPSAiO1NlcnZpY2VJRD0iICsgJCgiI1NlcnZpY2VJRCIpLnZhbCgpOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUpIHsKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1KU09OIiArIHF1ZXVlOwoJCglpZiAoISh0eXBlb2YgZm9ybUFscGFjYSA9PT0gJ3VuZGVmaW5lZCcpKSB7CgkJZm9ybUFscGFjYS5kZXN0cm95KCk7Cgl9CgkKCWFjdGl2ZVF1ZXVlID0gcXVldWU7CQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0SlNPTih1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKGRhdGFbMl0pOwoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5zaG93KCk7CgkJCgkJdmFyIGZvcm0gPSAkKCIjZm9ybVRpY2tldCIpLmFscGFjYSh7CiAgICAgICAJCSJkYXRhIjogZGF0YUZvcm0sCiAgICAgICAgCSJzY2hlbWEiOiBidWlsZFNjaGVtYShkYXRhWzBdKSwKICAgICAgICAJIm9wdGlvbnMiOiBidWlsZE9wdGlvbnMoZGF0YVsxXSwgc2VuZFRleHQsIGFjdGlvbiksCQkJCiAgICAgICAgCSJwb3N0UmVuZGVyIjogcG9zdFJlbmRlckNhbGxiYWNrUHVibGljLAoJCQkidmlldyI6ICJib290c3RyYXAtY3JlYXRlIiwKCQkJInVpIjogImJvb3RzdHJhcC11aSIKICAgIAl9KTsgCgkJCgkJCiAgICAJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KCJFcnJvIGFvIHJlY3VwZXJhcjogIiArIHVybCArICIgPT4gIiArIHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBkZXN0cnVpckZvcm0oKSB7CgkkKCIjZm9ybVRpY2tldCIpLmFscGFjYSgpLmRlc3Ryb3koKTsKfQoK</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.4</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.4">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-21 17:47:52</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJIAkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuLWxnIGJ0bi1kZWZhdWx0Ij4KCSAJCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGlzdC1hbHQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+CgkJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+Q2F0w6Fsb2dvIGRlIHNlcnZpw6dvczwvYT4KCSAJCQk8L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJIAkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuLWxnIGJ0bi1kZWZhdWx0Ij4KCSAJCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGlzdC1hbHQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+CgkJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+Q2F0w6Fsb2dvIGRlIHNlcnZpw6dvczwvYT4KCSAJCQk8L2J1dHRvbj4KCSAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkJICAJCQk8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi10aC1saXN0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgoJCSAgCQkJPGEgdGFyZ2V0PSJfbmV3IiBocmVmPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249Q3VzdG9tZXJUaWNrZXRPdmVydmlldztTdWJhY3Rpb249TXlUaWNrZXRzIj5DaGFtYWRvcyBhYmVydG9zPC9hPgoJIAkJCTwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbCI+CgkJCVslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJCTxsaT5bJSBEYXRhLk1lc3NhZ2UgJV0gKFslIFRyYW5zbGF0ZSgiU3RhcnRlZCBhdDogIikgfCBodG1sICVdIFslIERhdGEuU3RhcnREYXRlICVdKTwvbGk+CgkJCVslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZUxpbmUiKSAlXQoJCTwvb2w+CiAgCTwvZGl2PgogIAkKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZXNQYW5lbCIpICVdCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5Ij4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgRGF0YS5Nc2dDaG9vc2VTZXJ2aWNlICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGZvcm0+CgkJCTxzcGFuPgoJCSAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXToKICAgICAgICAgCTwvc3Bhbj4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCQk8L2Zvcm0+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtZm9vdGVyIiBpZD0ic2VydmljZURlc2NyaXB0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQoJCQlbJSBUcmFuc2xhdGUoIkRpZCB5b3Uga25vdyB0aGF0LCBpZiB5b3UgaGF2ZSBhIGxvZ2luLCB5b3UgY2FuIGF1dGhlbnRpY2F0ZSBmaXJzdCBhbmQgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG5hbWUgYW5kIGUtbWFpbC4gQWxzbywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBtb25pdG9yIHlvdXIgdGlja2V0IGxhdGVyLiIpIHwgaHRtbCAlXToKCQkJPEEgdGFyZ2V0PSJfbmV3IiBIUkVGPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gYXV0aGVudGljYXRlIikgfCBodG1sICVdPC9BPgpbJSBSZW5kZXJCbG9ja0VuZCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQkJCgk8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImZvcm1QYW5lbCI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiIGlkPSJmb3JtVGlja2V0Ij4KCQoJPC9kaXY+CjwvZGl2PgogCiA8c2NyaXB0IHNyYz0iWyUgQ29uZmlnKCJGcm9udGVuZDo6UmljaFRleHRQYXRoIikgJV1ja2VkaXRvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIApbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCS8vIFRvIHR1cm4gb24gZGVidWdnaW5nLCB1bmNvbW1lbnQgdGhpcyBsaW5lCgkvL0FscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRzsKCS8vQWxwYWNhLnVwbG9hZEltYWdlVVJMID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJnJlc3BvbnNlVHlwZT1qc29uJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CgkvL0FscGFjYS5maWxlYnJvd3NlckltYWdlVXBsb2FkVVJMID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CglDS0VESVRPUi5jb25maWcuZmlsZWJyb3dzZXJVcGxvYWRVcmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJnJlc3BvbnNlVHlwZT1qc29uJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CgkKCSQuYWxwYWNhLnNldERlZmF1bHRMb2NhbGUoInB0X0JSIik7CgkJCQoJJC5hbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkJIm5vbmVMYWJlbCI6ICItIiwKCX0pOwoJCgkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKCSAgIAkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOwogICAJCX0gZWxzZSB7CiAgIAkJCWRlc3RydWlyRm9ybSgpOwogICAJCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbCgiIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5oaWRlKCk7CiAgIAkJfSAgCQogIAl9KTsKICAJCiAgIAlpZiAoJCgiI1NlcnZpY2VJRCIpLmhhcygnW3NlbGVjdGVkXScpKSB7CiAgCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CiAgCQkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIpOwogIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7ICAJCQkgIAkJCQogIAkJfQogIAl9Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgZGF0YS13aWR0aD1cImF1dG9cIiBpZD1cIlNlcnZpY2VJRFwiIGRhdGEtbGl2ZS1zZWFyY2gtbm9ybWFsaXplPVwidHJ1ZVwiIGNsYXNzPVwic2VsZWN0cGlja2VyXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIj5cbjxvcHRpb24gdmFsdWU9XCJcIj4tPC9vcHRpb24+IjsKCW15ICRpbk9wdCA9IDA7CgoJZm9yIG15ICRzZXJ2aWNlIChAU2VydmljZXNDb21ibykgewoJCWlmICgkc2VydmljZS0+e0Rpc2FibGVkfSkgewoJCQlpZiAoJGluT3B0KSB7CgkJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJCQl9CgkJCSRpbk9wdCA9IDE7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGdyb3VwIGxhYmVsPSciIC4gJHNlcnZpY2UtPntWYWx1ZX0gLiAiJz5cbiI7CgkJfSBlbHNlIHsKCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8b3B0aW9uIHZhbHVlPSciIC4gJHNlcnZpY2UtPntLZXl9IC4gIic+IiAuICRTZWxmLT5MYXN0UGFydCgkc2VydmljZS0+e1ZhbHVlfSkgLiAiPC9vcHRpb24+XG4iOwoJCX0KCX0KCQoJaWYgKCRpbk9wdCkgewoJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9vcHRncm91cD5cbiI7Cgl9CgkKCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPC9zZWxlY3Q+XG4iOwoKCXJldHVybiAkcmV0b3JubzsKfQoKPWhlYWQKUmV0dXJucyBzZXJ2aWNlIG5hbWUgd2l0aG91dCB0aGUgcGFyZW50IHNlcnZpY2VzIG5hbWVzCj1jdXQKc3ViIExhc3RQYXJ0IHsKCW15ICRTZWxmICA9IHNoaWZ0OwoJbXkgJHF1ZXVlID0gc2hpZnQ7CglteSBAcGFydHMgPSBzcGxpdCggIjo6IiwgJHF1ZXVlICk7CglyZXR1cm4gJHBhcnRzWy0xXTsKfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgkKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIlVwbG9hZEZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJVcGxvYWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlUmVjZWl2ZSgpOwkJCgl9IGVsc2lmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIikgZXEgIkRlbGV0ZUZpbGUiKSB7CgkJJFNlbGYtPkRlYnVnKCJEZWxldGUgdXBsb2FkZWQgZmlsZSBjb21tYW5kIHJlY2VpdmVkIik7CgkJcmV0dXJuICRTZWxmLT5VcGxvYWRGaWxlRGVsZXRlKCk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJVbmtub3duIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAxOwoJfQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVcGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVEZWxldGUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkZmlsZU5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGaWxlbmFtZSIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZSBmaWxlICRmaWxlTmFtZSBmcm9tIGZvcm0gJGZvcm1JZCIpOwoJCglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJbXkgJGZpbGVEZWxldGVkID0gMDsKCQkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCWlmICgkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9IGVxICRmaWxlTmFtZSkgewoJCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZUlEfSk7CgkJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkZmlsZU5hbWUpOwoJCQkkZmlsZURlbGV0ZWQgPSAxOwoJCX0KCX0KCQoJaWYgKCRmaWxlRGVsZXRlZCkgewoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCQlDb250ZW50ICAgICA9PiAieyAkZmlsZU5hbWU6IHRydWV9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsJCQkKCX0gZWxzZSB7CgkJcmV0dXJuIDE7Cgl9CQp9Cgo9aGVhZApIYW5kbGVzIGpRdWVyeUZpbGVVUGxvYWQgY29tcG9uZW50IGluIEFscGFjYUpTCj1jdXQKc3ViIFVwbG9hZEZpbGVSZWNlaXZlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoKCW15ICV0bXBGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoUGFyYW0gPT4gImF0dGFjaG1lbnRfZmlsZXMiKTsJCglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZvcm1JRCIgKTsKCglpZiAoISAkdG1wRmlsZXtGaWxlbmFtZX0gfHwgISAkZm9ybUlkKSB7CgkJbXkgJG1zZ0Vycm9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbnZhbGlkIGZpbGUhIik7CgkJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJCUNvbnRlbnQgICAgID0+ICJ7IFwiZXJyb3JcIjogXCIkbXNnRXJyb3JcIiwgXCJmaWxlc1wiOiBbXSB9IiwKCQkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJCU5vQ2FjaGUgICAgID0+IDEsCgkJKTsKCX0KCgkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IEFkZGluZyBmaWxlIHRvIGNhY2hlLiBGb3JtSUQ6ICIgLiAkZm9ybUlkIC4gIiBcdCBGaWxlbmFtZTogIiAuICR0bXBGaWxle0ZpbGVuYW1lfSAuICIgXHQgQ29udGVudFR5cGU6ICIgLiAkdG1wRmlsZXtDb250ZW50VHlwZX0gKTsKCQoJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgIEZvcm1JRCAgICAgID0+ICRmb3JtSWQsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJHRtcEZpbGV7RmlsZW5hbWV9LAogICAgICAgIENvbnRlbnQgICAgID0+ICR0bXBGaWxle0NvbnRlbnR9LAogICAgICAgIENvbnRlbnRUeXBlID0+ICR0bXBGaWxle0NvbnRlbnRUeXBlfQogICAgKTsKICAgIAogICAgbXkgJXJldG9ybm8gPSAoKTsKICAgIG15IEBmaWxlc1JldHVybmVkID0gKCk7CiAgICAKICAgIG15ICVkYWRvcyA9ICgpOwogICAgJGRhZG9ze25hbWV9ID0gJHRtcEZpbGV7RmlsZW5hbWV9OwogICAgJGRhZG9ze3NpemV9ID0gbGVuZ3RoKCR0bXBGaWxle0NvbnRlbnR9KTsKICAgIAogICAgJGRhZG9ze2RlbGV0ZVVybH0gPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1EZWxldGVGaWxlO0ZpbGVuYW1lPSIgLiB1cmlfZXNjYXBlKCR0bXBGaWxle0ZpbGVuYW1lfSkgLiAiO0Zvcm1JRD0iIC4gJGZvcm1JZDsKICAgIHB1c2ggQGZpbGVzUmV0dXJuZWQsIFwlZGFkb3M7ICAgIAogICAgJHJldG9ybm97ImZpbGVzIn0gPSBcQGZpbGVzUmV0dXJuZWQ7ICAgIAogICAgCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+IGVuY29kZV9qc29uKFwlcmV0b3JubyksCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7CQkKfQoKPWhlYWQKUmV0dXJucyB0aGUgY3VzdG9tIHNjcmlwdCBkZWZpbmVkIGZvciBhIHNlcnZpY2UsIAoJaWYgaXQgZXhpc3RzIG9yIGp1c3QgYSBjb21tZW50LWJsYW5rIGxpbmUgaWYgaXQgZG9lc24ndAo9Y3V0CnN1YiBHZXRGb3JtQ3VzdG9tUHJvcHMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICk7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCXJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfSB8fCAiLyoqLyIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkClJldHVybnMgdGhlIEpTT04gZm9ybSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybUpTT04gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVzZXJ2aWNlRm9ybTsKCQoJbXkgJFNlcnZpY2VGb3JtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoKCWlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybUZvclF1ZXVlKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQkKCQlpZiAoISAkc2VydmljZUZvcm17U2VydmljZUlEfSkgewoJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0gKTsJCgkJfQoJfQoKCW15ICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApID0gJFNlbGYtPkdldEZvcm0oIFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSwgU2VydmljZUZvcm0gPT4gXCVzZXJ2aWNlRm9ybSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCglyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQlDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAoJCUNvbnRlbnQgICAgID0+ICJbeyIgLiAkc2NoZW1hIC4gIn0sIHsiIC4gJGZpZWxkcyAuICJ9LCBcIiIgLiAkaW50cm9kdWN0aW9uIC4gIlwiXSIsCgkJVHlwZSAgICAgICAgPT4gJ2lubGluZScsCgkJTm9DYWNoZSAgICAgPT4gMSwKCSk7Cn0KCj1oZWFkCkFsbG93cyB1c2luZyBhIGZpZWxkIGluIHRoZSBmb3JtIHRvIHNlbGVjdCBhIHRhcmdldCBxdWV1ZS4KSWYgYSBxdWV1ZSB3YXMgZGVmaW5lZCBpbiByZXF1ZXN0IHBhcmFtZXRlciwgdXNlcyBpdC4KSWYgdGhlcmUgaXMgYSBwcmVmaXggZGVmaW5lZCBmb3IgdGhlIHF1ZXVlcyB0byBhdXRvbWF0aWNhbGx5IGZvcndhcmQgdGlja2V0cywKYW5kIGFsc28gYSBmaWVsZCB3YXMgZGVmaW5lZCBhcyBoYW5kbGluZyB0aGUgdGFyZ2V0IHF1ZXVlLCB0cnkgdG8gbG9jYXRlIG9uZS4KCklmIG5vbmUgaXMgZm91bmQsIHVzZXMgdGhlIGRlZmF1bHQgcXVldWUuCgpGb3IgZXhhbXBsZToKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZVByZWZpeCA9IFByaW1laXJvIE5pdmVsCglRdWV1ZUZpZWxkID0gVW5pZGFkZQoJCglBdmFpbGFibGVRdWV1ZXMgPSBQcmltZWlybyBOaXZlbCBDQ0IsIFByaW1laXJvIE5pdmVsIENDRSwgUHJpbWVpcm8gTml2ZWwKCVF1ZXVlRGVmYXVsdCA9IFByaW1laXJvIE5pdmVsCgkKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NCLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NCCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDSiAobm8gcXVldWUgYnkgdGhhdCBzdWZmaXgpLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwKCWlmIFF1ZXVlRmllbGQgdmFsdWUgaXMgQ0NFLCB0aGVuIHNlbGVjdHMgcXVldWUgUHJpbWVpcm8gTml2ZWwgQ0NFCj1jdXQKc3ViIEdldFF1ZXVlSUQoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CgkKCSMgQ2hlY2sgaWYgcXVldWVJRCB3YXMgc2VudAoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CgkKCWlmICgkUXVldWVJRCkgewoJCW15ICVRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFF1ZXVlSUQpOwoJCXJldHVybiAoJFF1ZXVleyJOYW1lIn0sICRRdWV1ZUlEKTsgCgl9CgoJIyBHZXRzIGRlZmF1bHQgUXVldWUKCW15ICRDb25maWdUaWNrZXQgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoJbXkgJENvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJCgoJbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWdUaWNrZXQtPnsiUXVldWVEZWZhdWx0In07CgoJIyBDaGVja3MgaWYgdGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHF1ZXVlCglteSAkUXVldWVQcmVmaXggPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlUHJlZml4In07CglteSAkUXVldWVGaWVsZCAgPSAkQ29uZmlnVGlja2V0V2l6YXJkLT57IlF1ZXVlRmllbGQifTsKCglteSAlUXVldWVMaXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgICAgICAgICA9PiAxICk7CglteSAlUXVldWVMaXN0ICAgPSByZXZlcnNlICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAxICk7CgkkUXVldWVJRCAgICAgPSAkUXVldWVMaXN0eyRRdWV1ZURlZmF1bHR9OwoJbXkgJFF1ZXVlICAgICAgID0gJFF1ZXVlTGlzdElEeyRRdWV1ZUlEfTsKCglpZiAoICRRdWV1ZVByZWZpeCAmJiAkUXVldWVGaWVsZCApIHsKCQlteSAkUXVldWVTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRRdWV1ZUZpZWxkICk7CgkJbXkgJFF1ZXVlTmFtZSA9ICIkUXVldWVQcmVmaXggJFF1ZXVlU2VsZWN0ZWQiOwoKCQlpZiAoICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX0gKSB7CgkJCSRRdWV1ZUlEID0gJFF1ZXVlTGlzdHskUXVldWVOYW1lfTsKCQkJJFF1ZXVlICAgPSAkUXVldWVOYW1lOwoJCX0KCX0KCQoJcmV0dXJuICggJFF1ZXVlLCAkUXVldWVJRCApOwp9Cgo9aGVhZApSZXR1cm5zIHRoZSBmb3JtIGNvZGUgZm9yIGEgZ2l2ZW4gc2VydmljZSwgaWYgb25lIGlzIGRlZmluZWQKPWN1dApzdWIgR2V0Rm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkc2NoZW1hOwoJbXkgJGZpZWxkczsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBwdWJsaWMgZm9ybSBzY2hlbWEiKTsKCQkkc2NoZW1hID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNTY2hlbWFQdWJsaWMoKTsKCQkkZmllbGRzID0gJFRpY2tldFdpemFyZC0+R2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljKCk7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiR2V0dGluZyBhdXRoZW50aWNhdGVkIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9ucygpOwoJfQoJCglteSAkaW50cm9kdWN0aW9uOwoKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNWYWx1ZXMoCgkJU2NoZW1hICA9PiAkc2NoZW1hLAoJCU9wdGlvbnMgPT4gJGZpZWxkcywKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0KCSk7CgkKCWlmICggISRQYXJhbXtTZXJ2aWNlRm9ybX0gKSB7CgkJJHNjaGVtYSA9fiBzL0NGX1NDSEVNQS8vZzsKCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQkkaW50cm9kdWN0aW9uID0gIiI7Cgl9CgllbHNlIHsKCQlteSAlc2VydmljZUZvcm0gPSAleyAkUGFyYW17U2VydmljZUZvcm19IH07CgkJJGludHJvZHVjdGlvbiA9ICRzZXJ2aWNlRm9ybXtJbnRyb2R1Y3Rpb259OwoKCQlpZiAoICEkUGFyYW17U2VydmljZUZvcm19e1NjaGVtYX0gKSB7CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLy9nOwoJCX0KCQllbHNlIHsKCQkJbXkgJHNjaGVtYUZvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJbXkgJGZpZWxkc0Zvcm0gPSAiLCIgLiAkc2VydmljZUZvcm17Rm9ybX07CgkJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvJHNjaGVtYUZvcm0vZzsKCQkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vJGZpZWxkc0Zvcm0vZzsKCQl9CgkJCgkJIyBTZXQgZml4ZWQgZmllbGQgdmFsdWVzLCBpZiBkZWZpbmVkCgkJaWYgKCRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pIHsKCQkJKCRzY2hlbWEsICRmaWVsZHMpID0gJFNlbGYtPkFkanVzdEZpeGVkRmllbGRzKFNjaGVtYSA9PiAkc2NoZW1hLCBGaWVsZHMgPT4gJGZpZWxkcywgRml4ZWRWYWx1ZXMgPT4gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfSk7CgkJfQkKCX0KCQoJIyBJbmNsdWRlIGR5bmFtaWMgZmllbGRzIGluIHJlcGxhY2UgY29tbWFuZAoJKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5SZXBsYWNlT1RSU0R5bmFtaWNGaWVsZHMoIFNjaGVtYSA9PiAkc2NoZW1hLCBPcHRpb25zID0+ICRmaWVsZHMgKTsKCQoJaWYgKCRQYXJhbXsiUXVldWVJRCJ9KSB7CQkJCgkJJHNjaGVtYSA9ICRzY2hlbWEgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcInN0cmluZ1wiLFxuXCJkZWZhdWx0XCI6IFwiIiAuICRQYXJhbXsiUXVldWVJRCJ9IC4gIlwifSI7CgkJJGZpZWxkcyA9ICRmaWVsZHMgLiAiLFxuXCJRdWV1ZUlEXCI6IHtcblwidHlwZVwiOiBcImhpZGRlblwiXG59IjsKCX0KCglyZXR1cm4gKCAkc2NoZW1hLCAkZmllbGRzLCAkaW50cm9kdWN0aW9uICk7Cn0KCj1oZWFkCklmIHNvbWUgZmllbGRzIGhhdmUgZml4ZWQgdmFsdWVzIGluIHNlcnZpY2UgZGVmaW5pdGlvbiwgc2V0cyB0aGVtCj1jdXQKc3ViIEFkanVzdEZpeGVkRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hID0gJFBhcmFte1NjaGVtYX07CglteSAkZm9ybSA9ICRQYXJhbXtGaWVsZHN9OwoJbXkgJGZpeGVkVmFsdWVzID0gJFBhcmFte0ZpeGVkVmFsdWVzfTsKCQoJbXkgQHZhbHVlcyA9IHNwbGl0KC9cbi8sICRmaXhlZFZhbHVlcyk7CgkKCWZvciBteSAkdmFsdWUgKEB2YWx1ZXMpIHsKCgkJJHZhbHVlID1+IHMvXHIvL2c7CgkJbXkgQGRhdGEgPSBzcGxpdCgnPScsICR2YWx1ZSk7CgkJCQkJCgkJbXkgJGZpZWxkS2V5ID0gJGRhdGFbMF07CgkJbXkgJGZpeGVkVmFsdWUgPSAkZGF0YVsxXTsKCQkJCQkJCQkJCQoJCW15ICRrZXkgPSAnKCInIC4gJGZpZWxkS2V5IC4gJyJbXCBdPzpbXCBdP3tbXn1dK30pJzsKCQlteSAkcmVwbGFjZSA9ICciJyAuICRmaWVsZEtleSAuICciJyAuICc6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVmYXVsdCI6ICInIC4gJGZpeGVkVmFsdWUgLiAnIn0nOwoJCQoJCSRzY2hlbWEgPX4gcy8ka2V5LyRyZXBsYWNlLzsKCQkKCQkka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIjogeyJ0eXBlIjogImhpZGRlbiInIC4gIlxufSI7CgkJJGZvcm0gPX4gcy8ka2V5LyRyZXBsYWNlLzsKCX0JCQoJCglyZXR1cm4gKCRzY2hlbWEsICRmb3JtKTsJCn0KCj1oZWFkCkNyZWF0ZXMgYSBuZXcgdGlja2V0LCBnaXZlbiB0aGUgaW5wdXQgZGF0YSBhbmQgc2VudCBhdHRhY2htZW50cy9pbWFnZXMKPWN1dApzdWIgQ3JlYXRlVGlja2V0IHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCQoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkjIENoZWNrIGlmIHF1ZXVlIHdhcyBwcmUtZGVmaW5lZAoJbXkgJHF1ZXVlRml4ZWQgPSAwOwoJaWYgKCREYXRhe1F1ZXVlSUR9KSB7CgkJJHF1ZXVlRml4ZWQgPSAxOwoJfQkKCQoJIyBHZXQgcXVldWUgbmFtZSBhbmQgaWQgdXNpbmcgcnVsZXMsIGlmIG5vIHF1ZXVlIHdhcyBwcmVkZWZpbmVkCglteSAoICRRdWV1ZSwgJFF1ZXVlSUQgKSA9ICRUaWNrZXRXaXphcmQtPkdldFF1ZXVlSUQoJVBhcmFtKTsKCSREYXRhe1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgoJIyBNb2R1bGUgY29uZmlnCgkkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSIpOwoKCSMgVGlja2V0IGNyZWF0aW9uCglteSAkY3VzdG9tZXJJRDsKCW15ICRjdXN0b21lclVzZXI7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRjdXN0b21lcklEID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7CgkJJGN1c3RvbWVyVXNlciA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJfSBlbHNlIHsKCQkkY3VzdG9tZXJJRCA9ICRQYXJhbXtDdXN0b21lcklEfTsKCQkkY3VzdG9tZXJVc2VyID0gJFBhcmFte0N1c3RvbWVyVXNlcn07Cgl9CgkKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgdGlja2V0Iik7CglteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCgkJVGl0bGUgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAoJCVByaW9yaXR5ICAgPT4gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSwKCQlMb2NrICAgICAgID0+ICd1bmxvY2snLAoJCVN0YXRlICAgICAgPT4gJ25ldycsCgkJU2VydmljZUlEICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic2VydmljZSIgKSwKCQlUeXBlSUQgICAgID0+JFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInR5cGUiICksCgkJQ3VzdG9tZXJJRCA9PiAkY3VzdG9tZXJJRCwKCQlDdXN0b21lclVzZXIgPT4gJGN1c3RvbWVyVXNlciwKCQlPd25lcklEID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJKTsKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlZCB0aWNrZXQgSUQgJFRpY2tldElEIik7CgoJbXkgJE1pbWVUeXBlICAgICAgPSAndGV4dC9odG1sJzsKCW15ICVzZXJ2aWNlRmllbGRzVmFsdWVzID0gKCk7CglteSAkc2VydmljZUZpZWxkcyA9ICIiOwoJbXkgQHNlcnZpY2VGaWVsZHNLZXlzID0gKCk7CgoJIyBTZXJ2aWNlIEZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZm9ybSB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICgoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiU0ZfIiApICYmICggc3Vic3RyKCAkXywgMCwgNSApIG5lICJTRl9UXyIgKSkgewoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKSkgewoJCQkJbXkgQHBhcmFtVmFscyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CQkJCQoJCQkJZm9yIG15ICRwYXJhbVZhbHVlIChAcGFyYW1WYWxzKSB7CgkJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CQkJCQoJCQl9IGVsc2UgewoJCQkJbXkgJHBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOyAKCQkJCQoJCQkJaWYgKCgkcGFyYW1WYWx1ZSkgJiYgKCEoJHBhcmFtVmFsdWUgZXEgIi0iKSkpIHsKCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCXB1c2ggQHNlcnZpY2VGaWVsZHNLZXlzLCAkXzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCX0JCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0KCQoJZm9yIChAc2VydmljZUZpZWxkc0tleXMpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gc3Vic3RyKCAkXywgMyApKSAuICI6IDwvQj4iIC4gJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC4gIjxCUi8+IjsKCX0JCgkKCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj5JUDogPC9CPiIgLiAgJEVOVnsnUkVNT1RFX0FERFInfSAuICI8QlIvPiI7Cgkkc2VydmljZUZpZWxkcyAuPSAiPEJSLz48QlIvPiI7CgoJIyBEeW5hbWljIEZpZWxkcwoJbXkgJHVzZXJJRERGOwoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJHVzZXJJRERGID0gJFNlbGYtPntEZWZhdWx0VXNlcklEfTsKCX0gZWxzZSB7CgkJJHVzZXJJRERGID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7Cgl9CgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgZHluYW1pYyBmaWVsZHMgdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDMgKSBlcSAiREZfIiApIHsKCQkJbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCgkJCQlEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KCBOYW1lID0+IHN1YnN0ciggJF8sIDMgKSApLAoJCQkJT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKCQkJCVZhbHVlICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApLAoJCQkJVXNlcklEID0+ICR1c2VySURERiwKCQkJKTsKCQl9Cgl9CgoJIyBTZXJ2aWNlIEZpZWxkcyAtIFRhYmxlIGZpZWxkcwoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIHNlcnZpY2UgZmllbGRzIC0gdGFibGUgZmllbGRzIik7CglteSAkbGFzdFRhYiA9ICIiOwoJbXkgJWtleXNGb3VuZCA9ICgpOwoJbXkgJG5ld1RhYiA9IDE7CgkKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgNSApIGVxICJTRl9UXyIgKSB7CgkJCW15ICRwYXJhbU5hbWUgPSAkXzsKCQkJbXkgQHBhcnRzID0gc3BsaXQoJ18nLCAkXyk7CgkJCW15ICRjdXJyVGFiID0gJHBhcnRzWzJdOwoJCQlteSAkY3VycktleSA9ICRwYXJ0c1s0XTsKCQkJCgkJCWlmICgkY3VyclRhYiBuZSAkbGFzdFRhYikgewoJCQkJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7CgkJCQl9CgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRBQkxFIHN0eWxlPSdib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNzAwcHg7JyBib3JkZXI9JzFweCc+IjsKCQkJCSRsYXN0VGFiID0gJGN1cnJUYWI7CgkJCQkkbmV3VGFiID0gMTsKCQkJfSBlbHNlIHsKCQkJCSRuZXdUYWIgPSAwOwoJCQl9CgkJCQoJCQkjIyBuZXcgbGluZSBkdWUgdG8gcmVwZXRpdGlvbiBvciBuZXcgdGFibGUKCQkJaWYgKCRrZXlzRm91bmR7JGN1cnJLZXl9IHx8ICgkbmV3VGFiKSApIHsKCQkJCSVrZXlzRm91bmQgPSAoKTsJCQkJCgkJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBDT0xTUEFOPScyJyBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IGxhcmdlJz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VyclRhYikgLiAiPC9CPjwvVEQ+PC9UUj4iOyAKCQkJfQoJCQkka2V5c0ZvdW5keyRjdXJyS2V5fSA9IDE7CgkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIHN0eWxlPSd3aWR0aDogMTAwcHg7Jz48Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiAkY3VycktleSkgLiAiPC9CPjwvVEQ+PFREPiIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkcGFyYW1OYW1lICkgLiAiPC9URD48L1RSPiI7CQkJCgkJfQoJfQoJCglpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCX0KCQoJbXkgJGJvZHkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZGVzY3JpcHRpb24iICk7CgoJIyBJbWFnZXMKCSRTZWxmLT5EZWJ1ZygiTG9hZGluZyBpbWFnZXMgZnJvbSBjYWNoZSIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCW15IEBmaWxlc1VwbG9hZGVkID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoRm9ybUlEID0+ICRmb3JtSWQpOwoJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlteSAkQ29udGVudElEID0gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH07CiAgICAgICAgaWYgKCRDb250ZW50SUQgJiYgKCAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkgJiYgKCAkdXBsb2FkZWRGaWxlLT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IHJlcGxhY2luZyBpbWFnZSBVUkwgaW4gYm9keSB3aXRoIGF0dGFjaG1lbnQiKTsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IEJvZHk6ICRib2R5Iik7CiAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKFRleHQgPT4gJENvbnRlbnRJRCwpOwoJCQkjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICRib2R5ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CiAgICAgICAgICAgICRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBuZXcgYm9keTogJGJvZHkiKTsKICAgICAgICB9Cgl9CgkKCSMgQ3JlYXRlIGFydGljbGUKCSRTZWxmLT5EZWJ1ZygiQ3JlYXRpbmcgYXJ0aWNsZSIpOwoJbXkgJEZ1bGxOYW1lOwoJbXkgJEVtYWlsOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRnVsbE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAibmFtZSIgKTsKCQkkRW1haWwgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICk7CQkKCX0gZWxzZSB7CgkJJEZ1bGxOYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0pOwoJCSRFbWFpbCAgICA9ICRQYXJhbXtVc2VyRW1haWx9OwoJfQoJCQoJbXkgJEZyb20gICAgID0gIlwiJEZ1bGxOYW1lXCIgPCRFbWFpbD4iOwoJbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgkJVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCgkJQXJ0aWNsZVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCgkJU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCQlGcm9tICAgICAgICAgICAgID0+ICRGcm9tLAoJCVRvICAgICAgICAgICAgICAgPT4gJFF1ZXVlLAoJCVN1YmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJQm9keSAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLAoJCU1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAoJCUNoYXJzZXQgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKCQlVc2VySUQgICAgICAgICAgID0+ICR1c2VySURERiwKCQlIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKCQlIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAoJCUF1dG9SZXNwb25zZVR5cGUgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCgkJPyAnYXV0byByZXBseScKCQk6ICcnLAoJCU9yaWdIZWFkZXIgPT4gewoJCQlGcm9tICAgID0+ICRGcm9tLAoJCQlUbyAgICAgID0+ICRRdWV1ZSwKCQkJU3ViamVjdCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQkJQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoU3RyaW5nID0+ICRzZXJ2aWNlRmllbGRzIC4gJGJvZHkpLCwKCQl9LAoJCVF1ZXVlID0+ICRRdWV1ZSwKCSk7CgkKCSMgQXR0YWNobWVudHMKCSRTZWxmLT5EZWJ1ZygiSW5jbHVkaW5nIGF0dGFjaG1lbnRzIik7Cglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkVGlja2V0T2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAoJCQlGaWxlbmFtZSA9PiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9LAoJCQlDb250ZW50ID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50fSwKCQkJQ29udGVudFR5cGUgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSwKCQkJQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCgkJCUNvbnRlbnRJRCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfSwKCQkJVXNlcklEICAgID0+ICR1c2VySURERiwKCQkpOwoJfQoJCgkkRGF0YXtUaWNrZXROdW1iZXJ9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJIyBidWlsZCBvdXRwdXQKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7CgkJJERhdGF7TW9kdWxlfSA9ICJwdWJsaWMiOwoJfSBlbHNlIHsKCQkkRGF0YXtNb2R1bGV9ID0gImN1c3RvbWVyIjsKCX0KCWlmICghICRxdWV1ZUZpeGVkKSB7CgkJZGVsZXRlICREYXRhe1F1ZXVlSUR9IAoJfQoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsIFRpdGxlID0+ICJUaWNrZXQgY3JlYXRlZCIgKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRUaWNrZXRDcmVhdGVkJywKCSk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUpOwoJcmV0dXJuICRPdXRwdXQ7Cgp9Cgo9aGVhZApJZiBwdWJsaWMgaW50ZXJmYWNlIHdhcyB1c2VkLCB0cnkgdG8gZ3Vlc3MgdGhlIHVzZXIgZnJvbSB0aGUgaW5mb3JtZWQgZS1tYWlsCj1jdXQKc3ViIEdldFVzZXJJREZyb21FbWFpbCB7CglteSAkU2VsZiAgICAgICA9IHNoaWZ0OwoJbXkgJGVtYWlsICAgICAgPSBzaGlmdDsKCW15ICRyZXN1bHQgICAgID0gJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH07CglteSAkZG9tYWluTGlzdCA9ICRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59OwoJCglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoKCWlmICgkZG9tYWluTGlzdCkgewoJCW15IEBkb21haW5zID0gc3BsaXQoICIsIiwgJGRvbWFpbkxpc3QgKTsKCQkKCQlmb3IgbXkgJGRvbWFpbiAoQGRvbWFpbnMpIHsKCQkJbXkgQHBhcnRzID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CgkJCWlmICggJHBhcnRzWzFdIGVxICRkb21haW4gKSB7CgkJCQlteSAkaWQgICA9ICRwYXJ0c1swXTsKCQkJCW15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCgkJCQkJVXNlckxvZ2luID0+ICRpZCwKCQkJCQlWYWxpZCAgICAgPT4gMSwgICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBkZWZhdWx0IDEKCQkJCSk7CgkJCQlpZiAoIGtleXMgJUxpc3QgKSB7CgkJCQkJJHJlc3VsdCA9ICRpZDsKCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHJlc3VsdDsKfQoKPWhlYWQKRGVmYXVsdCBhY3Rpb24gdG8gb3BlbiBhIG5ldyBmb3JtIChmcm9udGVuZCBtZXRob2Qgc2hhcmUgYnkgcHVibGljIGFuZCBjdXN0b21lciBmcm9udGVuZCBtb2R1bGVzKQo9Y3V0CnN1YiBPcGVuRm9ybSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwkJCglteSAlRGF0YSA9ICgpOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgcHVibGljIGZvcm0iKTsKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIGF1dGhlbnRpY2F0ZWQgZm9ybSIpOwoJfQoJCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgoJbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlIik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoJbXkgJE1haW50ZW5hbmNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06Ok1haW50ZW5hbmNlIik7CglteSAkRGF0ZVV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkRhdGVVdGlscyIpOwoKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe0F1dGhlbnRpY2F0ZVVSTH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpDQVM6OkNBU1VybCcpCgkJCSAgLiAiL2xvZ2luP3NlcnZpY2U9IgoJCQkgIC4gImh0dHBzOi8vIgoJCQkgIC4gJEVOVntTRVJWRVJfTkFNRX0KCQkJICAuICRFTlZ7U0NSSVBUX05BTUV9CgkJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQiOwoJfQoJCgkjIENoZWNrIGlmIHF1ZXVlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQKCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIikpIHsJCQoJCSREYXRhe1F1ZXVlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCSRTZWxmLT5EZWJ1ZygiU3BlY2lmaWMgcXVldWUgZGVmaW5lZCA9PiAiIC4gJERhdGF7UXVldWVJRH0pOwoJfSBlbHNlIHsKCQkgIyBDaGVjayBpZiBtdXN0IHNob3cgcXVldWUgLSBpZiBzbywgcmVkaXJlY3QgdXNlcgogICAgICAgIG15ICRfQ29uZmlnVGlja2V0V2l6YXJkID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CiAgICAgICAgbXkgJF9TaG93UXVldWUgICAgICAgICAgPSAkX0NvbmZpZ1RpY2tldFdpemFyZC0+eyJTaG93UXVldWUifTsKICAgICAgICBpZiAoISAkX1Nob3dRdWV1ZSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIlF1ZXVlIHNlbGVjdGlvbiBtdXN0IGJlIHNob3duIC0gcmVkaXJlY3Rpb24gdG8gUXVldWVQYW5lbFB1YmxpYyBhY3Rpb24iKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPVF1ZXVlc1BhbmVsUHVibGljIiApOwogICAgICAgIH0JCQoJfQoJCglteSAoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPkdldEZvcm0oUHVibGljID0+ICRQYXJhbXtQdWJsaWN9KTsKCQoJJERhdGF7U2NoZW1hRm9ybX0gPSAkc2NoZW1hOwoJJERhdGF7RmllbGRzRm9ybX0gPSAkZmllbGRzOwoKCSMgQ29tbW9uIGluZm8KCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJbXkgJGlkQ3VzdG9tVGVtcGxhdGUgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiQ3VzdG9tVGVtcGxhdGUifTsKCQoJbXkgJG1zZ0Nob29zZVNlcnZpY2U7CQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMifTsKCX0gZWxzZSB7CgkJJG1zZ0Nob29zZVNlcnZpY2UgPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiTWVzc2FnZUNob29zZVNlcnZpY2UifTsKCX0KCWlmICgkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSApIHsKCQlteSAlcXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldChJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKSk7CgkJbXkgJHF1ZXVlTmFtZSA9ICRxdWV1ZURhdGF7TmFtZX07CQkKCQkkbXNnQ2hvb3NlU2VydmljZSA9fiBzL1BMQUNFXF9OQU1FLyRxdWV1ZU5hbWUvZzsKCX0KCSREYXRhe01zZ0Nob29zZVNlcnZpY2V9ID0gJG1zZ0Nob29zZVNlcnZpY2U7CQoJCgkkU2VsZi0+e0RlZmF1bHRVc2VySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VySUQifTsKCSRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRDdXN0b21lcklEIn07CgkkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlckRvbWFpbiJ9OwoJCgkKCQoKCSMgQnVpbGQgc2VydmljZSBjaG9vc2VyCgkkRGF0YXtTZXJ2aWNlU3RyZ30gPSAkVGlja2V0V2l6YXJkLT5CdWlsZFNlcnZpY2VzKFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApKTsKCgkjIEJ1aWxkIG91dHB1dAoJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKFR5cGUgPT4gJGlkQ3VzdG9tVGVtcGxhdGUsICBUaXRsZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5ldyB0aWNrZXQgd2l6YXJkIikgKTsKCQkgIAoJIyBMb2FkIGN1cnJlbnQgbWFpbnRlbmFuY2VzICAKCW15IEBtYWludGVuYW5jZXMgPSAkTWFpbnRlbmFuY2VPYmplY3QtPkxpc3RDdXJyZW50TWFpbnRlbmFuY2VzKCk7CgkJCglpZiAoQG1haW50ZW5hbmNlcykgewoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdNYWludGVuYW5jZXNQYW5lbCcsCgkJKTsJCQoJCQkKCQlmb3IgbXkgJG1haW50ZW5hbmNlSGFzaCAoQG1haW50ZW5hbmNlcykgewoJCQlteSAlbWFpbnRlbmFuY2UgPSAleyRtYWludGVuYW5jZUhhc2h9OwoJCQkJCQkJCgkJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VMaW5lJywKCQkJCURhdGEgPT4gewoJCQkJCU1lc3NhZ2UgICA9PiAkbWFpbnRlbmFuY2V7J0Rlc2NyaXB0aW9uJ30sCQkJCQkJCgkJCQkJU3RhcnREYXRlID0+ICREYXRlVXRpbHNPYmplY3QtPkJyYXppbGlhbkRhdGUoVGltZXN0YW1wID0+ICREYXRlVXRpbHNPYmplY3QtPkZyb21TUUwoU3RyaW5nRGF0ZSA9PiAkbWFpbnRlbmFuY2V7U3RhcnREYXRlfSkpLAoJCQkJfSk7CQkJCQkJCQoJCX0JCgl9CQkKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gdW5hdXRoZW50aWNhdGVkIG1lc3NhZ2UgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdVbmF1dGhlbnRpY2F0ZWRNZXNzYWdlJywKCQkpOwoJCSRTZWxmLT5EZWJ1ZygiUHVibGljIHZpZXcgLSBwdWJsaWMgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCU5hbWUgPT4gJ1Rvb2xCYXJQdWJsaWMnLAoJCSk7CQkKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJDdXN0b21lciB2aWV3IC0gY3VzdG9tZXIgdG9vbGJhciBlbmFibGVkIik7CgkJJExheW91dE9iamVjdC0+QmxvY2soCQkKCQkJTmFtZSA9PiAnVG9vbEJhckN1c3RvbWVyJywKCQkpOwoJfQoKCSMgUHJlcGFyZSBjYWNoZSBmb3IgaW1hZ2VucyBhbmQgYXR0YWNobWVudHMKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgkkRGF0YXtGb3JtSUR9ID0gJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSREYXRhe1B1YmxpY01vZGV9ID0gIlB1YmxpYyI7Cgl9CgoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZCcsCgkpOwoJCQoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZApTZXBhcmF0ZSBzZXJ2aWNlLWZpZWxkIGxhYmVsIG5hbWVzLCB0byBtYWtlIGl0IGh1bWFuLXJlYWRhYmxlIChDYXBpdGFsTGlrZUxhYmVscyAtPiBDYXBpdGFsIGxpa2UgbGFiZWxzKQo9Y3V0CnN1YiBicmVha1dvcmRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkcmV0dXJuID0gJFBhcmFte1RleHR9OwkKCQoJJHJldHVybiA9fiBzLyguKShbQS1aXVteQS1aXSkvJDEgJDIvZzsKCSRyZXR1cm4gPX4gcy8oW1x3J10rKS9cdVxMJDEvZzsKCQoJcmV0dXJuICRyZXR1cm47Cn0KCnN1YiBEZWJ1ZyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJG1zZyA9IHNoaWZ0OwoJJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkxvZyIpLT5Mb2coIFByaW9yaXR5ID0+ICdkZWJ1ZycsIE1lc3NhZ2UgPT4gJG1zZyApOwp9CgoKMTsK</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgiW25hbWU9J3NlcnZpY2UnXSIpLnZhbCgkKCIjU2VydmljZUlEIikudmFsKCkpOwoJCSQoIltuYW1lPSdGb3JtSUQnXSIpLnZhbChmb3JtLmRhdGEuRm9ybUlEKTsKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJCQllZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0JCQkKCQl9LCAyMDAwKTsKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzKGFjdGl2ZVF1ZXVlKTsKfTsKCgp2YXIgcG9zdFJlbmRlckNhbGxiYWNrUHVibGljID0gZnVuY3Rpb24oZm9ybSkgewoJZm9ybU9wdGlvbnMgPSBmb3JtLm9wdGlvbnMuZmllbGRzOwoJZm9ybUFscGFjYSA9IGZvcm07CgkKCWlmIChmb3JtKSB7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigpOwoJCSQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSkgewkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0gCgkKCWFjdGl2ZVF1ZXVlID0gcXVldWU7CQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0SlNPTih1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKGRhdGFbMl0pOwoJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5zaG93KCk7CgkJCgkJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFjaywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gcmVsb2FkU2VydmljZXMoc2VuZCwgY2dpaGFuZGxlKSB7Cgl2YXIgdXJsID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmQ7U3ViYWN0aW9uPUdldFNlcnZpY2VzO1F1ZXVlSUQ9IiArICQoIiNRdWV1ZUlEIikudmFsKCk7CgkKCSQuZ2V0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCgkJJCgiI3NlcnZpY2VESVYiKS5odG1sKGRhdGEpOwoJCQoJCSQoIiNTZXJ2aWNlSUQiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkgICAJCWNhcnJlZ2FGb3JtKG51bGwsIHNlbmQsY2dpaGFuZGxlLCAiO1F1ZXVlSUQ9IiArICQoIiNRdWV1ZUlEIikudmFsKCkpOwoJICAJfSk7CgkJCgkJJCgiI2Zvcm1UaWNrZXQiKS5odG1sKCIiKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaGlkZSgpOwoKCQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtUHVibGljKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRKU09OKHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmh0bWwoZGF0YVsyXSk7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLnNob3coKTsKCQkKCQl2YXIgZm9ybSA9ICQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2tQdWJsaWMsCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKCQkKCQkKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlc3RydWlyRm9ybSgpIHsKCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKCkuZGVzdHJveSgpOwp9Cgo=</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.5</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.5">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-21 19:04:11</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbCI+CgkJCVslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJCTxsaT5bJSBEYXRhLk1lc3NhZ2UgJV0gKFslIFRyYW5zbGF0ZSgiU3RhcnRlZCBhdDogIikgfCBodG1sICVdIFslIERhdGEuU3RhcnREYXRlICVdKTwvbGk+CgkJCVslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZUxpbmUiKSAlXQoJCTwvb2w+CiAgCTwvZGl2PgogIAkKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZXNQYW5lbCIpICVdCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5Ij4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgRGF0YS5Nc2dDaG9vc2VTZXJ2aWNlICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGZvcm0+CgkJCTxzcGFuPgoJCSAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXToKICAgICAgICAgCTwvc3Bhbj4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCQk8L2Zvcm0+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtZm9vdGVyIiBpZD0ic2VydmljZURlc2NyaXB0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQoJCQlbJSBUcmFuc2xhdGUoIkRpZCB5b3Uga25vdyB0aGF0LCBpZiB5b3UgaGF2ZSBhIGxvZ2luLCB5b3UgY2FuIGF1dGhlbnRpY2F0ZSBmaXJzdCBhbmQgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG5hbWUgYW5kIGUtbWFpbC4gQWxzbywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBtb25pdG9yIHlvdXIgdGlja2V0IGxhdGVyLiIpIHwgaHRtbCAlXToKCQkJPEEgdGFyZ2V0PSJfbmV3IiBIUkVGPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gYXV0aGVudGljYXRlIikgfCBodG1sICVdPC9BPgpbJSBSZW5kZXJCbG9ja0VuZCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQkJCgk8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImZvcm1QYW5lbCI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiIGlkPSJmb3JtVGlja2V0Ij4KCQoJPC9kaXY+CjwvZGl2PgogCiA8c2NyaXB0IHNyYz0iWyUgQ29uZmlnKCJGcm9udGVuZDo6UmljaFRleHRQYXRoIikgJV1ja2VkaXRvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIApbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCS8vIFRvIHR1cm4gb24gZGVidWdnaW5nLCB1bmNvbW1lbnQgdGhpcyBsaW5lCgkvL0FscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRzsKCS8vQWxwYWNhLnVwbG9hZEltYWdlVVJMID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJnJlc3BvbnNlVHlwZT1qc29uJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CgkvL0FscGFjYS5maWxlYnJvd3NlckltYWdlVXBsb2FkVVJMID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CglDS0VESVRPUi5jb25maWcuZmlsZWJyb3dzZXJVcGxvYWRVcmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJnJlc3BvbnNlVHlwZT1qc29uJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CgkKCSQuYWxwYWNhLnNldERlZmF1bHRMb2NhbGUoInB0X0JSIik7CgkJCQoJJC5hbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkJIm5vbmVMYWJlbCI6ICItIiwKCX0pOwoJCgkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKCSAgIAkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIsICJbJSBEYXRhLkZvcm1JRCAlXSIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOwogICAJCX0gZWxzZSB7CiAgIAkJCWRlc3RydWlyRm9ybSgpOwogICAJCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbCgiIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5oaWRlKCk7CiAgIAkJfSAgCQogIAl9KTsKICAJCiAgIAlpZiAoJCgiI1NlcnZpY2VJRCIpLmhhcygnW3NlbGVjdGVkXScpKSB7CiAgCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CiAgCQkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIsICJbJSBEYXRhLkZvcm1JRCAlXSIpOwogIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7ICAJCQkgIAkJCQogIAkJfQogIAl9Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgaWQ9XCJTZXJ2aWNlSURcIiBkYXRhLWxpdmUtc2VhcmNoLW5vcm1hbGl6ZT1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGRhdGEtbGl2ZS1zZWFyY2g9XCJ0cnVlXCI+XG48b3B0aW9uIHZhbHVlPVwiXCI+LTwvb3B0aW9uPiI7CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGlvbiB2YWx1ZT0nIiAuICRzZXJ2aWNlLT57S2V5fSAuICInPiIgLiAkU2VsZi0+TGFzdFBhcnQoJHNlcnZpY2UtPntWYWx1ZX0pIC4gIjwvb3B0aW9uPlxuIjsKCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoJCQoJCSMgU2V0IGZpeGVkIGZpZWxkIHZhbHVlcywgaWYgZGVmaW5lZAoJCWlmICgkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KSB7CgkJCSgkc2NoZW1hLCAkZmllbGRzKSA9ICRTZWxmLT5BZGp1c3RGaXhlZEZpZWxkcyhTY2hlbWEgPT4gJHNjaGVtYSwgRmllbGRzID0+ICRmaWVsZHMsIEZpeGVkVmFsdWVzID0+ICRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pOwoJCX0JCgl9CgkKCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNEeW5hbWljRmllbGRzKCBTY2hlbWEgPT4gJHNjaGVtYSwgT3B0aW9ucyA9PiAkZmllbGRzICk7CgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgkJCQkJCQkJCQkKCQlteSAka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJbXkgJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIicgLiAnOiB7InR5cGUiOiAic3RyaW5nIiwgImRlZmF1bHQiOiAiJyAuICRmaXhlZFZhbHVlIC4gJyJ9JzsKCQkKCQkkc2NoZW1hID1+IHMvJGtleS8kcmVwbGFjZS87CgkJCgkJJGtleSA9ICcoIicgLiAkZmllbGRLZXkgLiAnIltcIF0/OltcIF0/e1tefV0rfSknOwoJCSRyZXBsYWNlID0gJyInIC4gJGZpZWxkS2V5IC4gJyI6IHsidHlwZSI6ICJoaWRkZW4iJyAuICJcbn0iOwoJCSRmb3JtID1+IHMvJGtleS8kcmVwbGFjZS87Cgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJIyBDaGVjayBpZiBxdWV1ZSB3YXMgcHJlLWRlZmluZWQKCW15ICRxdWV1ZUZpeGVkID0gMDsKCWlmICgkRGF0YXtRdWV1ZUlEfSkgewoJCSRxdWV1ZUZpeGVkID0gMTsKCX0JCgkKCSMgR2V0IHF1ZXVlIG5hbWUgYW5kIGlkIHVzaW5nIHJ1bGVzLCBpZiBubyBxdWV1ZSB3YXMgcHJlZGVmaW5lZAoJbXkgKCAkUXVldWUsICRRdWV1ZUlEICkgPSAkVGlja2V0V2l6YXJkLT5HZXRRdWV1ZUlEKCVQYXJhbSk7CgkkRGF0YXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKCSMgTW9kdWxlIGNvbmZpZwoJJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCgkjIFRpY2tldCBjcmVhdGlvbgoJbXkgJGN1c3RvbWVySUQ7CglteSAkY3VzdG9tZXJVc2VyOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkY3VzdG9tZXJJRCA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJCSRjdXN0b21lclVzZXIgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCX0gZWxzZSB7CgkJJGN1c3RvbWVySUQgPSAkUGFyYW17Q3VzdG9tZXJJRH07CgkJJGN1c3RvbWVyVXNlciA9ICRQYXJhbXtDdXN0b21lclVzZXJ9OwoJfQoJCgkkU2VsZi0+RGVidWcoIkNyZWF0aW5nIHRpY2tldCIpOwoJbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAoJCVRpdGxlICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJUXVldWVJRCAgICA9PiAkUXVldWVJRCwKCQlQcmlvcml0eSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0sCgkJTG9jayAgICAgICA9PiAndW5sb2NrJywKCQlTdGF0ZSAgICAgID0+ICduZXcnLAoJCVNlcnZpY2VJRCAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInNlcnZpY2UiICksCgkJVHlwZUlEICAgICA9PiRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJ0eXBlIiApLAoJCUN1c3RvbWVySUQgPT4gJGN1c3RvbWVySUQsCgkJQ3VzdG9tZXJVc2VyID0+ICRjdXN0b21lclVzZXIsCgkJT3duZXJJRCA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJCVVzZXJJRCAgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCSk7CgkkU2VsZi0+RGVidWcoIkNyZWF0ZWQgdGlja2V0IElEICRUaWNrZXRJRCIpOwoKCW15ICRNaW1lVHlwZSAgICAgID0gJ3RleHQvaHRtbCc7CglteSAlc2VydmljZUZpZWxkc1ZhbHVlcyA9ICgpOwoJbXkgJHNlcnZpY2VGaWVsZHMgPSAiIjsKCW15IEBzZXJ2aWNlRmllbGRzS2V5cyA9ICgpOwoKCSMgU2VydmljZSBGaWVsZHMKCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBzZXJ2aWNlIGZvcm0gdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoKCBzdWJzdHIoICRfLCAwLCAzICkgZXEgIlNGXyIgKSAmJiAoIHN1YnN0ciggJF8sIDAsIDUgKSBuZSAiU0ZfVF8iICkpIHsKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICkpIHsKCQkJCW15IEBwYXJhbVZhbHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApOwkJCQkKCQkJCWZvciBteSAkcGFyYW1WYWx1ZSAoQHBhcmFtVmFscykgewoJCQkJCWlmICgoJHBhcmFtVmFsdWUpICYmICghKCRwYXJhbVZhbHVlIGVxICItIikpKSB7CgkJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCQlwdXNoIEBzZXJ2aWNlRmllbGRzS2V5cywgJF87CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQkJCQkKCQkJfSBlbHNlIHsKCQkJCW15ICRwYXJhbVZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsgCgkJCQkKCQkJCWlmICgoJHBhcmFtVmFsdWUpICYmICghKCRwYXJhbVZhbHVlIGVxICItIikpKSB7CgkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQlwdXNoIEBzZXJ2aWNlRmllbGRzS2V5cywgJF87CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQl9CQkJCQkJCgkJCQl9CgkJCX0KCQl9Cgl9CgkKCWZvciAoQHNlcnZpY2VGaWVsZHNLZXlzKSB7CgkJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+IHN1YnN0ciggJF8sIDMgKSkgLiAiOiA8L0I+IiAuICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuICI8QlIvPiI7Cgl9CQoJCgkkc2VydmljZUZpZWxkcyAuPSAiPEI+SVA6IDwvQj4iIC4gICRFTlZ7J1JFTU9URV9BRERSJ30gLiAiPEJSLz4iOwoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCUi8+PEJSLz4iOwoKCSMgRHluYW1pYyBGaWVsZHMKCW15ICR1c2VySURERjsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSR1c2VySURERiA9ICRTZWxmLT57RGVmYXVsdFVzZXJJRH07Cgl9IGVsc2UgewoJCSR1c2VySURERiA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpOwoJfQoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIGR5bmFtaWMgZmllbGRzIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCAzICkgZXEgIkRGXyIgKSB7CgkJCW15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAoJCQkJRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCggTmFtZSA9PiBzdWJzdHIoICRfLCAzICkgKSwKCQkJCU9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCgkJCQlWYWx1ZSAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSwKCQkJCVVzZXJJRCA9PiAkdXNlcklEREYsCgkJCSk7CgkJfQoJfQoKCSMgU2VydmljZSBGaWVsZHMgLSBUYWJsZSBmaWVsZHMKCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBzZXJ2aWNlIGZpZWxkcyAtIHRhYmxlIGZpZWxkcyIpOwoJbXkgJGxhc3RUYWIgPSAiIjsKCW15ICVrZXlzRm91bmQgPSAoKTsKCW15ICRuZXdUYWIgPSAxOwoJCglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDUgKSBlcSAiU0ZfVF8iICkgewoJCQlteSAkcGFyYW1OYW1lID0gJF87CgkJCW15IEBwYXJ0cyA9IHNwbGl0KCdfJywgJF8pOwoJCQlteSAkY3VyclRhYiA9ICRwYXJ0c1syXTsKCQkJbXkgJGN1cnJLZXkgPSAkcGFydHNbNF07CgkJCQoJCQlpZiAoJGN1cnJUYWIgbmUgJGxhc3RUYWIpIHsKCQkJCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJCQkJfQoJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUQUJMRSBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDcwMHB4OycgYm9yZGVyPScxcHgnPiI7CgkJCQkkbGFzdFRhYiA9ICRjdXJyVGFiOwoJCQkJJG5ld1RhYiA9IDE7CgkJCX0gZWxzZSB7CgkJCQkkbmV3VGFiID0gMDsKCQkJfQoJCQkKCQkJIyMgbmV3IGxpbmUgZHVlIHRvIHJlcGV0aXRpb24gb3IgbmV3IHRhYmxlCgkJCWlmICgka2V5c0ZvdW5keyRjdXJyS2V5fSB8fCAoJG5ld1RhYikgKSB7CgkJCQkla2V5c0ZvdW5kID0gKCk7CQkJCQoJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgQ09MU1BBTj0nMicgc3R5bGU9J3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiBsYXJnZSc+PEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gJGN1cnJUYWIpIC4gIjwvQj48L1REPjwvVFI+IjsgCgkJCX0KCQkJJGtleXNGb3VuZHskY3VycktleX0gPSAxOwoJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBzdHlsZT0nd2lkdGg6IDEwMHB4Oyc+PEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gJGN1cnJLZXkpIC4gIjwvQj48L1REPjxURD4iIC4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJHBhcmFtTmFtZSApIC4gIjwvVEQ+PC9UUj4iOwkJCQoJCX0KCX0KCQoJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7Cgl9CgkKCW15ICRib2R5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImRlc2NyaXB0aW9uIiApOwoKCSMgSW1hZ2VzCgkkU2VsZi0+RGVidWcoIkxvYWRpbmcgaW1hZ2VzIGZyb20gY2FjaGUiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJbXkgJENvbnRlbnRJRCA9ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9OwogICAgICAgIGlmICgkQ29udGVudElEICYmICggJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApICYmICggJHVwbG9hZGVkRmlsZS0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApKSB7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiByZXBsYWNpbmcgaW1hZ2UgVVJMIGluIGJvZHkgd2l0aCBhdHRhY2htZW50Iik7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBCb2R5OiAkYm9keSIpOwogICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbChUZXh0ID0+ICRDb250ZW50SUQsKTsKCQkJIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAkYm9keSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwogICAgICAgICAgICAkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogbmV3IGJvZHk6ICRib2R5Iik7CiAgICAgICAgfQoJfQoJCgkjIENyZWF0ZSBhcnRpY2xlCgkkU2VsZi0+RGVidWcoIkNyZWF0aW5nIGFydGljbGUiKTsKCW15ICRGdWxsTmFtZTsKCW15ICRFbWFpbDsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJEZ1bGxOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIm5hbWUiICk7CgkJJEVtYWlsICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApOwkJCgl9IGVsc2UgewoJCSRGdWxsTmFtZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59KTsKCQkkRW1haWwgICAgPSAkUGFyYW17VXNlckVtYWlsfTsKCX0KCQkKCW15ICRGcm9tICAgICA9ICJcIiRGdWxsTmFtZVwiIDwkRW1haWw+IjsKCW15ICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAoJCVRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAoJCUFydGljbGVUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAoJCVNlbmRlclR5cGUgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX0sCgkJRnJvbSAgICAgICAgICAgICA9PiAkRnJvbSwKCQlUbyAgICAgICAgICAgICAgID0+ICRRdWV1ZSwKCQlTdWJqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCUJvZHkgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKFN0cmluZyA9PiAkc2VydmljZUZpZWxkcyAuICRib2R5KSwKCQlNaW1lVHlwZSAgICAgICAgID0+ICRNaW1lVHlwZSwKCQlDaGFyc2V0ICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCgkJVXNlcklEICAgICAgICAgICA9PiAkdXNlcklEREYsCgkJSGlzdG9yeVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCgkJSGlzdG9yeUNvbW1lbnQgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKCQlBdXRvUmVzcG9uc2VUeXBlID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKQoJCT8gJ2F1dG8gcmVwbHknCgkJOiAnJywKCQlPcmlnSGVhZGVyID0+IHsKCQkJRnJvbSAgICA9PiAkRnJvbSwKCQkJVG8gICAgICA9PiAkUXVldWUsCgkJCVN1YmplY3QgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJCUJvZHkgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKFN0cmluZyA9PiAkc2VydmljZUZpZWxkcyAuICRib2R5KSwsCgkJfSwKCQlRdWV1ZSA9PiAkUXVldWUsCgkpOwoJCgkjIEF0dGFjaG1lbnRzCgkkU2VsZi0+RGVidWcoIkluY2x1ZGluZyBhdHRhY2htZW50cyIpOwoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJJFRpY2tldE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKCQkJRmlsZW5hbWUgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSwKCQkJQ29udGVudCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudH0sCgkJCUNvbnRlbnRUeXBlID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0sCgkJCUFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAoJCQlDb250ZW50SUQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH0sCgkJCVVzZXJJRCAgICA9PiAkdXNlcklEREYsCgkJKTsKCX0KCQoJJERhdGF7VGlja2V0TnVtYmVyfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCSMgYnVpbGQgb3V0cHV0CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJCSREYXRhe01vZHVsZX0gPSAicHVibGljIjsKCX0gZWxzZSB7CgkJJERhdGF7TW9kdWxlfSA9ICJjdXN0b21lciI7Cgl9CglpZiAoISAkcXVldWVGaXhlZCkgewoJCWRlbGV0ZSAkRGF0YXtRdWV1ZUlEfSAKCX0KCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCBUaXRsZSA9PiAiVGlja2V0IGNyZWF0ZWQiICk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKCQlEYXRhICAgICAgICAgPT4gXCVEYXRhLAoJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkVGlja2V0Q3JlYXRlZCcsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0OwoKfQoKPWhlYWQKSWYgcHVibGljIGludGVyZmFjZSB3YXMgdXNlZCwgdHJ5IHRvIGd1ZXNzIHRoZSB1c2VyIGZyb20gdGhlIGluZm9ybWVkIGUtbWFpbAo9Y3V0CnN1YiBHZXRVc2VySURGcm9tRW1haWwgewoJbXkgJFNlbGYgICAgICAgPSBzaGlmdDsKCW15ICRlbWFpbCAgICAgID0gc2hpZnQ7CglteSAkcmVzdWx0ICAgICA9ICRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9OwoJbXkgJGRvbWFpbkxpc3QgPSAkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufTsKCQoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCglpZiAoJGRvbWFpbkxpc3QpIHsKCQlteSBAZG9tYWlucyA9IHNwbGl0KCAiLCIsICRkb21haW5MaXN0ICk7CgkJCgkJZm9yIG15ICRkb21haW4gKEBkb21haW5zKSB7CgkJCW15IEBwYXJ0cyA9IHNwbGl0KCAiQCIsICRlbWFpbCApOwoJCQlpZiAoICRwYXJ0c1sxXSBlcSAkZG9tYWluICkgewoJCQkJbXkgJGlkICAgPSAkcGFydHNbMF07CgkJCQlteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAoJCQkJCVVzZXJMb2dpbiA9PiAkaWQsCgkJCQkJVmFsaWQgICAgID0+IDEsICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCwgZGVmYXVsdCAxCgkJCQkpOwoJCQkJaWYgKCBrZXlzICVMaXN0ICkgewoJCQkJCSRyZXN1bHQgPSAkaWQ7CgkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuICRyZXN1bHQ7Cn0KCj1oZWFkCkRlZmF1bHQgYWN0aW9uIHRvIG9wZW4gYSBuZXcgZm9ybSAoZnJvbnRlbmQgbWV0aG9kIHNoYXJlIGJ5IHB1YmxpYyBhbmQgY3VzdG9tZXIgZnJvbnRlbmQgbW9kdWxlcykKPWN1dApzdWIgT3BlbkZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsJCQoJbXkgJURhdGEgPSAoKTsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIHB1YmxpYyBmb3JtIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBhdXRoZW50aWNhdGVkIGZvcm0iKTsKCX0KCQoJbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kIik7CglteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIpOwoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSk7CgoJIyBCdWlsZCBvdXRwdXQKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCAgVGl0bGUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXcgdGlja2V0IHdpemFyZCIpICk7CgkJICAKCSMgTG9hZCBjdXJyZW50IG1haW50ZW5hbmNlcyAgCglteSBAbWFpbnRlbmFuY2VzID0gJE1haW50ZW5hbmNlT2JqZWN0LT5MaXN0Q3VycmVudE1haW50ZW5hbmNlcygpOwoJCQoJaWYgKEBtYWludGVuYW5jZXMpIHsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VzUGFuZWwnLAoJCSk7CQkKCQkJCgkJZm9yIG15ICRtYWludGVuYW5jZUhhc2ggKEBtYWludGVuYW5jZXMpIHsKCQkJbXkgJW1haW50ZW5hbmNlID0gJXskbWFpbnRlbmFuY2VIYXNofTsKCQkJCQkJCQoJCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJCU5hbWUgPT4gJ01haW50ZW5hbmNlTGluZScsCgkJCQlEYXRhID0+IHsKCQkJCQlNZXNzYWdlICAgPT4gJG1haW50ZW5hbmNleydEZXNjcmlwdGlvbid9LAkJCQkJCQoJCQkJCVN0YXJ0RGF0ZSA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5CcmF6aWxpYW5EYXRlKFRpbWVzdGFtcCA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5Gcm9tU1FMKFN0cmluZ0RhdGUgPT4gJG1haW50ZW5hbmNle1N0YXJ0RGF0ZX0pKSwKCQkJCX0pOwkJCQkJCQkKCQl9CQoJfQkJCgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJQdWJsaWMgdmlldyAtIHVuYXV0aGVudGljYXRlZCBtZXNzYWdlIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnVW5hdXRoZW50aWNhdGVkTWVzc2FnZScsCgkJKTsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gcHVibGljIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdUb29sQmFyUHVibGljJywKCQkpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiQ3VzdG9tZXIgdmlldyAtIGN1c3RvbWVyIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAkJCgkJCU5hbWUgPT4gJ1Rvb2xCYXJDdXN0b21lcicsCgkJKTsKCX0KCgkjIFByZXBhcmUgY2FjaGUgZm9yIGltYWdlbnMgYW5kIGF0dGFjaG1lbnRzCglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJJERhdGF7Rm9ybUlEfSA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQ3JlYXRlKCk7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJfQoKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmQnLAoJKTsKCQkKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQKU2VwYXJhdGUgc2VydmljZS1maWVsZCBsYWJlbCBuYW1lcywgdG8gbWFrZSBpdCBodW1hbi1yZWFkYWJsZSAoQ2FwaXRhbExpa2VMYWJlbHMgLT4gQ2FwaXRhbCBsaWtlIGxhYmVscykKPWN1dApzdWIgYnJlYWtXb3JkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJHJldHVybiA9ICRQYXJhbXtUZXh0fTsJCgkKCSRyZXR1cm4gPX4gcy8oLikoW0EtWl1bXkEtWl0pLyQxICQyL2c7CgkkcmV0dXJuID1+IHMvKFtcdyddKykvXHVcTCQxL2c7CgkKCXJldHVybiAkcmV0dXJuOwp9CgpzdWIgRGVidWcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRtc2cgPSBzaGlmdDsKCSRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpMb2ciKS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICRtc2cgKTsKfQoKCjE7Cg==</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgiW25hbWU9J3NlcnZpY2UnXSIpLnZhbCgkKCIjU2VydmljZUlEIikudmFsKCkpOwoJCSQoIltuYW1lPSdGb3JtSUQnXSIpLnZhbChmb3JtLmRhdGEuRm9ybUlEKTsKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJCQllZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0JCQkKCQl9LCAyMDAwKTsKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzKGFjdGl2ZVF1ZXVlKTsKfTsKCgp2YXIgcG9zdFJlbmRlckNhbGxiYWNrUHVibGljID0gZnVuY3Rpb24oZm9ybSkgewoJZm9ybU9wdGlvbnMgPSBmb3JtLm9wdGlvbnMuZmllbGRzOwoJZm9ybUFscGFjYSA9IGZvcm07CgkKCWlmIChmb3JtKSB7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigpOwoJCSQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.6</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.6">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-21 19:04:33</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbCI+CgkJCVslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJCTxsaT5bJSBEYXRhLk1lc3NhZ2UgJV0gKFslIFRyYW5zbGF0ZSgiU3RhcnRlZCBhdDogIikgfCBodG1sICVdIFslIERhdGEuU3RhcnREYXRlICVdKTwvbGk+CgkJCVslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZUxpbmUiKSAlXQoJCTwvb2w+CiAgCTwvZGl2PgogIAkKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZXNQYW5lbCIpICVdCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5Ij4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgRGF0YS5Nc2dDaG9vc2VTZXJ2aWNlICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGZvcm0+CgkJCTxzcGFuPgoJCSAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXToKICAgICAgICAgCTwvc3Bhbj4KCQkJPHNwYW4gaWQ9InNlcnZpY2VESVYiPgkKICAgICAgICAgCQlbJSBEYXRhLlNlcnZpY2VTdHJnICVdICAgICAgCiAgICAgICAgIAk8L3NwYW4+ICAgICAgICAgICAgICAKCQk8L2Zvcm0+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtZm9vdGVyIiBpZD0ic2VydmljZURlc2NyaXB0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQoJCQlbJSBUcmFuc2xhdGUoIkRpZCB5b3Uga25vdyB0aGF0LCBpZiB5b3UgaGF2ZSBhIGxvZ2luLCB5b3UgY2FuIGF1dGhlbnRpY2F0ZSBmaXJzdCBhbmQgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG5hbWUgYW5kIGUtbWFpbC4gQWxzbywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBtb25pdG9yIHlvdXIgdGlja2V0IGxhdGVyLiIpIHwgaHRtbCAlXToKCQkJPEEgdGFyZ2V0PSJfbmV3IiBIUkVGPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gYXV0aGVudGljYXRlIikgfCBodG1sICVdPC9BPgpbJSBSZW5kZXJCbG9ja0VuZCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQkJCgk8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImZvcm1QYW5lbCI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiIGlkPSJmb3JtVGlja2V0Ij4KCQoJPC9kaXY+CjwvZGl2PgogCiA8c2NyaXB0IHNyYz0iWyUgQ29uZmlnKCJGcm9udGVuZDo6UmljaFRleHRQYXRoIikgJV1ja2VkaXRvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIApbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCS8vIFRvIHR1cm4gb24gZGVidWdnaW5nLCB1bmNvbW1lbnQgdGhpcyBsaW5lCgkvL0FscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRzsKCS8vQWxwYWNhLnVwbG9hZEltYWdlVVJMID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJnJlc3BvbnNlVHlwZT1qc29uJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CgkvL0FscGFjYS5maWxlYnJvd3NlckltYWdlVXBsb2FkVVJMID0gIi9vdHJzL2N1c3RvbWVyLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CglDS0VESVRPUi5jb25maWcuZmlsZWJyb3dzZXJVcGxvYWRVcmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1QaWN0dXJlVXBsb2FkJnJlc3BvbnNlVHlwZT1qc29uJkZvcm1JRD1bJSBEYXRhLkZvcm1JRCAlXSI7CgkKCSQuYWxwYWNhLnNldERlZmF1bHRMb2NhbGUoInB0X0JSIik7CgkJCQoJJC5hbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkJIm5vbmVMYWJlbCI6ICItIiwKCX0pOwoJCgkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKCSAgIAkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIsICJbJSBEYXRhLkZvcm1JRCAlXSIpOwogICAJCQkkKCIjZm9ybVBhbmVsIikuc2hvdygpOwogICAJCX0gZWxzZSB7CiAgIAkJCWRlc3RydWlyRm9ybSgpOwogICAJCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbCgiIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5oaWRlKCk7CiAgIAkJfSAgCQogIAl9KTsKICAJCiAgIAlpZiAoJCgiI1NlcnZpY2VJRCIpLmhhcygnW3NlbGVjdGVkXScpKSB7CiAgCQlpZiAoJCgiI1NlcnZpY2VJRCIpLnZhbCgpICE9ICIiKSB7CiAgCQkJY2FycmVnYUZvcm1bJSBEYXRhLlB1YmxpY01vZGUgJV0oeyJGb3JtSUQiOiAiWyUgRGF0YS5Gb3JtSUQgJV0ifSwgIlslIFRyYW5zbGF0ZSgiU2VuZCIpIHwgaHRtbCAlXSIsICJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiwgIjtRdWV1ZUlEPVslIERhdGEuUXVldWVJRCAlXSIsICJbJSBEYXRhLkZvcm1JRCAlXSIpOwogIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7ICAJCQkgIAkJCQogIAkJfQogIAl9Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lTDo6U3lzdGVtOjpUaWNrZXQiLAoiS2VybmVMOjpTeXN0ZW06OlR5cGUiLAoiS2VybmVsOjpTeXN0ZW06OllBTSIsCiJLZXJuZWw6OkNvbmZpZyIsCiJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIiwKIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlRm9ybSIsCiJLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcyIgKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKUmV0dXJucyBmaWVsZHMgc3RydWN0dXJlIGZvciBuZXcgdGlja2V0IGZvcm0gd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnNQdWJsaWMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQgcHVibGljCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYVB1YmxpY307Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZAo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc09wdGlvbnMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljRm9ybX07Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHNjaGVtYSBmb3IgbmV3IHRpY2tldCB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNTY2hlbWEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCXJldHVybiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKS0+e0Jhc2ljU2NoZW1hfTsKfQoKPWhlYWQKUmVwbGFjZXMgT1RSUyBzeXN0ZW0gZmllbGQgdmFsdWVzIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBSZXBsYWNlT1RSU1ZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKSA9ICRTZWxmLT5HZXRPVFJTU2VydmljZXNEYXRhKCk7Cgkkc2NoZW1hICA9fiBzL09UUlNfc2VydmljZV92YWx1ZXMvJHNlcnZpY2VJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU19zZXJ2aWNlX2xhYmVscy8kc2VydmljZU5hbWVzL2c7CgoJbXkgKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApID0gJFNlbGYtPkdldE9UUlNUeXBlc0RhdGEoVXNlcklEID0+ICRQYXJhbXtVc2VySUR9KTsKCSRzY2hlbWEgID1+IHMvT1RSU190eXBlX3ZhbHVlcy8kdHlwZUlEcy9nOwoJJG9wdGlvbnMgPX4gcy9PVFJTX3R5cGVfbGFiZWxzLyR0eXBlTmFtZXMvZzsKCglyZXR1cm4gKCAkc2NoZW1hLCAkb3B0aW9ucyApOwp9Cgo9aGVhZApHZXQgT1RSUyBzZXJ2aWNlcyBpbmZvIChzZXJ2aWNlIGFuZCB0eXBlKQo9Y3V0CnN1YiBHZXRPVFJTU2VydmljZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2VydmljZXMgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIpOwoKCW15ICVzZXJ2aWNlTGlzdCA9ICRzZXJ2aWNlcy0+U2VydmljZUxpc3QoIFZhbGlkID0+IDEsIFVzZXJJRCA9PiAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpLT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSApOwoJbXkgJHNlcnZpY2VOYW1lcyA9ICIiOwoJbXkgJHNlcnZpY2VJRHMgICA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkc2VydmljZUxpc3R7JGF9IGNtcCAkc2VydmljZUxpc3R7JGJ9ICkgfSBrZXlzICVzZXJ2aWNlTGlzdCApIHsKCQkkc2VydmljZU5hbWVzIC49ICJcIiRzZXJ2aWNlTGlzdHskX31cIiwiOwoJCSRzZXJ2aWNlSURzICAgLj0gIiRfLCI7Cgl9Cgkkc2VydmljZU5hbWVzID0gc3Vic3RyKCRzZXJ2aWNlTmFtZXMsIDAsIC0xKTsKCSRzZXJ2aWNlSURzID0gc3Vic3RyKCRzZXJ2aWNlSURzLCAwLCAtMSk7CglyZXR1cm4gKCAkc2VydmljZU5hbWVzLCAkc2VydmljZUlEcyApOwp9Cgo9aGVhZApHZXQgT1RSUyB0aWNrZXQgdHlwZXMgCj1jdXQKc3ViIEdldE9UUlNUeXBlc0RhdGEgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICR0aWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CgoJbXkgJXR5cGVMaXN0ICA9ICR0aWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KCBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0gKTsKCW15ICR0eXBlTmFtZXMgPSAiIjsKCW15ICR0eXBlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHR5cGVMaXN0eyRhfSBjbXAgJHR5cGVMaXN0eyRifSApIH0ga2V5cyAldHlwZUxpc3QgKSB7CgkJaWYgKGluZGV4KCR0eXBlTGlzdHskX30sICc6OicpID09IC0xKSB7CgkJCSR0eXBlTmFtZXMgLj0gIlwiJHR5cGVMaXN0eyRffVwiLCI7CgkJCSR0eXBlSURzICAgLj0gIiRfLCI7CgkJfQoJfQoJCgkkdHlwZU5hbWVzID0gc3Vic3RyKCR0eXBlTmFtZXMsIDAsIC0xKTsKCSR0eXBlSURzID0gc3Vic3RyKCR0eXBlSURzLCAwLCAtMSk7CgkKCXJldHVybiAoICR0eXBlTmFtZXMsICR0eXBlSURzICk7Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgZHluYW1pYyBmaWVsZHMKPWN1dApzdWIgUmVwbGFjZU9UUlNEeW5hbWljRmllbGRzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkc2NoZW1hICA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJG9wdGlvbnMgPSAkUGFyYW17T3B0aW9uc307CgoJbXkgJGRmaWVsZHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSBAZGZpZWxkTGlzdCA9IEB7ICRkZmllbGRzLT5EeW5hbWljRmllbGRMaXN0R2V0KCBWYWxpZCA9PiAxICkgfTsKCglmb3JlYWNoIChAZGZpZWxkTGlzdCkgewoJCW15ICRjYW1wbyA9ICRfOwoKCQlteSAkbmFtZSAgICAgICAgICA9ICRjYW1wby0+e05hbWV9OwoJCW15ICRjb25maWcgICAgICAgID0gJGNhbXBvLT57Q29uZmlnfTsKCQlteSAkdHlwZSAgICAgICAgICA9ICRjYW1wby0+e0ZpZWxkVHlwZX07CgkJbXkgJGlkRmllbGRWYWx1ZXMgPSAiREZfIiAuICRuYW1lIC4gIl92YWx1ZXMiOwoJCW15ICRpZEZpZWxkTGFiZWxzID0gIkRGXyIgLiAkbmFtZSAuICJfbGFiZWxzIjsKCQlpZiAoICR0eXBlIGVxICJEcm9wZG93biIgKSB7CgkJCW15ICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKSA9ICRTZWxmLT5HZXREeW5hbWljRmllbGRWYWx1ZXMoIENvbmZpZ0RGID0+ICRjb25maWcgKTsKCQkJJHNjaGVtYSAgPX4gcy8kaWRGaWVsZFZhbHVlcy8kZGZWYWx1ZXMvZzsKCQkJJG9wdGlvbnMgPX4gcy8kaWRGaWVsZExhYmVscy8kZGZMYWJlbHMvZzsKCQl9Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgZHlhbm1pYyBmaWVsZCB2YWx1ZXMKPWN1dApzdWIgR2V0RHluYW1pY0ZpZWxkVmFsdWVzIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkY29uZmlnID0gJFBhcmFte0NvbmZpZ0RGfTsKCW15ICR2YWx1ZXMgPSAkY29uZmlnLT57UG9zc2libGVWYWx1ZXN9OwoKCW15ICRkZlZhbHVlcyA9ICIiOwoJbXkgJGRmTGFiZWxzID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR2YWx1ZXMtPnskYX0gY21wICR2YWx1ZXMtPnskYn0gKSB9IGtleXMgJXskdmFsdWVzfSApIHsKCQkkZGZWYWx1ZXMgLj0gIlwiJF9cIiwiOwoJCSRkZkxhYmVscyAuPSAiXCIkdmFsdWVzLT57JF99XCIsIjsKCX0KCgkkZGZWYWx1ZXMgPSBzdWJzdHIoJGRmVmFsdWVzLCAwLCAtMSk7CgkkZGZMYWJlbHMgPSBzdWJzdHIoJGRmTGFiZWxzLCAwLCAtMSk7CglyZXR1cm4gKCAkZGZWYWx1ZXMsICRkZkxhYmVscyApOwoKfQoKPWhlYWQKQnVpbGRzIHNlcnZpY2UgY2hvb3NpbmcgY29tYm8KPWN1dApzdWIgQnVpbGRTZXJ2aWNlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRRdWV1ZVNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWVTZXJ2aWNlIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgaWQ9XCJTZXJ2aWNlSURcIiBkYXRhLWxpdmUtc2VhcmNoLW5vcm1hbGl6ZT1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGRhdGEtbGl2ZS1zZWFyY2g9XCJ0cnVlXCI+XG48b3B0aW9uIHZhbHVlPVwiXCI+LTwvb3B0aW9uPiI7CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGlvbiB2YWx1ZT0nIiAuICRzZXJ2aWNlLT57S2V5fSAuICInPiIgLiAkU2VsZi0+TGFzdFBhcnQoJHNlcnZpY2UtPntWYWx1ZX0pIC4gIjwvb3B0aW9uPlxuIjsKCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoJCQoJCSMgU2V0IGZpeGVkIGZpZWxkIHZhbHVlcywgaWYgZGVmaW5lZAoJCWlmICgkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KSB7CgkJCSgkc2NoZW1hLCAkZmllbGRzKSA9ICRTZWxmLT5BZGp1c3RGaXhlZEZpZWxkcyhTY2hlbWEgPT4gJHNjaGVtYSwgRmllbGRzID0+ICRmaWVsZHMsIEZpeGVkVmFsdWVzID0+ICRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pOwoJCX0JCgl9CgkKCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNEeW5hbWljRmllbGRzKCBTY2hlbWEgPT4gJHNjaGVtYSwgT3B0aW9ucyA9PiAkZmllbGRzICk7CgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgkJCQkJCQkJCQkKCQlteSAka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJbXkgJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIicgLiAnOiB7InR5cGUiOiAic3RyaW5nIiwgImRlZmF1bHQiOiAiJyAuICRmaXhlZFZhbHVlIC4gJyJ9JzsKCQkKCQkkc2NoZW1hID1+IHMvJGtleS8kcmVwbGFjZS87CgkJCgkJJGtleSA9ICcoIicgLiAkZmllbGRLZXkgLiAnIltcIF0/OltcIF0/e1tefV0rfSknOwoJCSRyZXBsYWNlID0gJyInIC4gJGZpZWxkS2V5IC4gJyI6IHsidHlwZSI6ICJoaWRkZW4iJyAuICJcbn0iOwoJCSRmb3JtID1+IHMvJGtleS8kcmVwbGFjZS87Cgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJIyBDaGVjayBpZiBxdWV1ZSB3YXMgcHJlLWRlZmluZWQKCW15ICRxdWV1ZUZpeGVkID0gMDsKCWlmICgkRGF0YXtRdWV1ZUlEfSkgewoJCSRxdWV1ZUZpeGVkID0gMTsKCX0JCgkKCSMgR2V0IHF1ZXVlIG5hbWUgYW5kIGlkIHVzaW5nIHJ1bGVzLCBpZiBubyBxdWV1ZSB3YXMgcHJlZGVmaW5lZAoJbXkgKCAkUXVldWUsICRRdWV1ZUlEICkgPSAkVGlja2V0V2l6YXJkLT5HZXRRdWV1ZUlEKCVQYXJhbSk7CgkkRGF0YXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKCSMgTW9kdWxlIGNvbmZpZwoJJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCgkjIFRpY2tldCBjcmVhdGlvbgoJbXkgJGN1c3RvbWVySUQ7CglteSAkY3VzdG9tZXJVc2VyOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkY3VzdG9tZXJJRCA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJCSRjdXN0b21lclVzZXIgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCX0gZWxzZSB7CgkJJGN1c3RvbWVySUQgPSAkUGFyYW17Q3VzdG9tZXJJRH07CgkJJGN1c3RvbWVyVXNlciA9ICRQYXJhbXtDdXN0b21lclVzZXJ9OwoJfQoJCgkkU2VsZi0+RGVidWcoIkNyZWF0aW5nIHRpY2tldCIpOwoJbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAoJCVRpdGxlICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJUXVldWVJRCAgICA9PiAkUXVldWVJRCwKCQlQcmlvcml0eSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0sCgkJTG9jayAgICAgICA9PiAndW5sb2NrJywKCQlTdGF0ZSAgICAgID0+ICduZXcnLAoJCVNlcnZpY2VJRCAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInNlcnZpY2UiICksCgkJVHlwZUlEICAgICA9PiRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJ0eXBlIiApLAoJCUN1c3RvbWVySUQgPT4gJGN1c3RvbWVySUQsCgkJQ3VzdG9tZXJVc2VyID0+ICRjdXN0b21lclVzZXIsCgkJT3duZXJJRCA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJCVVzZXJJRCAgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCSk7CgkkU2VsZi0+RGVidWcoIkNyZWF0ZWQgdGlja2V0IElEICRUaWNrZXRJRCIpOwoKCW15ICRNaW1lVHlwZSAgICAgID0gJ3RleHQvaHRtbCc7CglteSAlc2VydmljZUZpZWxkc1ZhbHVlcyA9ICgpOwoJbXkgJHNlcnZpY2VGaWVsZHMgPSAiIjsKCW15IEBzZXJ2aWNlRmllbGRzS2V5cyA9ICgpOwoKCSMgU2VydmljZSBGaWVsZHMKCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBzZXJ2aWNlIGZvcm0gdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoKCBzdWJzdHIoICRfLCAwLCAzICkgZXEgIlNGXyIgKSAmJiAoIHN1YnN0ciggJF8sIDAsIDUgKSBuZSAiU0ZfVF8iICkpIHsKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICkpIHsKCQkJCW15IEBwYXJhbVZhbHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApOwkJCQkKCQkJCWZvciBteSAkcGFyYW1WYWx1ZSAoQHBhcmFtVmFscykgewoJCQkJCWlmICgoJHBhcmFtVmFsdWUpICYmICghKCRwYXJhbVZhbHVlIGVxICItIikpKSB7CgkJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCQlwdXNoIEBzZXJ2aWNlRmllbGRzS2V5cywgJF87CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQkJCQkKCQkJfSBlbHNlIHsKCQkJCW15ICRwYXJhbVZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsgCgkJCQkKCQkJCWlmICgoJHBhcmFtVmFsdWUpICYmICghKCRwYXJhbVZhbHVlIGVxICItIikpKSB7CgkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQlwdXNoIEBzZXJ2aWNlRmllbGRzS2V5cywgJF87CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQl9CQkJCQkJCgkJCQl9CgkJCX0KCQl9Cgl9CgkKCWZvciAoQHNlcnZpY2VGaWVsZHNLZXlzKSB7CgkJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+IHN1YnN0ciggJF8sIDMgKSkgLiAiOiA8L0I+IiAuICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuICI8QlIvPiI7Cgl9CQoJCgkkc2VydmljZUZpZWxkcyAuPSAiPEI+SVA6IDwvQj4iIC4gICRFTlZ7J1JFTU9URV9BRERSJ30gLiAiPEJSLz4iOwoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCUi8+PEJSLz4iOwoKCSMgRHluYW1pYyBGaWVsZHMKCW15ICR1c2VySURERjsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSR1c2VySURERiA9ICRTZWxmLT57RGVmYXVsdFVzZXJJRH07Cgl9IGVsc2UgewoJCSR1c2VySURERiA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpOwoJfQoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIGR5bmFtaWMgZmllbGRzIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCAzICkgZXEgIkRGXyIgKSB7CgkJCW15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAoJCQkJRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCggTmFtZSA9PiBzdWJzdHIoICRfLCAzICkgKSwKCQkJCU9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCgkJCQlWYWx1ZSAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSwKCQkJCVVzZXJJRCA9PiAkdXNlcklEREYsCgkJCSk7CgkJfQoJfQoKCSMgU2VydmljZSBGaWVsZHMgLSBUYWJsZSBmaWVsZHMKCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBzZXJ2aWNlIGZpZWxkcyAtIHRhYmxlIGZpZWxkcyIpOwoJbXkgJGxhc3RUYWIgPSAiIjsKCW15ICVrZXlzRm91bmQgPSAoKTsKCW15ICRuZXdUYWIgPSAxOwoJCglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDUgKSBlcSAiU0ZfVF8iICkgewoJCQlteSAkcGFyYW1OYW1lID0gJF87CgkJCW15IEBwYXJ0cyA9IHNwbGl0KCdfJywgJF8pOwoJCQlteSAkY3VyclRhYiA9ICRwYXJ0c1syXTsKCQkJbXkgJGN1cnJLZXkgPSAkcGFydHNbNF07CgkJCQoJCQlpZiAoJGN1cnJUYWIgbmUgJGxhc3RUYWIpIHsKCQkJCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJCQkJfQoJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUQUJMRSBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDcwMHB4OycgYm9yZGVyPScxcHgnPiI7CgkJCQkkbGFzdFRhYiA9ICRjdXJyVGFiOwoJCQkJJG5ld1RhYiA9IDE7CgkJCX0gZWxzZSB7CgkJCQkkbmV3VGFiID0gMDsKCQkJfQoJCQkKCQkJIyMgbmV3IGxpbmUgZHVlIHRvIHJlcGV0aXRpb24gb3IgbmV3IHRhYmxlCgkJCWlmICgka2V5c0ZvdW5keyRjdXJyS2V5fSB8fCAoJG5ld1RhYikgKSB7CgkJCQkla2V5c0ZvdW5kID0gKCk7CQkJCQoJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgQ09MU1BBTj0nMicgc3R5bGU9J3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiBsYXJnZSc+PEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gJGN1cnJUYWIpIC4gIjwvQj48L1REPjwvVFI+IjsgCgkJCX0KCQkJJGtleXNGb3VuZHskY3VycktleX0gPSAxOwoJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBzdHlsZT0nd2lkdGg6IDEwMHB4Oyc+PEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gJGN1cnJLZXkpIC4gIjwvQj48L1REPjxURD4iIC4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJHBhcmFtTmFtZSApIC4gIjwvVEQ+PC9UUj4iOwkJCQoJCX0KCX0KCQoJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7Cgl9CgkKCW15ICRib2R5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImRlc2NyaXB0aW9uIiApOwoKCSMgSW1hZ2VzCgkkU2VsZi0+RGVidWcoIkxvYWRpbmcgaW1hZ2VzIGZyb20gY2FjaGUiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJbXkgJENvbnRlbnRJRCA9ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9OwogICAgICAgIGlmICgkQ29udGVudElEICYmICggJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApICYmICggJHVwbG9hZGVkRmlsZS0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApKSB7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiByZXBsYWNpbmcgaW1hZ2UgVVJMIGluIGJvZHkgd2l0aCBhdHRhY2htZW50Iik7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBCb2R5OiAkYm9keSIpOwogICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbChUZXh0ID0+ICRDb250ZW50SUQsKTsKCQkJIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAkYm9keSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwogICAgICAgICAgICAkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogbmV3IGJvZHk6ICRib2R5Iik7CiAgICAgICAgfQoJfQoJCgkjIENyZWF0ZSBhcnRpY2xlCgkkU2VsZi0+RGVidWcoIkNyZWF0aW5nIGFydGljbGUiKTsKCW15ICRGdWxsTmFtZTsKCW15ICRFbWFpbDsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJEZ1bGxOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIm5hbWUiICk7CgkJJEVtYWlsICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApOwkJCgl9IGVsc2UgewoJCSRGdWxsTmFtZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59KTsKCQkkRW1haWwgICAgPSAkUGFyYW17VXNlckVtYWlsfTsKCX0KCQkKCW15ICRGcm9tICAgICA9ICJcIiRGdWxsTmFtZVwiIDwkRW1haWw+IjsKCW15ICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAoJCVRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAoJCUFydGljbGVUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAoJCVNlbmRlclR5cGUgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX0sCgkJRnJvbSAgICAgICAgICAgICA9PiAkRnJvbSwKCQlUbyAgICAgICAgICAgICAgID0+ICRRdWV1ZSwKCQlTdWJqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCUJvZHkgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKFN0cmluZyA9PiAkc2VydmljZUZpZWxkcyAuICRib2R5KSwKCQlNaW1lVHlwZSAgICAgICAgID0+ICRNaW1lVHlwZSwKCQlDaGFyc2V0ICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCgkJVXNlcklEICAgICAgICAgICA9PiAkdXNlcklEREYsCgkJSGlzdG9yeVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCgkJSGlzdG9yeUNvbW1lbnQgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKCQlBdXRvUmVzcG9uc2VUeXBlID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKQoJCT8gJ2F1dG8gcmVwbHknCgkJOiAnJywKCQlPcmlnSGVhZGVyID0+IHsKCQkJRnJvbSAgICA9PiAkRnJvbSwKCQkJVG8gICAgICA9PiAkUXVldWUsCgkJCVN1YmplY3QgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJCUJvZHkgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKFN0cmluZyA9PiAkc2VydmljZUZpZWxkcyAuICRib2R5KSwsCgkJfSwKCQlRdWV1ZSA9PiAkUXVldWUsCgkpOwoJCgkjIEF0dGFjaG1lbnRzCgkkU2VsZi0+RGVidWcoIkluY2x1ZGluZyBhdHRhY2htZW50cyIpOwoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJJFRpY2tldE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKCQkJRmlsZW5hbWUgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSwKCQkJQ29udGVudCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudH0sCgkJCUNvbnRlbnRUeXBlID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0sCgkJCUFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAoJCQlDb250ZW50SUQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH0sCgkJCVVzZXJJRCAgICA9PiAkdXNlcklEREYsCgkJKTsKCX0KCQoJJERhdGF7VGlja2V0TnVtYmVyfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCSMgYnVpbGQgb3V0cHV0CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJCSREYXRhe01vZHVsZX0gPSAicHVibGljIjsKCX0gZWxzZSB7CgkJJERhdGF7TW9kdWxlfSA9ICJjdXN0b21lciI7Cgl9CglpZiAoISAkcXVldWVGaXhlZCkgewoJCWRlbGV0ZSAkRGF0YXtRdWV1ZUlEfSAKCX0KCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCBUaXRsZSA9PiAiVGlja2V0IGNyZWF0ZWQiICk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKCQlEYXRhICAgICAgICAgPT4gXCVEYXRhLAoJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkVGlja2V0Q3JlYXRlZCcsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0OwoKfQoKPWhlYWQKSWYgcHVibGljIGludGVyZmFjZSB3YXMgdXNlZCwgdHJ5IHRvIGd1ZXNzIHRoZSB1c2VyIGZyb20gdGhlIGluZm9ybWVkIGUtbWFpbAo9Y3V0CnN1YiBHZXRVc2VySURGcm9tRW1haWwgewoJbXkgJFNlbGYgICAgICAgPSBzaGlmdDsKCW15ICRlbWFpbCAgICAgID0gc2hpZnQ7CglteSAkcmVzdWx0ICAgICA9ICRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9OwoJbXkgJGRvbWFpbkxpc3QgPSAkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufTsKCQoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCglpZiAoJGRvbWFpbkxpc3QpIHsKCQlteSBAZG9tYWlucyA9IHNwbGl0KCAiLCIsICRkb21haW5MaXN0ICk7CgkJCgkJZm9yIG15ICRkb21haW4gKEBkb21haW5zKSB7CgkJCW15IEBwYXJ0cyA9IHNwbGl0KCAiQCIsICRlbWFpbCApOwoJCQlpZiAoICRwYXJ0c1sxXSBlcSAkZG9tYWluICkgewoJCQkJbXkgJGlkICAgPSAkcGFydHNbMF07CgkJCQlteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAoJCQkJCVVzZXJMb2dpbiA9PiAkaWQsCgkJCQkJVmFsaWQgICAgID0+IDEsICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCwgZGVmYXVsdCAxCgkJCQkpOwoJCQkJaWYgKCBrZXlzICVMaXN0ICkgewoJCQkJCSRyZXN1bHQgPSAkaWQ7CgkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuICRyZXN1bHQ7Cn0KCj1oZWFkCkRlZmF1bHQgYWN0aW9uIHRvIG9wZW4gYSBuZXcgZm9ybSAoZnJvbnRlbmQgbWV0aG9kIHNoYXJlIGJ5IHB1YmxpYyBhbmQgY3VzdG9tZXIgZnJvbnRlbmQgbW9kdWxlcykKPWN1dApzdWIgT3BlbkZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsJCQoJbXkgJURhdGEgPSAoKTsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIHB1YmxpYyBmb3JtIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBhdXRoZW50aWNhdGVkIGZvcm0iKTsKCX0KCQoJbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kIik7CglteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIpOwoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSk7CgoJIyBCdWlsZCBvdXRwdXQKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCAgVGl0bGUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXcgdGlja2V0IHdpemFyZCIpICk7CgkJICAKCSMgTG9hZCBjdXJyZW50IG1haW50ZW5hbmNlcyAgCglteSBAbWFpbnRlbmFuY2VzID0gJE1haW50ZW5hbmNlT2JqZWN0LT5MaXN0Q3VycmVudE1haW50ZW5hbmNlcygpOwoJCQoJaWYgKEBtYWludGVuYW5jZXMpIHsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VzUGFuZWwnLAoJCSk7CQkKCQkJCgkJZm9yIG15ICRtYWludGVuYW5jZUhhc2ggKEBtYWludGVuYW5jZXMpIHsKCQkJbXkgJW1haW50ZW5hbmNlID0gJXskbWFpbnRlbmFuY2VIYXNofTsKCQkJCQkJCQoJCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJCU5hbWUgPT4gJ01haW50ZW5hbmNlTGluZScsCgkJCQlEYXRhID0+IHsKCQkJCQlNZXNzYWdlICAgPT4gJG1haW50ZW5hbmNleydEZXNjcmlwdGlvbid9LAkJCQkJCQoJCQkJCVN0YXJ0RGF0ZSA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5CcmF6aWxpYW5EYXRlKFRpbWVzdGFtcCA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5Gcm9tU1FMKFN0cmluZ0RhdGUgPT4gJG1haW50ZW5hbmNle1N0YXJ0RGF0ZX0pKSwKCQkJCX0pOwkJCQkJCQkKCQl9CQoJfQkJCgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJQdWJsaWMgdmlldyAtIHVuYXV0aGVudGljYXRlZCBtZXNzYWdlIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnVW5hdXRoZW50aWNhdGVkTWVzc2FnZScsCgkJKTsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gcHVibGljIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdUb29sQmFyUHVibGljJywKCQkpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiQ3VzdG9tZXIgdmlldyAtIGN1c3RvbWVyIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAkJCgkJCU5hbWUgPT4gJ1Rvb2xCYXJDdXN0b21lcicsCgkJKTsKCX0KCgkjIFByZXBhcmUgY2FjaGUgZm9yIGltYWdlbnMgYW5kIGF0dGFjaG1lbnRzCglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJJERhdGF7Rm9ybUlEfSA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQ3JlYXRlKCk7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJfQoKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmQnLAoJKTsKCQkKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQKU2VwYXJhdGUgc2VydmljZS1maWVsZCBsYWJlbCBuYW1lcywgdG8gbWFrZSBpdCBodW1hbi1yZWFkYWJsZSAoQ2FwaXRhbExpa2VMYWJlbHMgLT4gQ2FwaXRhbCBsaWtlIGxhYmVscykKPWN1dApzdWIgYnJlYWtXb3JkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJHJldHVybiA9ICRQYXJhbXtUZXh0fTsJCgkKCSRyZXR1cm4gPX4gcy8oLikoW0EtWl1bXkEtWl0pLyQxICQyL2c7CgkkcmV0dXJuID1+IHMvKFtcdyddKykvXHVcTCQxL2c7CgkKCXJldHVybiAkcmV0dXJuOwp9CgpzdWIgRGVidWcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRtc2cgPSBzaGlmdDsKCSRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpMb2ciKS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICRtc2cgKTsKfQoKCjE7Cg==</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgiW25hbWU9J3NlcnZpY2UnXSIpLnZhbCgkKCIjU2VydmljZUlEIikudmFsKCkpOwoJCSQoIltuYW1lPSdGb3JtSUQnXSIpLnZhbChmb3JtLmRhdGEuRm9ybUlEKTsKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJCQllZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0JCQkKCQl9LCAyMDAwKTsKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzKGFjdGl2ZVF1ZXVlKTsKfTsKCgp2YXIgcG9zdFJlbmRlckNhbGxiYWNrUHVibGljID0gZnVuY3Rpb24oZm9ybSkgewoJZm9ybU9wdGlvbnMgPSBmb3JtLm9wdGlvbnMuZmllbGRzOwoJZm9ybUFscGFjYSA9IGZvcm07CgkKCWlmIChmb3JtKSB7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigpOwoJCSQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.7</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.7">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-22 17:35:09</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbCI+CgkJCVslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJCTxsaT5bJSBEYXRhLk1lc3NhZ2UgJV0gKFslIFRyYW5zbGF0ZSgiU3RhcnRlZCBhdDogIikgfCBodG1sICVdIFslIERhdGEuU3RhcnREYXRlICVdKTwvbGk+CgkJCVslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZUxpbmUiKSAlXQoJCTwvb2w+CiAgCTwvZGl2PgogIAkKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZXNQYW5lbCIpICVdCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5Ij4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgRGF0YS5Nc2dDaG9vc2VTZXJ2aWNlICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJCTxsYWJlbCBmb3I9IlNlcnZpY2VJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CgkJCTxzcGFuIGlkPSJzZXJ2aWNlRElWIj4JCiAgICAgICAgIAkJWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXSAgICAgIAogICAgICAgICAJPC9zcGFuPiAgICAgICAgICAgICAgCgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtZm9vdGVyIiBpZD0ic2VydmljZURlc2NyaXB0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQoJCQlbJSBUcmFuc2xhdGUoIkRpZCB5b3Uga25vdyB0aGF0LCBpZiB5b3UgaGF2ZSBhIGxvZ2luLCB5b3UgY2FuIGF1dGhlbnRpY2F0ZSBmaXJzdCBhbmQgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG5hbWUgYW5kIGUtbWFpbC4gQWxzbywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBtb25pdG9yIHlvdXIgdGlja2V0IGxhdGVyLiIpIHwgaHRtbCAlXToKCQkJPEEgdGFyZ2V0PSJfbmV3IiBIUkVGPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gYXV0aGVudGljYXRlIikgfCBodG1sICVdPC9BPgpbJSBSZW5kZXJCbG9ja0VuZCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQkJCgk8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImZvcm1QYW5lbCI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiIGlkPSJmb3JtVGlja2V0Ij4KCQoJPC9kaXY+CjwvZGl2PgogCiA8c2NyaXB0IHNyYz0iWyUgQ29uZmlnKCJGcm9udGVuZDo6UmljaFRleHRQYXRoIikgJV1ja2VkaXRvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIApbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCUNLRURJVE9SLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmcmVzcG9uc2VUeXBlPWpzb24mRm9ybUlEPVslIERhdGEuRm9ybUlEICVdIjsKCQoJJC5hbHBhY2Euc2V0RGVmYXVsdExvY2FsZSgobmF2aWdhdG9yLmxhbmd1YWdlcyA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiAobmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpKS5yZXBsYWNlKCItIiwiXyIpKTsKCQkJCgkkLmFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKCQkibm9uZUxhYmVsIjogIi0iLAoJfSk7CgkKCSQoIiNTZXJ2aWNlSUQiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewoJICAgCQljYXJyZWdhRm9ybVslIERhdGEuUHVibGljTW9kZSAlXSh7IkZvcm1JRCI6ICJbJSBEYXRhLkZvcm1JRCAlXSJ9LCAiWyUgVHJhbnNsYXRlKCJTZW5kIikgfCBodG1sICVdIiwgIlslIEVudigiQ0dJSGFuZGxlIikgJV0iLCAiO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEICVdIiwgIlslIERhdGEuRm9ybUlEICVdIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7CiAgIAkJfSBlbHNlIHsKICAgCQkJZGVzdHJ1aXJGb3JtKCk7CiAgIAkJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKCIiKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLmhpZGUoKTsKICAgCQl9ICAJCiAgCX0pOwogIAkKICAgCWlmICgkKCIjU2VydmljZUlEIikuaGFzKCdbc2VsZWN0ZWRdJykpIHsKICAJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKICAJCQljYXJyZWdhRm9ybVslIERhdGEuUHVibGljTW9kZSAlXSh7IkZvcm1JRCI6ICJbJSBEYXRhLkZvcm1JRCAlXSJ9LCAiWyUgVHJhbnNsYXRlKCJTZW5kIikgfCBodG1sICVdIiwgIlslIEVudigiQ0dJSGFuZGxlIikgJV0iLCAiO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEICVdIiwgIlslIERhdGEuRm9ybUlEICVdIik7CiAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsgIAkJCSAgCQkJCiAgCQl9CiAgCX0KICAJCiAgCSQoIiNSZXNwb25zaXZlRm9vdGVyIikucmVtb3ZlKCk7Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVMOjpTeXN0ZW06OkxvZyIsCiJLZXJuZUw6OlN5c3RlbTo6VGlja2V0IiwKIktlcm5lTDo6U3lzdGVtOjpUeXBlIiwKIktlcm5lbDo6U3lzdGVtOjpZQU0iLAoiS2VybmVsOjpDb25maWciLAoiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIsCiJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIsCiJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iLAoiS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MiICk7CgoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY0Zvcm1QdWJsaWN9Owp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzY2hlbWEgZm9yIG5ldyB0aWNrZXQgd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYVB1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWFQdWJsaWN9Owp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNPcHRpb25zIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY0Zvcm19Owp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzY2hlbWEgZm9yIG5ldyB0aWNrZXQgd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYX07Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgc3lzdGVtIGZpZWxkIHZhbHVlcyAoc2VydmljZSBhbmQgdHlwZSkKPWN1dApzdWIgUmVwbGFjZU9UUlNWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICkgPSAkU2VsZi0+R2V0T1RSU1NlcnZpY2VzRGF0YSgpOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3NlcnZpY2VfdmFsdWVzLyRzZXJ2aWNlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfc2VydmljZV9sYWJlbHMvJHNlcnZpY2VOYW1lcy9nOwoKCW15ICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKSA9ICRTZWxmLT5HZXRPVFJTVHlwZXNEYXRhKFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSk7Cgkkc2NoZW1hICA9fiBzL09UUlNfdHlwZV92YWx1ZXMvJHR5cGVJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU190eXBlX2xhYmVscy8kdHlwZU5hbWVzL2c7CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgc2VydmljZXMgaW5mbyAoc2VydmljZSBhbmQgdHlwZSkKPWN1dApzdWIgR2V0T1RSU1NlcnZpY2VzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNlcnZpY2VzID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCglteSAlc2VydmljZUxpc3QgPSAkc2VydmljZXMtPlNlcnZpY2VMaXN0KCBWYWxpZCA9PiAxLCBVc2VySUQgPT4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJykgKTsKCW15ICRzZXJ2aWNlTmFtZXMgPSAiIjsKCW15ICRzZXJ2aWNlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHNlcnZpY2VMaXN0eyRhfSBjbXAgJHNlcnZpY2VMaXN0eyRifSApIH0ga2V5cyAlc2VydmljZUxpc3QgKSB7CgkJJHNlcnZpY2VOYW1lcyAuPSAiXCIkc2VydmljZUxpc3R7JF99XCIsIjsKCQkkc2VydmljZUlEcyAgIC49ICIkXywiOwoJfQoJJHNlcnZpY2VOYW1lcyA9IHN1YnN0cigkc2VydmljZU5hbWVzLCAwLCAtMSk7Cgkkc2VydmljZUlEcyA9IHN1YnN0cigkc2VydmljZUlEcywgMCwgLTEpOwoJcmV0dXJuICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgdGlja2V0IHR5cGVzIAo9Y3V0CnN1YiBHZXRPVFJTVHlwZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkdGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoKCW15ICV0eXBlTGlzdCAgPSAkdGlja2V0T2JqZWN0LT5UaWNrZXRUeXBlTGlzdCggVXNlcklEID0+ICRQYXJhbXtVc2VySUR9ICk7CglteSAkdHlwZU5hbWVzID0gIiI7CglteSAkdHlwZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR0eXBlTGlzdHskYX0gY21wICR0eXBlTGlzdHskYn0gKSB9IGtleXMgJXR5cGVMaXN0ICkgewoJCWlmIChpbmRleCgkdHlwZUxpc3R7JF99LCAnOjonKSA9PSAtMSkgewoJCQkkdHlwZU5hbWVzIC49ICJcIiR0eXBlTGlzdHskX31cIiwiOwoJCQkkdHlwZUlEcyAgIC49ICIkXywiOwoJCX0KCX0KCQoJJHR5cGVOYW1lcyA9IHN1YnN0cigkdHlwZU5hbWVzLCAwLCAtMSk7CgkkdHlwZUlEcyA9IHN1YnN0cigkdHlwZUlEcywgMCwgLTEpOwoJCglyZXR1cm4gKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApOwp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIGR5bmFtaWMgZmllbGRzCj1jdXQKc3ViIFJlcGxhY2VPVFJTRHluYW1pY0ZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICRkZmllbGRzICAgID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIpOwoJbXkgQGRmaWVsZExpc3QgPSBAeyAkZGZpZWxkcy0+RHluYW1pY0ZpZWxkTGlzdEdldCggVmFsaWQgPT4gMSApIH07CgoJZm9yZWFjaCAoQGRmaWVsZExpc3QpIHsKCQlteSAkY2FtcG8gPSAkXzsKCgkJbXkgJG5hbWUgICAgICAgICAgPSAkY2FtcG8tPntOYW1lfTsKCQlteSAkY29uZmlnICAgICAgICA9ICRjYW1wby0+e0NvbmZpZ307CgkJbXkgJHR5cGUgICAgICAgICAgPSAkY2FtcG8tPntGaWVsZFR5cGV9OwoJCW15ICRpZEZpZWxkVmFsdWVzID0gIkRGXyIgLiAkbmFtZSAuICJfdmFsdWVzIjsKCQlteSAkaWRGaWVsZExhYmVscyA9ICJERl8iIC4gJG5hbWUgLiAiX2xhYmVscyI7CgkJaWYgKCAkdHlwZSBlcSAiRHJvcGRvd24iICkgewoJCQlteSAoICRkZlZhbHVlcywgJGRmTGFiZWxzICkgPSAkU2VsZi0+R2V0RHluYW1pY0ZpZWxkVmFsdWVzKCBDb25maWdERiA9PiAkY29uZmlnICk7CgkJCSRzY2hlbWEgID1+IHMvJGlkRmllbGRWYWx1ZXMvJGRmVmFsdWVzL2c7CgkJCSRvcHRpb25zID1+IHMvJGlkRmllbGRMYWJlbHMvJGRmTGFiZWxzL2c7CgkJfQoJfQoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIGR5YW5taWMgZmllbGQgdmFsdWVzCj1jdXQKc3ViIEdldER5bmFtaWNGaWVsZFZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJGNvbmZpZyA9ICRQYXJhbXtDb25maWdERn07CglteSAkdmFsdWVzID0gJGNvbmZpZy0+e1Bvc3NpYmxlVmFsdWVzfTsKCglteSAkZGZWYWx1ZXMgPSAiIjsKCW15ICRkZkxhYmVscyA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdmFsdWVzLT57JGF9IGNtcCAkdmFsdWVzLT57JGJ9ICkgfSBrZXlzICV7JHZhbHVlc30gKSB7CgkJJGRmVmFsdWVzIC49ICJcIiRfXCIsIjsKCQkkZGZMYWJlbHMgLj0gIlwiJHZhbHVlcy0+eyRffVwiLCI7Cgl9CgoJJGRmVmFsdWVzID0gc3Vic3RyKCRkZlZhbHVlcywgMCwgLTEpOwoJJGRmTGFiZWxzID0gc3Vic3RyKCRkZkxhYmVscywgMCwgLTEpOwoJcmV0dXJuICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKTsKCn0KCj1oZWFkCkJ1aWxkcyBzZXJ2aWNlIGNob29zaW5nIGNvbWJvCj1jdXQKc3ViIEJ1aWxkU2VydmljZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgaWQ9XCJTZXJ2aWNlSURcIiBkYXRhLWxpdmUtc2VhcmNoLW5vcm1hbGl6ZT1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGRhdGEtbGl2ZS1zZWFyY2g9XCJ0cnVlXCI+XG48b3B0aW9uIHZhbHVlPVwiXCI+LTwvb3B0aW9uPiI7CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGlvbiB2YWx1ZT0nIiAuICRzZXJ2aWNlLT57S2V5fSAuICInPiIgLiAkU2VsZi0+TGFzdFBhcnQoJHNlcnZpY2UtPntWYWx1ZX0pIC4gIjwvb3B0aW9uPlxuIjsKCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoJCQoJCSMgU2V0IGZpeGVkIGZpZWxkIHZhbHVlcywgaWYgZGVmaW5lZAoJCWlmICgkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KSB7CgkJCSgkc2NoZW1hLCAkZmllbGRzKSA9ICRTZWxmLT5BZGp1c3RGaXhlZEZpZWxkcyhTY2hlbWEgPT4gJHNjaGVtYSwgRmllbGRzID0+ICRmaWVsZHMsIEZpeGVkVmFsdWVzID0+ICRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pOwoJCX0JCgl9CgkKCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNEeW5hbWljRmllbGRzKCBTY2hlbWEgPT4gJHNjaGVtYSwgT3B0aW9ucyA9PiAkZmllbGRzICk7CgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgkJCQkJCQkJCQkKCQlteSAka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJbXkgJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIicgLiAnOiB7InR5cGUiOiAic3RyaW5nIiwgImRlZmF1bHQiOiAiJyAuICRmaXhlZFZhbHVlIC4gJyJ9JzsKCQkKCQkkc2NoZW1hID1+IHMvJGtleS8kcmVwbGFjZS87CgkJCgkJJGtleSA9ICcoIicgLiAkZmllbGRLZXkgLiAnIltcIF0/OltcIF0/e1tefV0rfSknOwoJCSRyZXBsYWNlID0gJyInIC4gJGZpZWxkS2V5IC4gJyI6IHsidHlwZSI6ICJoaWRkZW4iJyAuICJcbn0iOwoJCSRmb3JtID1+IHMvJGtleS8kcmVwbGFjZS87Cgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJCglteSAkS29tID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygKICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICBMYW5nICAgID0+ICdwdF9CUicsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtvbS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICAKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJIyBDaGVjayBpZiBxdWV1ZSB3YXMgcHJlLWRlZmluZWQKCW15ICRxdWV1ZUZpeGVkID0gMDsKCWlmICgkRGF0YXtRdWV1ZUlEfSkgewoJCSRxdWV1ZUZpeGVkID0gMTsKCX0JCgkKCSMgR2V0IHF1ZXVlIG5hbWUgYW5kIGlkIHVzaW5nIHJ1bGVzLCBpZiBubyBxdWV1ZSB3YXMgcHJlZGVmaW5lZAoJbXkgKCAkUXVldWUsICRRdWV1ZUlEICkgPSAkVGlja2V0V2l6YXJkLT5HZXRRdWV1ZUlEKCVQYXJhbSk7CgkkRGF0YXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKCSMgTW9kdWxlIGNvbmZpZwoJJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCgkjIFRpY2tldCBjcmVhdGlvbgoJbXkgJGN1c3RvbWVySUQ7CglteSAkY3VzdG9tZXJVc2VyOwoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkY3VzdG9tZXJJRCA9ICRTZWxmLT5HZXRVc2VySURGcm9tRW1haWwoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKSApOwoJCSRjdXN0b21lclVzZXIgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCX0gZWxzZSB7CgkJJGN1c3RvbWVySUQgPSAkUGFyYW17Q3VzdG9tZXJJRH07CgkJJGN1c3RvbWVyVXNlciA9ICRQYXJhbXtDdXN0b21lclVzZXJ9OwoJfQoJCgkkU2VsZi0+RGVidWcoIkNyZWF0aW5nIHRpY2tldCIpOwoJbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAoJCVRpdGxlICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJUXVldWVJRCAgICA9PiAkUXVldWVJRCwKCQlQcmlvcml0eSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0sCgkJTG9jayAgICAgICA9PiAndW5sb2NrJywKCQlTdGF0ZSAgICAgID0+ICduZXcnLAoJCVNlcnZpY2VJRCAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInNlcnZpY2UiICksCgkJVHlwZUlEICAgICA9PiRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJ0eXBlIiApLAoJCUN1c3RvbWVySUQgPT4gJGN1c3RvbWVySUQsCgkJQ3VzdG9tZXJVc2VyID0+ICRjdXN0b21lclVzZXIsCgkJT3duZXJJRCA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9LAoJCVVzZXJJRCAgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCSk7CgkkU2VsZi0+RGVidWcoIkNyZWF0ZWQgdGlja2V0IElEICRUaWNrZXRJRCIpOwoKCW15ICRNaW1lVHlwZSAgICAgID0gJ3RleHQvaHRtbCc7CglteSAlc2VydmljZUZpZWxkc1ZhbHVlcyA9ICgpOwoJbXkgJHNlcnZpY2VGaWVsZHMgPSAiIjsKCW15IEBzZXJ2aWNlRmllbGRzS2V5cyA9ICgpOwoKCSMgU2VydmljZSBGaWVsZHMKCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBzZXJ2aWNlIGZvcm0gdmFsdWVzIik7Cglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoKCBzdWJzdHIoICRfLCAwLCAzICkgZXEgIlNGXyIgKSAmJiAoIHN1YnN0ciggJF8sIDAsIDUgKSBuZSAiU0ZfVF8iICkpIHsKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICkpIHsKCQkJCW15IEBwYXJhbVZhbHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApOwkJCQkKCQkJCWZvciBteSAkcGFyYW1WYWx1ZSAoQHBhcmFtVmFscykgewoJCQkJCWlmICgoJHBhcmFtVmFsdWUpICYmICghKCRwYXJhbVZhbHVlIGVxICItIikpKSB7CgkJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99ID0gJHBhcmFtVmFsdWU7CgkJCQkJCQlwdXNoIEBzZXJ2aWNlRmllbGRzS2V5cywgJF87CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLj0gIiwgIiAuICRwYXJhbVZhbHVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQkJCQkKCQkJfSBlbHNlIHsKCQkJCW15ICRwYXJhbVZhbHVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsgCgkJCQkKCQkJCWlmICgoJHBhcmFtVmFsdWUpICYmICghKCRwYXJhbVZhbHVlIGVxICItIikpKSB7CgkJCQkJaWYgKCEgJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99KSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQlwdXNoIEBzZXJ2aWNlRmllbGRzS2V5cywgJF87CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQl9CQkJCQkJCgkJCQl9CgkJCX0KCQl9Cgl9CgkKCWZvciAoQHNlcnZpY2VGaWVsZHNLZXlzKSB7CgkJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+IHN1YnN0ciggJF8sIDMgKSkgLiAiOiA8L0I+IiAuICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuICI8QlIvPiI7Cgl9CQoJCgkkc2VydmljZUZpZWxkcyAuPSAiPEI+SVA6IDwvQj4iIC4gICRFTlZ7J1JFTU9URV9BRERSJ30gLiAiPEJSLz4iOwoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCUi8+PEJSLz4iOwoKCSMgRHluYW1pYyBGaWVsZHMKCW15ICR1c2VySURERjsKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSR1c2VySURERiA9ICRTZWxmLT57RGVmYXVsdFVzZXJJRH07Cgl9IGVsc2UgewoJCSR1c2VySURERiA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpOwoJfQoJJFNlbGYtPkRlYnVnKCJSZXRyaWV2aW5nIGR5bmFtaWMgZmllbGRzIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCAzICkgZXEgIkRGXyIgKSB7CgkJCW15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAoJCQkJRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCggTmFtZSA9PiBzdWJzdHIoICRfLCAzICkgKSwKCQkJCU9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCgkJCQlWYWx1ZSAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSwKCQkJCVVzZXJJRCA9PiAkdXNlcklEREYsCgkJCSk7CgkJfQoJfQoKCSMgU2VydmljZSBGaWVsZHMgLSBUYWJsZSBmaWVsZHMKCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBzZXJ2aWNlIGZpZWxkcyAtIHRhYmxlIGZpZWxkcyIpOwoJbXkgJGxhc3RUYWIgPSAiIjsKCW15ICVrZXlzRm91bmQgPSAoKTsKCW15ICRuZXdUYWIgPSAxOwoJCglmb3IgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtTmFtZXMoKSApIHsKCQlpZiAoIHN1YnN0ciggJF8sIDAsIDUgKSBlcSAiU0ZfVF8iICkgewoJCQlteSAkcGFyYW1OYW1lID0gJF87CgkJCW15IEBwYXJ0cyA9IHNwbGl0KCdfJywgJF8pOwoJCQlteSAkY3VyclRhYiA9ICRwYXJ0c1syXTsKCQkJbXkgJGN1cnJLZXkgPSAkcGFydHNbNF07CgkJCQoJCQlpZiAoJGN1cnJUYWIgbmUgJGxhc3RUYWIpIHsKCQkJCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJCQkJfQoJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUQUJMRSBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDcwMHB4OycgYm9yZGVyPScxcHgnPiI7CgkJCQkkbGFzdFRhYiA9ICRjdXJyVGFiOwoJCQkJJG5ld1RhYiA9IDE7CgkJCX0gZWxzZSB7CgkJCQkkbmV3VGFiID0gMDsKCQkJfQoJCQkKCQkJIyMgbmV3IGxpbmUgZHVlIHRvIHJlcGV0aXRpb24gb3IgbmV3IHRhYmxlCgkJCWlmICgka2V5c0ZvdW5keyRjdXJyS2V5fSB8fCAoJG5ld1RhYikgKSB7CgkJCQkla2V5c0ZvdW5kID0gKCk7CQkJCQoJCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgQ09MU1BBTj0nMicgc3R5bGU9J3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiBsYXJnZSc+PEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gJGN1cnJUYWIpIC4gIjwvQj48L1REPjwvVFI+IjsgCgkJCX0KCQkJJGtleXNGb3VuZHskY3VycktleX0gPSAxOwoJCQkkc2VydmljZUZpZWxkcyAuPSAiPFRSPjxURCBzdHlsZT0nd2lkdGg6IDEwMHB4Oyc+PEI+IiAuICRTZWxmLT5icmVha1dvcmRzKFRleHQgPT4gJGN1cnJLZXkpIC4gIjwvQj48L1REPjxURD4iIC4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJHBhcmFtTmFtZSApIC4gIjwvVEQ+PC9UUj4iOwkJCQoJCX0KCX0KCQoJaWYgKCRsYXN0VGFiIG5lICIiKSB7CgkJJHNlcnZpY2VGaWVsZHMgLj0gIjwvVEFCTEU+PEJSLz48QlIvPiI7Cgl9CgkKCW15ICRib2R5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImRlc2NyaXB0aW9uIiApOwoKCSMgSW1hZ2VzCgkkU2VsZi0+RGVidWcoIkxvYWRpbmcgaW1hZ2VzIGZyb20gY2FjaGUiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkZm9ybUlkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CglteSBAZmlsZXNVcGxvYWRlZCA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKEZvcm1JRCA9PiAkZm9ybUlkKTsKCQoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJbXkgJENvbnRlbnRJRCA9ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9OwogICAgICAgIGlmICgkQ29udGVudElEICYmICggJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApICYmICggJHVwbG9hZGVkRmlsZS0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApKSB7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiByZXBsYWNpbmcgaW1hZ2UgVVJMIGluIGJvZHkgd2l0aCBhdHRhY2htZW50Iik7CiAgICAgICAgCSRTZWxmLT5EZWJ1ZygiTmV3VGlja2V0V2l6YXJkOiBCb2R5OiAkYm9keSIpOwogICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbChUZXh0ID0+ICRDb250ZW50SUQsKTsKCQkJIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAkYm9keSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwogICAgICAgICAgICAkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogbmV3IGJvZHk6ICRib2R5Iik7CiAgICAgICAgfQoJfQoJCgkjIENyZWF0ZSBhcnRpY2xlCgkkU2VsZi0+RGVidWcoIkNyZWF0aW5nIGFydGljbGUiKTsKCW15ICRGdWxsTmFtZTsKCW15ICRFbWFpbDsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJEZ1bGxOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIm5hbWUiICk7CgkJJEVtYWlsICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApOwkJCgl9IGVsc2UgewoJCSRGdWxsTmFtZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59KTsKCQkkRW1haWwgICAgPSAkUGFyYW17VXNlckVtYWlsfTsKCX0KCQkKCW15ICRGcm9tICAgICA9ICJcIiRGdWxsTmFtZVwiIDwkRW1haWw+IjsKCW15ICRBcnRpY2xlSUQgPSAkVGlja2V0T2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAoJCVRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAoJCUFydGljbGVUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAoJCVNlbmRlclR5cGUgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX0sCgkJRnJvbSAgICAgICAgICAgICA9PiAkRnJvbSwKCQlUbyAgICAgICAgICAgICAgID0+ICRRdWV1ZSwKCQlTdWJqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCUJvZHkgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKFN0cmluZyA9PiAkc2VydmljZUZpZWxkcyAuICRib2R5KSwKCQlNaW1lVHlwZSAgICAgICAgID0+ICRNaW1lVHlwZSwKCQlDaGFyc2V0ICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCgkJVXNlcklEICAgICAgICAgICA9PiAkdXNlcklEREYsCgkJSGlzdG9yeVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCgkJSGlzdG9yeUNvbW1lbnQgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKCQlBdXRvUmVzcG9uc2VUeXBlID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKQoJCT8gJ2F1dG8gcmVwbHknCgkJOiAnJywKCQlPcmlnSGVhZGVyID0+IHsKCQkJRnJvbSAgICA9PiAkRnJvbSwKCQkJVG8gICAgICA9PiAkUXVldWUsCgkJCVN1YmplY3QgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInN1YmplY3QiICksCgkJCUJvZHkgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKFN0cmluZyA9PiAkc2VydmljZUZpZWxkcyAuICRib2R5KSwsCgkJfSwKCQlRdWV1ZSA9PiAkUXVldWUsCgkpOwoJCgkjIEF0dGFjaG1lbnRzCgkkU2VsZi0+RGVidWcoIkluY2x1ZGluZyBhdHRhY2htZW50cyIpOwoJZm9yIG15ICR1cGxvYWRlZEZpbGUgKEBmaWxlc1VwbG9hZGVkKSB7CgkJJFRpY2tldE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKCQkJRmlsZW5hbWUgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSwKCQkJQ29udGVudCA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudH0sCgkJCUNvbnRlbnRUeXBlID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0sCgkJCUFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAoJCQlDb250ZW50SUQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnRJRH0sCgkJCVVzZXJJRCAgICA9PiAkdXNlcklEREYsCgkJKTsKCX0KCQoJJERhdGF7VGlja2V0TnVtYmVyfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCSMgYnVpbGQgb3V0cHV0CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJCSREYXRhe01vZHVsZX0gPSAicHVibGljIjsKCX0gZWxzZSB7CgkJJERhdGF7TW9kdWxlfSA9ICJjdXN0b21lciI7Cgl9CglpZiAoISAkcXVldWVGaXhlZCkgewoJCWRlbGV0ZSAkRGF0YXtRdWV1ZUlEfSAKCX0KCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCBUaXRsZSA9PiAiVGlja2V0IGNyZWF0ZWQiICk7CgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKCQlEYXRhICAgICAgICAgPT4gXCVEYXRhLAoJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkVGlja2V0Q3JlYXRlZCcsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlKTsKCXJldHVybiAkT3V0cHV0OwoKfQoKPWhlYWQKSWYgcHVibGljIGludGVyZmFjZSB3YXMgdXNlZCwgdHJ5IHRvIGd1ZXNzIHRoZSB1c2VyIGZyb20gdGhlIGluZm9ybWVkIGUtbWFpbAo9Y3V0CnN1YiBHZXRVc2VySURGcm9tRW1haWwgewoJbXkgJFNlbGYgICAgICAgPSBzaGlmdDsKCW15ICRlbWFpbCAgICAgID0gc2hpZnQ7CglteSAkcmVzdWx0ICAgICA9ICRTZWxmLT57RGVmYXVsdEN1c3RvbWVySUR9OwoJbXkgJGRvbWFpbkxpc3QgPSAkU2VsZi0+e0RlZmF1bHRVc2VyRG9tYWlufTsKCQoJbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXIiKTsKCglpZiAoJGRvbWFpbkxpc3QpIHsKCQlteSBAZG9tYWlucyA9IHNwbGl0KCAiLCIsICRkb21haW5MaXN0ICk7CgkJCgkJZm9yIG15ICRkb21haW4gKEBkb21haW5zKSB7CgkJCW15IEBwYXJ0cyA9IHNwbGl0KCAiQCIsICRlbWFpbCApOwoJCQlpZiAoICRwYXJ0c1sxXSBlcSAkZG9tYWluICkgewoJCQkJbXkgJGlkICAgPSAkcGFydHNbMF07CgkJCQlteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAoJCQkJCVVzZXJMb2dpbiA9PiAkaWQsCgkJCQkJVmFsaWQgICAgID0+IDEsICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCwgZGVmYXVsdCAxCgkJCQkpOwoJCQkJaWYgKCBrZXlzICVMaXN0ICkgewoJCQkJCSRyZXN1bHQgPSAkaWQ7CgkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuICRyZXN1bHQ7Cn0KCj1oZWFkCkRlZmF1bHQgYWN0aW9uIHRvIG9wZW4gYSBuZXcgZm9ybSAoZnJvbnRlbmQgbWV0aG9kIHNoYXJlIGJ5IHB1YmxpYyBhbmQgY3VzdG9tZXIgZnJvbnRlbmQgbW9kdWxlcykKPWN1dApzdWIgT3BlbkZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsJCQoJbXkgJURhdGEgPSAoKTsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJPcGVuaW5nIHB1YmxpYyBmb3JtIik7Cgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBhdXRoZW50aWNhdGVkIGZvcm0iKTsKCX0KCQoJbXkgJEtvbSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoCiAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgTGFuZyAgICA9PiAncHRfQlInLAogICAgICAgIH0sCiAgICApOwogICAgI215ICRMYXlvdXRPYmplY3QgPSAkS29tLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICRFTlZ7SFRUUF9BQ0NFUFRfTEFOR1VBR0V9ID0gJ3B0X0JSJzsKICAgICRTZWxmLT5EZWJ1ZygiTGFuZ3VhZ2UgaW4gdXNlOiAiIC4gICRFTlZ7SFRUUF9BQ0NFUFRfTEFOR1VBR0V9KTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgkKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSk7CgoJIyBCdWlsZCBvdXRwdXQKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCAgVGl0bGUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXcgdGlja2V0IHdpemFyZCIpICk7CgkJICAKCSMgTG9hZCBjdXJyZW50IG1haW50ZW5hbmNlcyAgCglteSBAbWFpbnRlbmFuY2VzID0gJE1haW50ZW5hbmNlT2JqZWN0LT5MaXN0Q3VycmVudE1haW50ZW5hbmNlcygpOwoJCQoJaWYgKEBtYWludGVuYW5jZXMpIHsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VzUGFuZWwnLAoJCSk7CQkKCQkJCgkJZm9yIG15ICRtYWludGVuYW5jZUhhc2ggKEBtYWludGVuYW5jZXMpIHsKCQkJbXkgJW1haW50ZW5hbmNlID0gJXskbWFpbnRlbmFuY2VIYXNofTsKCQkJCQkJCQoJCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJCU5hbWUgPT4gJ01haW50ZW5hbmNlTGluZScsCgkJCQlEYXRhID0+IHsKCQkJCQlNZXNzYWdlICAgPT4gJG1haW50ZW5hbmNleydEZXNjcmlwdGlvbid9LAkJCQkJCQoJCQkJCVN0YXJ0RGF0ZSA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5CcmF6aWxpYW5EYXRlKFRpbWVzdGFtcCA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5Gcm9tU1FMKFN0cmluZ0RhdGUgPT4gJG1haW50ZW5hbmNle1N0YXJ0RGF0ZX0pKSwKCQkJCX0pOwkJCQkJCQkKCQl9CQoJfQkJCgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJQdWJsaWMgdmlldyAtIHVuYXV0aGVudGljYXRlZCBtZXNzYWdlIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnVW5hdXRoZW50aWNhdGVkTWVzc2FnZScsCgkJKTsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gcHVibGljIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdUb29sQmFyUHVibGljJywKCQkpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiQ3VzdG9tZXIgdmlldyAtIGN1c3RvbWVyIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAkJCgkJCU5hbWUgPT4gJ1Rvb2xCYXJDdXN0b21lcicsCgkJKTsKCX0KCgkjIFByZXBhcmUgY2FjaGUgZm9yIGltYWdlbnMgYW5kIGF0dGFjaG1lbnRzCglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJJERhdGF7Rm9ybUlEfSA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQ3JlYXRlKCk7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJfQoKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmQnLAoJKTsKCQkKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQKU2VwYXJhdGUgc2VydmljZS1maWVsZCBsYWJlbCBuYW1lcywgdG8gbWFrZSBpdCBodW1hbi1yZWFkYWJsZSAoQ2FwaXRhbExpa2VMYWJlbHMgLT4gQ2FwaXRhbCBsaWtlIGxhYmVscykKPWN1dApzdWIgYnJlYWtXb3JkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJHJldHVybiA9ICRQYXJhbXtUZXh0fTsJCgkKCSRyZXR1cm4gPX4gcy8oLikoW0EtWl1bXkEtWl0pLyQxICQyL2c7CgkkcmV0dXJuID1+IHMvKFtcdyddKykvXHVcTCQxL2c7CgkKCXJldHVybiAkcmV0dXJuOwp9CgpzdWIgRGVidWcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRtc2cgPSBzaGlmdDsKCSRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpMb2ciKS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICRtc2cgKTsKfQoKCjE7Cg==</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgiW25hbWU9J3NlcnZpY2UnXSIpLnZhbCgkKCIjU2VydmljZUlEIikudmFsKCkpOwoJCSQoIltuYW1lPSdGb3JtSUQnXSIpLnZhbChmb3JtLmRhdGEuRm9ybUlEKTsKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJCQllZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0JCQkKCQl9LCAyMDAwKTsKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzKGFjdGl2ZVF1ZXVlKTsKfTsKCgp2YXIgcG9zdFJlbmRlckNhbGxiYWNrUHVibGljID0gZnVuY3Rpb24oZm9ybSkgewoJZm9ybU9wdGlvbnMgPSBmb3JtLm9wdGlvbnMuZmllbGRzOwoJZm9ybUFscGFjYSA9IGZvcm07CgkKCWlmIChmb3JtKSB7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigpOwoJCSQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,106 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizard</Name> | |
| 4 | + <Version>3.0.8</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.5.0">Support for OTRS 4.0.3, QueuesPanel Module Separation</ChangeLog> | |
| 9 | + <ChangeLog version="1.5.0">AlpacaJS adjustment for OTRS 4.0.4</ChangeLog> | |
| 10 | + <ChangeLog version="1.6.1">Support for specific form per queue</ChangeLog> | |
| 11 | + <ChangeLog version="1.7.0">Support for fixed field values and IP in created ticket</ChangeLog> | |
| 12 | + <ChangeLog version="1.7.3">Support to set any field value</ChangeLog> | |
| 13 | + <ChangeLog version="1.7.4">Support for multi-value fields</ChangeLog> | |
| 14 | + <ChangeLog version="1.7.7">Support for restricted services</ChangeLog> | |
| 15 | + <ChangeLog version="1.8.0">Upgrade to AlpacaJS 1.5.12</ChangeLog> | |
| 16 | + <ChangeLog version="1.8.1">Layout bug fix</ChangeLog> | |
| 17 | + <ChangeLog version="1.8.2">Multiselect component</ChangeLog> | |
| 18 | + <ChangeLog version="1.9.0">Table support</ChangeLog> | |
| 19 | + <ChangeLog version="1.9.4">Support for custom template</ChangeLog> | |
| 20 | + <ChangeLog version="1.9.5">Shows and validates JSON in form editing</ChangeLog> | |
| 21 | + <ChangeLog version="1.9.6">Support for custom javascript in forms</ChangeLog> | |
| 22 | + <ChangeLog version="1.9.7">Fix for datatables instalation</ChangeLog> | |
| 23 | + <ChangeLog version="1.9.9">Fix for date fields</ChangeLog> | |
| 24 | + <ChangeLog version="1.9.11">Fix for public interface custom properties</ChangeLog> | |
| 25 | + <ChangeLog version="2.0.0">Changes for OTRS 5.0.x</ChangeLog> | |
| 26 | + <ChangeLog version="2.0.1">Separation for OTRS Media (images)</ChangeLog> | |
| 27 | + <ChangeLog version="2.0.2">Fix for DropDown width in SumoSelect (AlpacaJS)</ChangeLog> | |
| 28 | + <ChangeLog version="2.0.3">Fix for invalid e-mail message</ChangeLog> | |
| 29 | + <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> | |
| 30 | + <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> | |
| 31 | + <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> | |
| 32 | + <ChangeLog version="3.0.8">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 33 | + <Description>NewTicket Wizard Module</Description> | |
| 34 | + <Framework>5.0.x</Framework> | |
| 35 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard module installed successfully!</IntroInstall> | |
| 36 | + <BuildDate>2017-06-22 19:32:01</BuildDate> | |
| 37 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 38 | + <Filelist> | |
| 39 | + <File Location="Kernel/Config/Files/NewTicketWizard.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjxvdHJzX2NvbmZpZyBpbml0PSJBcHBsaWNhdGlvbiIJdmVyc2lvbj0iMS4wIj4KCQoKCTxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxEZXNjcmlwdGlvbj5Nb2R1bGUgZm9yIGNyZWF0aW5nIGN1c3RvbSBuZXcgdGlja2V0IGludGVyZmFjZXM8L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldDwvRGVzY3JpcHRpb24+CgkJCQkJPE5hbWU+TmV3IHRpY2tldDwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCgkJCQkJCgkJCQkJPEphdmFTY3JpcHQ+TmV3VGlja2V0V2l6YXJkLmpzPC9KYXZhU2NyaXB0PgoJCQkJCQoJCQkJCTxDU1M+YWxwYWNhL2FscGFjYS5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLmNzczwvQ1NTPgoJCQkJCTxDU1M+anF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC11aS5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtdGhlbWUubWluLmNzczwvQ1NTPgkJCQkJCQkJCQkJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC5taW4uY3NzPC9DU1M+CgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLXNlbGVjdC5taW4uY3NzPC9DU1M+CgkJCQkJCgkJCQk8L0xvYWRlcj4KCQkJPC9Gcm9udGVuZE1vZHVsZVJlZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxGcm9udGVuZE1vZHVsZVJlZz4KCQkJCTxHcm91cD5hZG1pbjwvR3JvdXA+CgkJCQk8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgoJCQkJPFRpdGxlPlNlcnZpY2UgZm9ybXM8L1RpdGxlPgoJCQkJPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CgkJCQk8TG9hZGVyPgoJCQkJCTxDU1M+anF1ZXJ5Lmpzb252aWV3LmNzczwvQ1NTPgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5anNvbnZpZXcvanF1ZXJ5Lmpzb252aWV3LmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5Y2hpbGkvanF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWNoaWxpL2pxdWVyeS5jaGlsaS5yZWNpcGVzLmpzPC9KYXZhU2NyaXB0PgoJCQkJPC9Mb2FkZXI+CgkJCQk8TmF2QmFyTW9kdWxlPgoJCQkJCTxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KCQkJCQk8TmFtZT5TZXJ2aWNlIGZvcm1zPC9OYW1lPgoJCQkJCTxEZXNjcmlwdGlvbj5DcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLjwvRGVzY3JpcHRpb24+CgkJCQkJPEJsb2NrPlRpY2tldDwvQmxvY2s+CgkJCQkJPFByaW8+OTAwPC9QcmlvPgoJCQkJPC9OYXZCYXJNb2R1bGU+CgkJCTwvRnJvbnRlbmRNb2R1bGVSZWc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQmFzaWNTY2hlbWEiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgc2NoZW1hLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX3VuaWRhZGUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImVudW0iOiBbCiAgICAgIERGX3VuaWRhZGVfdmFsdWVzCiAgICBdLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgIkRGX2xvY2FsIjogewogICAgInR5cGUiOiAic3RyaW5nIiwKICAgICJyZXF1aXJlZCI6IHRydWUKICB9LAogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKCQkJCSAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCgkiZm9ybWF0IjogInVyaSIKICB9LAkJCSAgIAogICJBY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiTmV3VGlja2V0V2l6YXJkIgogIH0sCiAgIkZvcm1JRCI6IHsKCSJ0eXBlIjogInN0cmluZyIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgImRlZmF1bHQiOiAiQ3JlYXRlVGlja2V0IgogIH0KCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY0Zvcm0iCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVzY3JpYmUgdGhlIGZvcm0gYmFzaWMgZmllbGRzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8VGV4dEFyZWEgUmVnZXg9IiI+CiAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAibGFiZWwiOiAiVW5pZGFkZToiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsICAgIAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgREZfdW5pZGFkZV9sYWJlbHMKICAgIF0sCgkiaGVscGVyIjogIkJhc3RhIGRpZ2l0YXIgYSBzaWdsYSBkYSB1bmlkYWRlIHF1ZSBvIHNpc3RlbWEgaXLDoSBsb2NhbGl6YXIiCiAgfSwKICAiREZfbG9jYWwiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJMb2NhbDoiCiAgfSwJCQkJCQkJCQogICJERl90ZWxlZm9uZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIlRlbGVmb25lOiIsCiAgICAiY29udHJvbF93aWR0aCI6IDEwMAogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJzZWxlY3QiLAogICAgInJlbW92ZURlZmF1bHROb25lIjogZmFsc2UsCiAgICAibGFiZWwiOiAiTW90aXZvOiIsCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBPVFJTX3R5cGVfbGFiZWxzCiAgICBdCiAgfSwKICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CiAgQ0ZfRk9STSwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkFzc3VudG86IiwKICAgICJzaXplIjogODAKICB9LAogICJkZXNjcmlwdGlvbiI6IHsKICAgICJ0eXBlIjogImNrZWRpdG9yIiwKICAgICJsYWJlbCI6ICJEZXNjcmnDp8OjbzoiLAogICAgImNvbHMiOiA4MCwKCSJja2VkaXRvciI6IHsKCQkidG9vbGJhciI6IFsKICAgICAgICAgICAgWyJGb250IiwgIkZvbnRTaXplIiwgIi0iLCAiQm9sZCIsICJJdGFsaWMiLCAiVW5kZXJsaW5lIiwgIi0iLCAiTnVtYmVyZWRMaXN0IiwgIkJ1bGxldGVkTGlzdCIsICItIiwgIlBhc3RlIl0sCiAgICAgICAgCVsiSW1hZ2UiLCAiVGFibGUiLCAiLSIsICJMaW5rIl0KICAgIAldLAoJCSJsYW5ndWFnZSI6ICJwdC1iciIKCX0sCgkiaGVscGVyIjogIlBhcmEgaW5zZXJpciBpbWFnZW5zLCBiYXN0YSBhcnJhc3RhciBhIGltYWdlbSBkbyBzZXUgY29tcHV0YWRvciBvdSB1c2FyIG8gYm90w6NvIGRlIGluc2VyaXIgaW1hZ2VtLiIKICB9LAogICJhdHRhY2htZW50IjogewkJCQkJCgkidHlwZSI6ICJ1cGxvYWQiLAogICAgIm1heE51bWJlck9mRmlsZXMiOiAxMDAsCgkibWF4RmlsZVNpemUiOiAyNDAwMDAwMCwKICAgICJtdWx0aXBsZSI6IHRydWUsCgkic2hvd1VwbG9hZFByZXZpZXciOiBmYWxzZSwKICAJInVwbG9hZCI6IHsKICAgICAgInVybCI6ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1VwbG9hZEZpbGVDbWQ9VXBsb2FkRmlsZSIsCiAgICAgICJhdXRvVXBsb2FkIiA6IHRydWUsCiAgICAgICJtZXRob2QiOiAicG9zdCIKICAJfSwKICAJImxhYmVsIjogIkFuZXhvOiIsCiAgCSJoZWxwZXIiOiAiQW5leGUgdW0gYXJxdWl2byBzZSBuZWNlc3PDoXJpby4iCiAgfSwJCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LCAgCiAgIkZvcm1JRCI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9LAogICJTdWJhY3Rpb24iOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQoJCQkJCQkJPC9UZXh0QXJlYT4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZVByZWZpeCIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIHRoZSBxdWV1ZSBjb21lcyBmcm9tIGEgZmllbGQgaW4gdGhlIGZvcm0sIGEgcHJlZml4IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hpbGUgc2VhcmNoaW5nIGZvciB0aGUgcXVldWUuIEEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcXVldWUgbmFtZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+UHJpbWVpcm8gbsOtdmVsIC08L1N0cmluZz4KCQk8L1NldHRpbmc+Cgk8L0NvbmZpZ0l0ZW0+CgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNRdWV1ZUZpZWxkIgoJCVJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CgkJPERlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtIHdoaWNoIGluZGljYXRlcyB0aGUgcXVldWUgdG8gc2VuZCB0aGUgdGlja2V0LjwvRGVzY3JpcHRpb24+CgkJPEdyb3VwPlRpY2tldDwvR3JvdXA+CgkJPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPFN0cmluZyBSZWdleD0iIj5ERl91bmlkYWRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2UiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjTWVzc2FnZUNob29zZVNlcnZpY2VQdWJsaWMiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+TWVzc2FnZSB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGEgc2VydmljZS48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+RXNjb2xoYSBvIHNlcnZpw6dvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlPC9TdHJpbmc+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNEZWZhdWx0Q3VzdG9tZXJJRCIKCQlSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5DdXN0b21lciBJRCB0byB1c2Ugd2hlbiBwdWJsaWMgdGlja2V0IGlzIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nIFJlZ2V4PSIiPnJvZHJpZ28uZzwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0RlZmF1bHRVc2VySUQiCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBhZ2VudCBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+MTwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjRGVmYXVsdFVzZXJEb21haW4iCgkJUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RGVmYXVsdCBkb21haW4gZm9yIHVzZXIgZS1tYWlscy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmcgUmVnZXg9IiI+dWZzYy5icjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCQoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI05ld1RpY2tldFdpemFyZFB1YmxpYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIE5ld1RpY2tldFdpemFyZFB1YmxpYyBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OlB1YmxpYzo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KCQk8U2V0dGluZz4KCQkJPEZyb250ZW5kTW9kdWxlUmVnPgoJCQkJPERlc2NyaXB0aW9uPk1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IGxvZ2dpbmcgaW48L0Rlc2NyaXB0aW9uPgoJCQkJPE5hdkJhck5hbWU+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXJOYW1lPgoJCQkJPE5hdkJhcj4KCQkJCQk8RGVzY3JpcHRpb24+TmV3IHRpY2tldCB3aXphcmQgcHVibGljPC9EZXNjcmlwdGlvbj4KCQkJCQk8TmFtZT5OZXcgdGlja2V0IHB1YmxpYzwvTmFtZT4KCQkJCQk8TGluaz5BY3Rpb249TmV3VGlja2V0V2l6YXJkUHVibGljPC9MaW5rPgoJCQkJCTxOYXZCYXI+TmV3VGlja2V0V2l6YXJkUHVibGljPC9OYXZCYXI+CgkJCQkJPFR5cGU+TWVudTwvVHlwZT4KCQkJCQk8UHJpbz44NDAwPC9QcmlvPgoJCQkJPC9OYXZCYXI+CgkJCQk8TG9hZGVyPgoJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuZmlsZXVwbG9hZC5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qczwvSmF2YVNjcmlwdD4KCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2pxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQtdWkuanM8L0phdmFTY3JpcHQ+CQkJCQkJCQkJCQogICAJCQkgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qczwvSmF2YVNjcmlwdD4JCQkgICAgICAgIAkJCQkJCQkJCQkJCQkJCQoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvanF1ZXJ5ZmlsZXVwbG9hZC9qcXVlcnkudWkud2lkZ2V0LmpzPC9KYXZhU2NyaXB0PgkJCQkJCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Jvb3RzdHJhcC9ib290c3RyYXAubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYm9vdHN0cmFwL2Jvb3RzdHJhcC1zZWxlY3QubWluLmpzPC9KYXZhU2NyaXB0PgoJCQkJCTxKYXZhU2NyaXB0PnRoaXJkcGFydHkvYWxwYWNhL2hhbmRsZWJhcnMuanM8L0phdmFTY3JpcHQ+CgkJCQkJPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9hbHBhY2EvYWxwYWNhLm1pbi5qczwvSmF2YVNjcmlwdD4KCQkJCQkKCQkJCQk8SmF2YVNjcmlwdD5OZXdUaWNrZXRXaXphcmQuanM8L0phdmFTY3JpcHQ+CgkJCQkJCgkJCQkJPENTUz5hbHBhY2EvYWxwYWNhLm1pbi5jc3M8L0NTUz4KCQkJCQkKCQkJCQk8Q1NTPmpxdWVyeWZpbGV1cGxvYWQvanF1ZXJ5LmZpbGV1cGxvYWQuY3NzPC9DU1M+CgkJCQkJPENTUz5qcXVlcnlmaWxldXBsb2FkL2pxdWVyeS5maWxldXBsb2FkLXVpLmNzczwvQ1NTPgoJCQkJCQoJCQkJCTxDU1M+Ym9vdHN0cmFwL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzPC9DU1M+CQkJCQkJCQkJCQkJCQkJCgkJCQkJPENTUz5ib290c3RyYXAvYm9vdHN0cmFwLm1pbi5jc3M8L0NTUz4KCQkJCQk8Q1NTPmJvb3RzdHJhcC9ib290c3RyYXAtc2VsZWN0Lm1pbi5jc3M8L0NTUz4KCQkJCTwvTG9hZGVyPgoJCQk8L0Zyb250ZW5kTW9kdWxlUmVnPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4JCgkKCTxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQjIyNCYXNpY1NjaGVtYVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBzY2hlbWEuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICAic2VydmljZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdW5pZGFkZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsKICAgICAgREZfdW5pZGFkZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCQkJCQkJCQogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJudW1iZXIiLAogICAgImVudW0iOiBbCiAgICAgIE9UUlNfdHlwZV92YWx1ZXMKICAgIF0sCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfQogIENGX1NDSEVNQQogICwKICAic3ViamVjdCI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAicmVxdWlyZWQiOiB0cnVlCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJzdHJpbmciLAogICAgInJlcXVpcmVkIjogdHJ1ZQogIH0sCgkiYXR0YWNobWVudCI6IHsKICAgICJ0eXBlIjogImFycmF5IgogIH0sCQkJICAgCiAgIkFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJOZXdUaWNrZXRXaXphcmRQdWJsaWMiCiAgfSwKICAiRm9ybUlEIjogewoJInR5cGUiOiAic3RyaW5nIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZGVmYXVsdCI6ICJDcmVhdGVUaWNrZXQiCiAgfQoJCQk8L1RleHRBcmVhPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI0Jhc2ljRm9ybVB1YmxpYyIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5EZXNjcmliZSB0aGUgZm9ybSBiYXNpYyBmaWVsZHMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBleGFtcGxlcy48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxUZXh0QXJlYSBSZWdleD0iIj4KICJERl91bmlkYWRlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJsYWJlbCI6ICJVbmlkYWRlOiIsCiAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiBmYWxzZSwgICAgCiAgICAib3B0aW9uTGFiZWxzIjogWwogICAgICBERl91bmlkYWRlX2xhYmVscwogICAgXSwKCSJoZWxwZXIiOiAiQmFzdGEgZGlnaXRhciBhIHNpZ2xhIGRhIHVuaWRhZGUgcXVlIG8gc2lzdGVtYSBpcsOhIGxvY2FsaXphciIKICB9LAogICJERl9sb2NhbCI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIkxvY2FsOiIJCiAgfSwKICAibmFtZSI6IHsKICAgICJ0eXBlIjogInRleHQiLAogICAgImxhYmVsIjogIk5vbWU6IgogICAgCiAgfSwKICAiZW1haWwiOiB7CiAgICAidHlwZSI6ICJlbWFpbCIsCiAgICAibGFiZWwiOiAiRS1tYWlsOiIsCgkiaGVscGVyIjogIkFicmluZG8gY29tIHNldSBlLW1haWwgaW5zdGl0dWNpb25hbCwgc2V1IGF0ZW5kaW1lbnRvIHNlcsOhIG1haXMgcsOhcGlkbyIKICAgIAogIH0sCQkJCQkJCQkKICAiREZfdGVsZWZvbmUiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJUZWxlZm9uZToiLAogICAgImNvbnRyb2xfd2lkdGgiOiAxMDAKICB9LAogICJ0eXBlIjogewogICAgInR5cGUiOiAic2VsZWN0IiwKICAgICJyZW1vdmVEZWZhdWx0Tm9uZSI6IGZhbHNlLAogICAgImxhYmVsIjogIk1vdGl2bzoiLAogICAgIm9wdGlvbkxhYmVscyI6IFsKICAgICAgT1RSU190eXBlX2xhYmVscwogICAgXQogIH0sCiAgInNlcnZpY2UiOiB7CiAgICAidHlwZSI6ICJoaWRkZW4iCiAgfQogIENGX0ZPUk0sCiAgInN1YmplY3QiOiB7CiAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICJsYWJlbCI6ICJBc3N1bnRvOiIsCiAgICAic2l6ZSI6IDgwCiAgfSwKICAiZGVzY3JpcHRpb24iOiB7CiAgICAidHlwZSI6ICJja2VkaXRvciIsCiAgICAibGFiZWwiOiAiRGVzY3Jpw6fDo286IiwKICAgICJjb2xzIjogODAsCgkiY2tlZGl0b3IiOiB7CgkJInRvb2xiYXIiOiBbCiAgICAgICAgICAgIFsiRm9udCIsICJGb250U2l6ZSIsICItIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICItIiwgIk51bWJlcmVkTGlzdCIsICJCdWxsZXRlZExpc3QiLCAiLSIsICJQYXN0ZSJdLAogICAgICAgIAlbIkltYWdlIiwgIlRhYmxlIiwgIi0iLCAiTGluayJdCiAgICAJXSwKCQkibGFuZ3VhZ2UiOiAicHQtYnIiCgl9LAoJImhlbHBlciI6ICJQYXJhIGluc2VyaXIgaW1hZ2VucywgYmFzdGEgYXJyYXN0YXIgYSBpbWFnZW0gZG8gc2V1IGNvbXB1dGFkb3Igb3UgdXNhciBvIGJvdMOjbyBkZSBpbnNlcmlyIGltYWdlbS4iCiAgfSwKICAiYXR0YWNobWVudCI6IHsJCQkJCQoJInR5cGUiOiAidXBsb2FkIiwKICAgICJtYXhOdW1iZXJPZkZpbGVzIjogMTAwLAoJIm1heEZpbGVTaXplIjogMjQwMDAwMDAsCiAgICAibXVsdGlwbGUiOiB0cnVlLAoJInNob3dVcGxvYWRQcmV2aWV3IjogZmFsc2UsCiAgCSJ1cGxvYWQiOiB7CiAgICAgICJ1cmwiOiAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7VXBsb2FkRmlsZUNtZD1VcGxvYWRGaWxlIiwKICAgICAgImF1dG9VcGxvYWQiIDogdHJ1ZSwKICAgICAgIm1ldGhvZCI6ICJwb3N0IgogIAl9LAogIAkibGFiZWwiOiAiQW5leG86IiwKICAJImhlbHBlciI6ICJBbmV4ZSB1bSBhcnF1aXZvIHNlIG5lY2Vzc8OhcmlvLiIKICB9LAkKICAiQWN0aW9uIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sICAKICAiRm9ybUlEIjogewogICAgInR5cGUiOiAiaGlkZGVuIgogIH0sCiAgIlN1YmFjdGlvbiI6IHsKICAgICJ0eXBlIjogImhpZGRlbiIKICB9CgkJCTwvVGV4dEFyZWE+CgkJPC9TZXR0aW5nPgoJPC9Db25maWdJdGVtPgoJCQoJPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCMjI1Nob3dRdWV1ZSIKCQlSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgoJCTxEZXNjcmlwdGlvbj5XaGVuIGZhbHNlLCBmb3JjZXMgdGhlIHF1ZXVlIHRvIGJlIHByZS1zZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgoJCTxHcm91cD5UaWNrZXQ8L0dyb3VwPgoJCTxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZDwvU3ViR3JvdXA+CgkJPFNldHRpbmc+CgkJCTxTdHJpbmc+MDwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCgk8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIyMjQ3VzdG9tVGVtcGxhdGUiCgkJUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KCQk8RGVzY3JpcHRpb24+Q3VzdG9tIHRlbXBsYXRlIHN1ZmZpeCBmb3IgaGVhZGVyIGFuZCBmb290ZXIuPC9EZXNjcmlwdGlvbj4KCQk8R3JvdXA+VGlja2V0PC9Hcm91cD4KCQk8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQ8L1N1Ykdyb3VwPgoJCTxTZXR0aW5nPgoJCQk8U3RyaW5nPjwvU3RyaW5nPgoJCTwvU2V0dGluZz4KCTwvQ29uZmlnSXRlbT4KCQoJICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUGljdHVyZVVwbG9hZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgcHVibGljIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6UHVibGljOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UGljdHVyZSB1cGxvYWQgbW9kdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QaWN0dXJlLVVwbG9hZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoJCgkJCQkKPC9vdHJzX2NvbmZpZz4=</File> | |
| 40 | + <File Location="Kernel/Language/pt_BR_NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZC5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9OZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgZm9sbG93aW5nIG1haW50ZW5hbmNlcyBhcmUgaW4gcHJvZ3Jlc3MnfSA9ICdBcyBzZWd1aW50ZXMgbWFudXRlbsOnw7VlcyBlc3TDo28gb2NvcnJlbmRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0ZWQgYXQ6ICd9ID0gJ0luaWNpYWRhIGVtOic7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydRdWV1ZXMgcGFuZWwnfSA9ICdOb3ZvIGNoYW1hZG8nOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICd9ID0gJ1NldSBjaGFtYWRvIGZvaSByZWdpc3RyYWRvIGNvbSBzdWNlc3NvISBPIG7Dum1lcm8gw6k6ICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0IHdpemFyZCd9ID0gJ0Fzc2lzdGVudGUgZGUgbm92byBjaGFtYWRvJzsgICAKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyB0aWNrZXQnfSA9ICdOb3ZvIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3JtJ30gPSAnRm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHNlcnZpY2UgZm9ybXMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgZm9ybXVsw6FyaW9zIGRlIHNlcnZpw6dvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRyb2R1Y3Rpb24nfSA9ICdJbnRyb2R1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSd9ID0gJ1NlcnZpw6dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm0nfSA9ICdGb3JtdWzDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgdGhlIHNlcnZpY2UgdG8gYXNrIGZvciBzdXBwb3J0J30gPSAnRXNjb2xoYSBvIHNlcnZpJmNjZWRpbDtvIHBhcmEgbyBxdWFsIGRlc2VqYSBzdXBvcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBjcmVhdGVkJ30gPSAnQ2hhbWFkbyBjcmlhZG8gY29tIHN1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQnfSA9ICdQb3IgZmF2b3IgcHJlZW5jaGEgbyBmb3JtdWzDoXJpbyBwYXJhIGFicmlyIHNldSBjaGFtYWRvJzsgICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7ICAgICAgICAKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 41 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL3B0X0JSX05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlUHVibGljCiMgCiMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA4LTAxIC0gQWRqdXN0bWVudHMgZm9yIE9UUlMgNAojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcCB2ZXJzaW9uCiMgCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfTmV3VGlja2V0V2l6YXJkUHVibGljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGZvbGxvd2luZyBtYWludGVuYW5jZXMgYXJlIGluIHByb2dyZXNzJ30gPSAnQXMgc2VndWludGVzIG1hbnV0ZW7Dp8O1ZXMgZXN0w6NvIG9jb3JyZW5kbyc7CgkkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydGVkIGF0OiAnfSA9ICdJbmljaWFkYSBlbTonOwoJJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWVzIHBhbmVsJ30gPSAnTm92byBjaGFtYWRvJzsKCSRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdXIgdGlja2V0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbnVtYmVyOiAnfSA9ICdTZXUgY2hhbWFkbyBmb2kgcmVnaXN0cmFkbyBjb20gc3VjZXNzbyEgTyBuw7ptZXJvIMOpOiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IHRpY2tldCB3aXphcmQnfSA9ICdBc3Npc3RlbnRlIGRlIG5vdm8gY2hhbWFkbyc7ICAgCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGlja2V0J30gPSAnTm92byBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybXMnfSA9ICdGb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgZm9ybSd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBzZXJ2aWNlIGZvcm1zLid9ID0gJ0NyaWFyIGUgZ2VyZW5jaWFyIGZvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW50cm9kdWN0aW9uJ30gPSAnSW50cm9kdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UnfSA9ICdTZXJ2acOnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtJ30gPSAnRm9ybXVsw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIHRoZSBzZXJ2aWNlIHRvIGFzayBmb3Igc3VwcG9ydCd9ID0gJ0VzY29saGEgbyBzZXJ2aSZjY2VkaWw7byBwYXJhIG8gcXVhbCBkZXNlamEgc3Vwb3J0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgY3JlYXRlZCd9ID0gJ0NoYW1hZG8gY3JpYWRvIGNvbSBzdWNlc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBmaWxsIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBvcGVuIHlvdXIgdGlja2V0J30gPSAnUG9yIGZhdm9yIHByZWVuY2hhIG8gZm9ybXVsw6FyaW8gcGFyYSBhYnJpciBzZXUgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIG9wZW4gYW5vdGhlciB0aWNrZXQnfSA9ICdDbGlxdWUgYXF1aSBwYXJhIGFicmlyIHVtIG91dHJvIGNoYW1hZG8gc2UgZGVzZWphcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGF1dGhlbnRpY2F0ZSd9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgYXV0ZW50aWNhci1zZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaWQgeW91IGtub3cgdGhhdCwgaWYgeW91IGhhdmUgYSBsb2dpbiwgeW91IGNhbiBhdXRoZW50aWNhdGUgZmlyc3QgYW5kIGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgeW91ciBuYW1lIGFuZCBlLW1haWwuIEFsc28sIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gbW9uaXRvciB5b3VyIHRpY2tldCBsYXRlci4nfSA9IAogICAgCQkJCQkgICAnVm9jw6ogc2FiaWEgcXVlLCBhdXRlbnRpY2FuZG8tc2UsIHZvY8OqIG7Do28gcHJlY2lzYSBpbmZvcm1hciBzZXUgbm9tZSBlIGUtbWFpbCBuYSBob3JhIGRlIGFicmlyIG8gY2hhbWFkbz8gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdGFtYsOpbSBkZXBvaXMgYWNvbXBhbmhhciBvIGFuZGFtZW50byBkbyBzZXUgYXRlbmRpbWVudG8hJzsKICAgIAogICAgcmV0dXJuIDE7Cn0KMTs=</File> | |
| 42 | + <File Location="Kernel/Language/pt_BR_NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyBLZXJuZWwvTW9kdWxlcy9wdF9CUl9OZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybS5wbSAtIHRyYW5zbGF0aW9ucyBmb3IgTmV3VGlja2V0V2l6YXJkTW9kdWxlU2VydmljZUZvcm0KIyAKIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIyBWZXJzaW9uIDIwMTUtMDgtMDEgLSBBZGp1c3RtZW50cyBmb3IgT1RSUyA0CiMgVmVyc2lvbiAyMDE3LTA2LTE2IC0gU3VwcG9ydCBmb3IgYm9vdHN0cmFwIHZlcnNpb24KIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX05ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBmb3Jtcyd9ID0gJ0Zvcm11bMOhcmlvcyBkZSBzZXJ2acOnb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2Ugc2VydmljZSBmb3Jtcy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBmb3JtdWzDoXJpb3MgZGUgc2VydmnDp29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludHJvZHVjdGlvbid9ID0gJ0ludHJvZHXDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlJ30gPSAnU2VydmnDp28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybSd9ID0gJ0Zvcm11bMOhcmlvJzsKICAgIHJldHVybiAxOwp9CjE7</File> | |
| 43 | + <File Location="Kernel/Modules/NewTicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcwojIAojIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBEYXRhOjpVVUlEOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQiKTsKCW15ICRUaWNrZXRXaXphcmQgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCgkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZWQgdGlja2V0IHN0YXJ0ZWQiKTsKCSRTZWxmLT5EZWJ1ZygiU3ViYWN0aW9uID0+ICIgLiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApKTsKCglpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJVcGxvYWRGaWxlQ21kIiApKSB7CgkJJFNlbGYtPkRlYnVnKCJGaWxlIHVwbG9hZCBpbnN0cnVjdGlvbiByZWNlaXZlZCIpOwoJCXJldHVybiAkVGlja2V0V2l6YXJkLT5VcGxvYWRGaWxlKCk7Cgl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkNyZWF0ZVRpY2tldCIgKSB7CgkJCSRTZWxmLT5EZWJ1ZygiQ3JlYXRlIHRpY2tldCBhY3Rpb24gcmVjZWl2ZWQiKTsKCQkJcmV0dXJuICRUaWNrZXRXaXphcmQtPkNyZWF0ZVRpY2tldChDdXN0b21lcklEICAgPT4gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0sCgkJCQkJCQkJCQkJICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxmLT57VXNlckxvZ2lufSwKCQkJCQkJCQkJCQkgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAoJCQkJCQkJCQkJCSAgIFVzZXJFbWFpbCA9PiAkU2VsZi0+e1VzZXJFbWFpbH0pOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMCwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDAsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAwKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 44 | + <File Location="Kernel/Modules/NewTicketWizardPublic.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZFB1YmxpYy5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3JlYXRpbmcgY3VzdG9tIG5ldyB0aWNrZXQgaW50ZXJmYWNlcyB3aXRob3V0IHVzZXIgbG9naW4KIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMjAxNS0wOC0wMSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTUtMDYtMjUgLSBTdXBwb3J0IGZvciByZXN0cmljdGVkIHNlcnZpY2VzIGFuZCBIVE1MIGZvcm1hdHRpbmcgb2YgZm9ybSBmaWVsZHMKIyBWZXJzaW9uIDIwMTctMDYtMTYgLSBTdXBwb3J0IGZvciBib290c3RyYXAgYW5kIGxvZ2dlZCBpbiB1c2VyIGlkZW50aWZpY2F0aW9uCiMgVmVyc2lvbiAyMDE3LTA2LTIwIC0gQ29kZSByZWZhY3RvcmluZwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRQdWJsaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIERhdGE6OlVVSUQ7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBVUkk6OkVzY2FwZTsKdXNlIEpTT047CiAKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkIiwKIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZWw6OkNvbmZpZyIKICk7CiAKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCgpzdWIgUnVuIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgkJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCgkjIElmIGEgdGlja2V0IHdhcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkCgkkU2VsZi0+RGVidWcoIkNoZWNraW5nIGlmIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gInRpY2tldCIgKSApIHsKCQlteSAkcmV0b3JubyA9ICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPU5ld1RpY2tldFdpemFyZCIsICk7CgkJJHJldG9ybm8gPX4gcy9wdWJsaWMvY3VzdG9tZXIvZzsKCQlyZXR1cm4gJHJldG9ybm87Cgl9CgoJIyBJZiBhbiBhdXRoZW50aWNhdGUgcGFyYW1ldGVyIHdhcyByZWNlaXZlZCwgcmVkaXJlY3QgdG8gQ0FTIGdhdGV3YXkKCSRTZWxmLT5EZWJ1ZygiQ2hlY2tpbmcgaWYgYXV0aGVudGljYXRlIHBhcmFtZXRlciB3YXMgcmVjZWl2ZWQiKTsKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImF1dGhlbnRpY2F0ZSIgKSApIHsKCQkkU2VsZi0+RGVidWcoIkF1dGhlbnRpY2F0ZSBwYXJhbWV0ZXIgcmVjZWl2ZWQiKTsKCQlteSAkdXJsID0KCQkgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCSAgLiAiL2xvZ2luP2dhdGV3YXk9dHJ1ZSZzZXJ2aWNlPSIKCQkgIC4gImh0dHBzOi8vIgoJCSAgLiAkRU5We1NFUlZFUl9OQU1FfQoJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCSAgLiAiP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWMiOwoJCXJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICR1cmwsICk7Cgl9CgkJICAKCSMgSWYgbm8gYXV0aGVudGljYXRpb24gd2FzIHBvc3NpYmxlLCBwcm9jZWVkIHdpdGggcHVibGljIHRpY2tldCBvcGVuaW5nCgkkU2VsZi0+RGVidWcoIlB1YmxpYyB0aWNrZXQgc3RhcnRlZCIpOwoJJFNlbGYtPkRlYnVnKCJTdWJhY3Rpb24gPT4gIiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkpOwoKCQoJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIgKSkgewoJCSRTZWxmLT5EZWJ1ZygiRmlsZSB1cGxvYWQgaW5zdHJ1Y3Rpb24gcmVjZWl2ZWQiKTsKCQlyZXR1cm4gJFRpY2tldFdpemFyZC0+VXBsb2FkRmlsZSgpOwoJfSBlbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgKSB7CgkJaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU3ViYWN0aW9uIiApIGVxICJDcmVhdGVUaWNrZXQiICkgewoJCQkkU2VsZi0+RGVidWcoIkNyZWF0ZSB0aWNrZXQgYWN0aW9uIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5DcmVhdGVUaWNrZXQoUHVibGljID0+IDEpOwoJCX0KCQllbHNpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTdWJhY3Rpb24iICkgZXEgIkdldEZvcm1KU09OIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gcmVxdWVzdGVkIHJlY2VpdmVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtSlNPTiggUHVibGljPT4gMSwgU2VydmljZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICkgKTsKCQl9IGVsc2lmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSBlcSAiR2V0Rm9ybUN1c3RvbVByb3BzIiApIHsKCQkJJFNlbGYtPkRlYnVnKCJTZXJ2aWNlIGZvcm0gY3VzdG9tIHByb3BlcnRpZXMgKHNjcmlwdCkgcmVxdWVzdGVkIik7CgkJCXJldHVybiAkVGlja2V0V2l6YXJkLT5HZXRGb3JtQ3VzdG9tUHJvcHMoIFB1YmxpYz0+IDEsIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApICk7CgkJfSAKCX0gZWxzZSB7CgkJJFNlbGYtPkRlYnVnKCJEZWZhdWx0IGFjdGlvbiAtIG9wZW4gc2VydmljZSBjaG9vc2luZyBmb3JtIik7CgkJcmV0dXJuICRUaWNrZXRXaXphcmQtPk9wZW5Gb3JtKFB1YmxpYyA9PiAxKTsKCX0KfQoKc3ViIERlYnVnIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnID0gc2hpZnQ7CgkkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZyggUHJpb3JpdHkgPT4gJ2RlYnVnJywgTWVzc2FnZSA9PiAkbXNnICk7Cn0KCjE7Cg==</File> | |
| 45 | + <File Location="Kernel/Modules/NewTicketWizardServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL05ld1RpY2tldFdpemFyZC5wbSAtIGZyb250ZW5kIG1vZHVsZSBmb3IgY3VzdG9taXppbmcgc2VydmljZSBmb3JtcwojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8wOC8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIsCiJLZXJuZUw6OlN5c3RlbTo6TG9nIiwKIktlcm5lbDo6Q29uZmlnIiwKIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiLAoiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtIiwKIktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIiApOwoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAlRGF0YSA9ICgpOwoJCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgkKCWlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlN1YmFjdGlvbiIgKSApIHsKCQlpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCW15ICVzZXJ2aWNlRm9ybTsKCQkJCgkJCSMgaWYgZm9ybSBzcGVjaWZpYyBmb3IgcXVldWUKCQkJaWYgKCRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApKSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApLAoJCQkJCQkJCQkJCQkJCQkJCQkJICBRdWV1ZUlEID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApICk7CgkJCX0gZWxzZSB7CgkJCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtKCBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSApOwoJCQl9CgoJCQkkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJHNlcnZpY2VGb3Jte0ludHJvZHVjdGlvbn07CgkJCSREYXRhe0Zvcm19ICAgICAgICAgPSAkc2VydmljZUZvcm17Rm9ybX07CgkJCSREYXRhe1NjaGVtYX0gICAgICAgPSAkc2VydmljZUZvcm17U2NoZW1hfTsKCQkJJERhdGF7Rml4ZWRWYWx1ZXN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0ZpeGVkVmFsdWVzfTsKCQkJJERhdGF7Q3VzdG9tUHJvcHN9ICAgICAgID0gJHNlcnZpY2VGb3Jte0N1c3RvbVByb3BzfTsKCQkJJERhdGF7U2VydmljZUlEfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICk7CgkJCSREYXRhe1F1ZXVlSUR9ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCgkJCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCQkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQkJCVRlbXBsYXRlRmlsZSA9PiAnTmV3VGlja2V0V2l6YXJkU2VydmljZUZvcm1FZGl0JywKCQkJKTsKCgkJCSMgaHRtbCBvdXRwdXQKCQkJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCgkJCXJldHVybiAkT3V0cHV0OwoJCX0KCQllbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZVNhdmUnICkgewoKCQkJIyBoZWFkZXIKCQkJbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwoJCQkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCgkJCSMgSWYgZm9ybSBpcyBzcGVjaWZpYyBmb3IgYSBxdWV1ZQoJCQlpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpIHsKCQkJCSRTZXJ2aWNlRm9ybU9iamVjdC0+U2F2ZVNlcnZpY2VGb3JtRm9yUXVldWUoCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJUXVldWVJRCAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJRdWV1ZUlEIiApLAoJCQkJCUludHJvZHVjdGlvbiA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiSW50cm9kdWN0aW9uIiApLAoJCQkJCUZvcm0gICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybSIgKSwKCQkJCQlTY2hlbWEgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNjaGVtYSIgKSwKCQkJCQlDdXN0b21Qcm9wcyAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkN1c3RvbVByb3BzIiApLAoJCQkJCUZpeGVkVmFsdWVzICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGaXhlZFZhbHVlcyIgKSwKCQkJCSk7CQkJCQoJCQl9IGVsc2UgewoJCQkJJFNlcnZpY2VGb3JtT2JqZWN0LT5TYXZlU2VydmljZUZvcm0oCgkJCQkJU2VydmljZUlEICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJTZXJ2aWNlSUQiICksCgkJCQkJSW50cm9kdWN0aW9uID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iICksCgkJCQkJRm9ybSAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJGb3JtIiApLAoJCQkJCVNjaGVtYSAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiU2NoZW1hIiApLAoJCQkJCUN1c3RvbVByb3BzICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ3VzdG9tUHJvcHMiICksCgkJCQkJRml4ZWRWYWx1ZXMgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpeGVkVmFsdWVzIiApLAoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRTZWxmLT5PdmVydmlldygpOwoJCX0KCX0KCWVsc2UgewoJCXJldHVybiAkU2VsZi0+T3ZlcnZpZXcoKTsKCX0KfQoKc3ViIE92ZXJ2aWV3IHsKCglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKCW15ICVEYXRhID0gKCk7CgkKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CgoJIyBidWlsZCBvdXRwdXQKCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCU5hbWUgPT4gJ092ZXJ2aWV3JywKCQlEYXRhID0+IHsgJVBhcmFtLCB9LAoJKTsKCgkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQlOYW1lID0+ICdPdmVydmlld0xpc3QnLAoJCURhdGEgPT4geyAlUGFyYW0sIH0sCgkpOwoKCSMgZ2V0IHNlcnZpY2UgbGlzdAoJbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAoJCVZhbGlkICA9PiAxLAoJCVVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgkpOwoKCSMgaWYgdGhlcmUgYXJlIGFueSBzZXJ2aWNlcyBkZWZpbmVkLCB0aGV5IGFyZSBzaG93bgoJaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgoJCSMgc29ydCB0aGUgc2VydmljZSBsaXN0IGJ5IGxvbmcgc2VydmljZSBuYW1lCgkJQHskU2VydmljZUxpc3R9ID0gc29ydCB7ICRhLT57TmFtZX0gLiAnOjonIGNtcCAkYi0+e05hbWV9IC4gJzo6JyB9IEB7JFNlcnZpY2VMaXN0fTsKCgkJZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCQkJaWYgKCEgZ3JlcCB7IGluZGV4KCRfLT57TmFtZX0sICRTZXJ2aWNlRGF0YS0+e05hbWV9IC4gIjo6IikgPj0gMH0gQHskU2VydmljZUxpc3R9ICkgewoKCQkJCSMgb3V0cHV0IHJvdwoJCQkJJExheW91dE9iamVjdC0+QmxvY2soCgkJCQkJTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKCQkJCQlEYXRhID0+IHsgJXskU2VydmljZURhdGF9IH0sCgkJCQkpOwoJCQl9CgkJfQoJfQoKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFRpdGxlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSBGb3JtIikgKTsKCgkkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybScsCgkpOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCXJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File> | |
| 46 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizard.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCQkKCQkJCQkJCQkJCgkJCTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbEJhclB1YmxpYyIpICVdCQkJCQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2J1dHRvbj4KCSAJCQk8L2E+CSAJCQkKWyUgUmVuZGVyQmxvY2tFbmQoIlRvb2xCYXJQdWJsaWMiKSAlXQoJIAkJCQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUb29sQmFyQ3VzdG9tZXIiKSAlXQoJICAJCQk8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly90aS51ZnNjLmJyLyI+CgkJICAJCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1sZyBidG4tZGVmYXVsdCI+CgkgCQkJCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxpc3QtYWx0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPgkgCQkJCgkgCQkJCUNhdMOhbG9nbyBkZSBzZXJ2acOnb3MKCSAJCQkJPC9idXR0b24+CgkgCQkJPC9hPgoJIAkJCTxhIHRhcmdldD0iX25ldyIgaHJlZj0iL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0T3ZlcnZpZXc7U3ViYWN0aW9uPU15VGlja2V0cyI+CSAJCQkKCSAJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4tbGcgYnRuLWRlZmF1bHQiPgoJCSAgCQkJPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGgtbGlzdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4KCQkgIAkJCUNoYW1hZG9zIGFiZXJ0b3MKCQkgIAkJCTwvYnV0dG9uPgkJICAJCQkKCQkgIAkJPC9hPgoJIAkJCQpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbEJhckN1c3RvbWVyIikgJV0KCSAJCTwvZGl2PgoJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQkJPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyAiPgoJIAkJPGgxPlNlVElDIC0gUG9ydGFsIGRlIENoYW1hZG9zPC9oMT4KCSAJCQoJIAkJCgkgCQk8L2Rpdj4KCQk8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlc1BhbmVsIikgJV0KPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtd2FybmluZyI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCTxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXdhcm5pbmctc2lnbiIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4gPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2VzIGFyZSBpbiBwcm9ncmVzcyIpIHwgaHRtbCAlXTwvc3Ryb25nPgoJPC9kaXY+CiAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCTxvbCI+CgkJCVslIFJlbmRlckJsb2NrU3RhcnQoIk1haW50ZW5hbmNlTGluZSIpICVdCgkJCTxsaT5bJSBEYXRhLk1lc3NhZ2UgJV0gKFslIFRyYW5zbGF0ZSgiU3RhcnRlZCBhdDogIikgfCBodG1sICVdIFslIERhdGEuU3RhcnREYXRlICVdKTwvbGk+CgkJCVslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZUxpbmUiKSAlXQoJCTwvb2w+CiAgCTwvZGl2PgogIAkKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNYWludGVuYW5jZXNQYW5lbCIpICVdCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5Ij4KCTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmciPgoJCTxzdHJvbmc+WyUgRGF0YS5Nc2dDaG9vc2VTZXJ2aWNlICVdPC9zdHJvbmc+Cgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJCTxsYWJlbCBmb3I9IlNlcnZpY2VJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CgkJCTxzcGFuIGlkPSJzZXJ2aWNlRElWIj4JCiAgICAgICAgIAkJWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXSAgICAgIAogICAgICAgICAJPC9zcGFuPiAgICAgICAgICAgICAgCgk8L2Rpdj4KCQoJPGRpdiBjbGFzcz0icGFuZWwtZm9vdGVyIiBpZD0ic2VydmljZURlc2NyaXB0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQoJCQlbJSBUcmFuc2xhdGUoIkRpZCB5b3Uga25vdyB0aGF0LCBpZiB5b3UgaGF2ZSBhIGxvZ2luLCB5b3UgY2FuIGF1dGhlbnRpY2F0ZSBmaXJzdCBhbmQgZG8gbm90IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG5hbWUgYW5kIGUtbWFpbC4gQWxzbywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBtb25pdG9yIHlvdXIgdGlja2V0IGxhdGVyLiIpIHwgaHRtbCAlXToKCQkJPEEgdGFyZ2V0PSJfbmV3IiBIUkVGPSIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gYXV0aGVudGljYXRlIikgfCBodG1sICVdPC9BPgpbJSBSZW5kZXJCbG9ja0VuZCgiVW5hdXRoZW50aWNhdGVkTWVzc2FnZSIpICVdCQkJCgk8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1wcmltYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9ImZvcm1QYW5lbCI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGZpbGwgdGhlIGZvbGxvd2luZyBmb3JtIHRvIG9wZW4geW91ciB0aWNrZXQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiIGlkPSJmb3JtVGlja2V0Ij4KCQoJPC9kaXY+CjwvZGl2PgogCiA8c2NyaXB0IHNyYz0iWyUgQ29uZmlnKCJGcm9udGVuZDo6UmljaFRleHRQYXRoIikgJV1ja2VkaXRvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIApbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCUNLRURJVE9SLmNvbmZpZy5maWxlYnJvd3NlclVwbG9hZFVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPVBpY3R1cmVVcGxvYWQmcmVzcG9uc2VUeXBlPWpzb24mRm9ybUlEPVslIERhdGEuRm9ybUlEICVdIjsKCQoJJC5hbHBhY2Euc2V0RGVmYXVsdExvY2FsZSgobmF2aWdhdG9yLmxhbmd1YWdlcyA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiAobmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpKS5yZXBsYWNlKCItIiwiXyIpKTsKCQkJCgkkLmFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKCQkibm9uZUxhYmVsIjogIi0iLAoJfSk7CgkKCSQoIiNTZXJ2aWNlSUQiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CgkJaWYgKCQoIiNTZXJ2aWNlSUQiKS52YWwoKSAhPSAiIikgewoJICAgCQljYXJyZWdhRm9ybVslIERhdGEuUHVibGljTW9kZSAlXSh7IkZvcm1JRCI6ICJbJSBEYXRhLkZvcm1JRCAlXSJ9LCAiWyUgVHJhbnNsYXRlKCJTZW5kIikgfCBodG1sICVdIiwgIlslIEVudigiQ0dJSGFuZGxlIikgJV0iLCAiO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEICVdIiwgIlslIERhdGEuRm9ybUlEICVdIik7CiAgIAkJCSQoIiNmb3JtUGFuZWwiKS5zaG93KCk7CiAgIAkJfSBlbHNlIHsKICAgCQkJZGVzdHJ1aXJGb3JtKCk7CiAgIAkJCSQoIiNzZXJ2aWNlRGVzY3JpcHRpb24iKS5odG1sKCIiKTsKICAgCQkJJCgiI2Zvcm1QYW5lbCIpLmhpZGUoKTsKICAgCQl9ICAJCiAgCX0pOwogIAkKICAgCWlmICgkKCIjU2VydmljZUlEIikuaGFzKCdbc2VsZWN0ZWRdJykpIHsKICAJCWlmICgkKCIjU2VydmljZUlEIikudmFsKCkgIT0gIiIpIHsKICAJCQljYXJyZWdhRm9ybVslIERhdGEuUHVibGljTW9kZSAlXSh7IkZvcm1JRCI6ICJbJSBEYXRhLkZvcm1JRCAlXSJ9LCAiWyUgVHJhbnNsYXRlKCJTZW5kIikgfCBodG1sICVdIiwgIlslIEVudigiQ0dJSGFuZGxlIikgJV0iLCAiO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEICVdIiwgIlslIERhdGEuRm9ybUlEICVdIik7CiAgCQkJJCgiI2Zvcm1QYW5lbCIpLnNob3coKTsgIAkJCSAgCQkJCiAgCQl9CiAgCX0KICAJCiAgCSQoIiNSZXNwb25zaXZlRm9vdGVyIikucmVtb3ZlKCk7Cjwvc2NyaXB0PiAgICAKWyUgRU5EICVd</File> | |
| 47 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceForm.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2VydmljZSBmb3JtcyIpIHwgaHRtbCAlXTwvaDE+CgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQ==</File> | |
| 48 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardServiceFormEdit.tt" Permission="644" Encode="Base64">IyAtLQojIE5ld1RpY2tldFdpemFyZFNlcnZpY2VGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBOZXdUaWNrZXRXaXphcmRTZXJ2aWNlRm9ybQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyRWRpdCIpICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSB8IGh0bWwgJV0gOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VydmljZUlEIiB2YWx1ZT0iWyUgRGF0YS5TZXJ2aWNlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW50cm9kdWN0aW9uIj5bJSBUcmFuc2xhdGUoIkludHJvZHVjdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkludHJvZHVjdGlvbiIgaWQ9IkludHJvZHVjdGlvbiIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIiByb3dzPSI1Ij5bJSBEYXRhLkludHJvZHVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRm9ybVVJIj5bJSBUcmFuc2xhdGUoIkZvcm0iKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZvcm0iIGlkPSJGb3JtVUkiIHN0eWxlPSJ3aWR0aDogNTAlIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5Gb3JtIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0nbW9zdHJhRXNjb25kZSgiRm9ybVVJIik7IHJldHVybiBmYWxzZTsnPkV4aWJpciBKU09OPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJqc29uRm9ybVVJRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+PGRpdiBpZD0ianNvbkZvcm0iPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTY2hlbWEiPlslIFRyYW5zbGF0ZSgiU2NoZW1hIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2NoZW1hIiBpZD0iU2NoZW1hIiBjbGFzcz0iVzUwcGMgIiByb3dzPSIyMCI+WyUgRGF0YS5TY2hlbWEgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJTY2hlbWEiKTsgcmV0dXJuIGZhbHNlOyc+RXhpYmlyIEpTT048L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Impzb25TY2hlbWFEbGciIHN0eWxlPSJoZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7Ij48ZGl2IGlkPSJqc29uU2NoZW1hIj48L2Rpdj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZpeGVkVmFsdWVzIj5bJSBUcmFuc2xhdGUoIkZpeGVkIHZhbHVlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkZpeGVkVmFsdWVzIiBpZD0iRml4ZWRWYWx1ZXMiIGNsYXNzPSJXNTBwYyAiIHJvd3M9IjIwIj5bJSBEYXRhLkZpeGVkVmFsdWVzIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21Qcm9wcyI+WyUgVHJhbnNsYXRlKCJDdXN0b20gUHJvcGVydGllcyBmb3IgYmFzaWMgc2NoZW1hLiA8QlIvPlNfeHh4eHg9eXl5eSA9PiBTY2hlbWE8QlIvPkZfeHh4eHg9eXl5eSA9PiBGb3JtIikgICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ3VzdG9tUHJvcHMiIGlkPSJDdXN0b21Qcm9wcyIgY2xhc3M9Ilc1MHBjICIgcm93cz0iMjAiPlslIERhdGEuQ3VzdG9tUHJvcHMgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSdtb3N0cmFFc2NvbmRlKCJDdXN0b21Qcm9wcyIpOyByZXR1cm4gZmFsc2U7Jz5FeGliaXIgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ianNvbkN1c3RvbVByb3BzRGxnIiBzdHlsZT0iaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3c6IGF1dG87IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iY2hpbGktbGFuZy1qYXZhc2NyaXB0IiBpZD0nanNDb2RlJz48L2NvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCglmdW5jdGlvbiBtb3N0cmFFc2NvbmRlKGlkKSB7CgkJaWRKU09OID0gIiNqc29uIiArIGlkICsgIkRsZyI7CgkJaWQgPSAiIyIgKyBpZDsKCQkkKGlkSlNPTikudG9nZ2xlKCk7CgkJJChpZEpTT04pLndpZHRoKCQoaWQpLndpZHRoKCkpOwoJfQoKPC9zY3JpcHQ+CiAKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CQoKCQoJJCgiI2pzb25Gb3JtVUlEbGciKS50b2dnbGUoKTsKCSQoIiNqc29uU2NoZW1hRGxnIikudG9nZ2xlKCk7CgkkKCIjanNvbkN1c3RvbVByb3BzRGxnIikudG9nZ2xlKCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBjb2RlID0gJCgiI0N1c3RvbVByb3BzIikudmFsKCk7CgkJJCgiI2pzQ29kZSIpLmh0bWwoY29kZSk7CgkJJCgiI2pzQ29kZSIpLmNoaWxpKCk7CQkJCgl9LCAxMDAwKTsKCQoJCglzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQl2YXIganNvbiA9ICJ7IiArICQoIiNTY2hlbWEiKS52YWwoKSArICJ9IjsKCQl0cnkgewoJCQlqc29uID0gSlNPTi5wYXJzZShqc29uKTsKCQkJJCgiI2pzb25TY2hlbWEiKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvblNjaGVtYSIpLkpTT05WaWV3KHtlcnJvcjogIkludmFsaWQgSlNPTiEifSk7CgkJfQoJfSwgMTAwMCk7CgkKCXNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCXZhciBqc29uID0gInsiICsgJCgiI0Zvcm1VSSIpLnZhbCgpICsgIn0iOwoJCXRyeSB7CgkJCWpzb24gPSBKU09OLnBhcnNlKGpzb24pOwoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyhqc29uKTsKCQl9IGNhdGNoKGVycikgewoJCQkkKCIjanNvbkZvcm0iKS5KU09OVmlldyh7ZXJyb3I6ICJJbnZhbGlkIEpTT04hIn0pOwoJCX0KCX0sIDEwMDApOwo8L3NjcmlwdD4gICAgClslIEVORCAlXSAgICAgICAgICAgIAo=</File> | |
| 49 | + <File Location="Kernel/Output/HTML/Templates/Standard/NewTicketWizardTicketCreated.tt" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9OZXdUaWNrZXRXaXphcmQudHQgLSB0ZW1wbGF0ZSBmb3IgbmV3IHRpY2tldCB3aXphcmQKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtcHJpbWFyeSI+Cgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQk8c3Ryb25nPlslIFRyYW5zbGF0ZSgiVGlja2V0IGNyZWF0ZWQiKSB8IGh0bWwgJV08L3N0cm9uZz4KCTwvZGl2PgoJCQoJPGRpdiBjbGFzcz0icGFuZWwtYm9keSI+CgkJPGgyPlslIFRyYW5zbGF0ZSgiWW91ciB0aWNrZXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBudW1iZXI6ICIpIHwgaHRtbCAlXTxzdHJvbmc+WyUgRGF0YS5UaWNrZXROdW1iZXIgJV08L3N0cm9uZz48L2gyPgkJCgkJPGRpdiBjbGFzcz0iYnRuLWdyb3VwLXZlcnRpY2FsIHB1bGwtcmlnaHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA1MHB4Ij4KCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJICAJCQk8YSBocmVmPSIvb3Rycy9bJSBEYXRhLk1vZHVsZSAlXS5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkWyUgRGF0YS5QdWJsaWNNb2RlICVdIj5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gb3BlbiBhbm90aGVyIHRpY2tldCIpIHwgaHRtbCAlXTwvYT4KCQkJPC9idXR0b24+IAoJCTwvZGl2PgkJCgk8L2Rpdj4JCQo8L2Rpdj4KCQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdClslIEVORCAlXQ==</File> | |
| 50 | + <File Location="Kernel/System/ServiceForm.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZUZvcm0ucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAwMS8xMi8yMDE1IC0gU3VwcG9ydCBmb3IgT1RSUyA0LjAuMwojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2VGb3JtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OkRCIiwKIktlcm5lbDo6U3lzdGVtOjpMb2ciKTsKCgpzdWIgbmV3IHsKCW15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgoJIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CglteSAkU2VsZiA9IHslUGFyYW19OwoJYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKCXJldHVybiAkU2VsZjsKfQoKPWhlYWQKClJldHVybnMgYSBzZXJ2aWNlIGZvcm0KCj1jdXQKCnN1YiBHZXRTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlCgo9Y3V0CgpzdWIgR2V0U2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCwgaW50cm9kdWN0aW9uLCBmb3JtLCBmb3JtX3NjaGVtYSwgZml4ZWRfdmFsdWVzLCBjdXN0b21fcHJvcHMgRlJPTSBzZXJ2aWNlX2Zvcm0gV0hFUkUgc2VydmljZV9pZCA9ID8gYW5kIHF1ZXVlX2lkID0gPyAnLAoJCUJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCgkJTGltaXQgPT4gMSwKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSAlU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQkkU2VydmljZURhdGF7U2VydmljZUlEfSAgICA9ICRSb3dbMF07CgkJJFNlcnZpY2VEYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzFdOwoJCSRTZXJ2aWNlRGF0YXtGb3JtfSAgICAgICAgID0gJFJvd1syXTsKCQkkU2VydmljZURhdGF7U2NoZW1hfSAgICAgICA9ICRSb3dbM107CgkJJFNlcnZpY2VEYXRhe0ZpeGVkVmFsdWVzfSAgPSAkUm93WzRdOwoJCSRTZXJ2aWNlRGF0YXtDdXN0b21Qcm9wc30gID0gJFJvd1s1XTsKCX0KCglyZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKU2F2ZXMgYSBzZXJ2aWNlIGZvcm0uIAoKPWN1dAoKc3ViIFNhdmVTZXJ2aWNlRm9ybSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtKFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkIGlzIG51bGwnLCAgICAgICAgCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SW50cm9kdWN0aW9ufSwgXCRQYXJhbXtGb3JtfSwgXCRQYXJhbXtTY2hlbWF9LCBcJFBhcmFte0ZpeGVkVmFsdWVzfSwgXCRQYXJhbXtDdXN0b21Qcm9wc30sIFwkUGFyYW17U2VydmljZUlEfQogICAgICAgIF0pOwkJCgl9IGVsc2UgewoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2Zvcm0oc2VydmljZV9pZCxpbnRyb2R1Y3Rpb24sZm9ybSxmb3JtX3NjaGVtYSxmaXhlZF92YWx1ZXMsY3VzdG9tX3Byb3BzKSBWQUxVRVMgKD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKCj1oZWFkCgpTYXZlcyBhIHNlcnZpY2UgZm9ybSBmb3IgYSBnaXZlIHF1ZXVlLiAKCj1jdXQKCnN1YiBTYXZlU2VydmljZUZvcm1Gb3JRdWV1ZSB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwoJCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgSW50cm9kdWN0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6TG9nIiktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCQoJbXkgJXNlcnZpY2VGb3JtID0gJFNlbGYtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSk7CglteSAkdXBkYXRlID0gKCRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KTsKCQoJaWYgKCR1cGRhdGUpIHsJCQoJCSREQk9iamVjdC0+RG8oU1FMID0+ICdVUERBVEUgc2VydmljZV9mb3JtIFNFVCBpbnRyb2R1Y3Rpb249Pyxmb3JtPT8sZm9ybV9zY2hlbWE9PyxmaXhlZF92YWx1ZXM9PyxjdXN0b21fcHJvcHM9PyB3aGVyZSBzZXJ2aWNlX2lkPT8gYW5kIHF1ZXVlX2lkPT8gJywgICAgICAgIAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17UXVldWVJRH0KICAgICAgICBdKTsJCQoJfSBlbHNlIHsKCQkkREJPYmplY3QtPkRvKFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZV9mb3JtKHNlcnZpY2VfaWQsaW50cm9kdWN0aW9uLGZvcm0sZm9ybV9zY2hlbWEscXVldWVfaWQsZml4ZWRfdmFsdWVzLGN1c3RvbV9wcm9wcykgVkFMVUVTICg/LD8sPyw/LD8sPyw/KScsICAgICAgICAKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte0ludHJvZHVjdGlvbn0sIFwkUGFyYW17Rm9ybX0sIFwkUGFyYW17U2NoZW1hfSwgXCRQYXJhbXtRdWV1ZUlEfSwgXCRQYXJhbXtGaXhlZFZhbHVlc30sIFwkUGFyYW17Q3VzdG9tUHJvcHN9CiAgICAgICAgXSk7Cgl9CQoKICAgIHJldHVybiAxOwoKfQoKMTsK</File> | |
| 51 | + <File Location="Kernel/System/TicketWizard.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0V2l6YXJkLnBtIC0gY29yZSBtb2R1bGUKIyAKIyBDb3B5cmlnaHQgKEMpIFNlVElDIC0gVUZTQyAtIGh0dHA6Ly9zZXRpYy51ZnNjLmJyLwojIFZlcnNpb24gMDEvMTIvMjAxNSAtIFN1cHBvcnQgZm9yIE9UUlMgNC4wLjMKIyBWZXJzaW9uIDIwMTctMDYtMjAgLSBDb2RlIHJlZmFjdG9yaW5nCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0V2l6YXJkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIFVSSTo6RXNjYXBlOwp1c2UgSlNPTjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAoiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIsCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVMOjpTeXN0ZW06OkxvZyIsCiJLZXJuZUw6OlN5c3RlbTo6VGlja2V0IiwKIktlcm5lTDo6U3lzdGVtOjpUeXBlIiwKIktlcm5lbDo6U3lzdGVtOjpZQU0iLAoiS2VybmVsOjpDb25maWciLAoiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIsCiJLZXJuZWw6OlN5c3RlbTo6U2VydmljZSIsCiJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iLAoiS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MiICk7CgoKc3ViIG5ldyB7CglteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKCSMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAoJbXkgJFNlbGYgPSB7JVBhcmFtfTsKCWJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCglyZXR1cm4gJFNlbGY7Cn0KCj1oZWFkClJldHVybnMgZmllbGRzIHN0cnVjdHVyZSBmb3IgbmV3IHRpY2tldCBmb3JtIHdpemFyZCBwdWJsaWMKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNPcHRpb25zUHVibGljIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY0Zvcm1QdWJsaWN9Owp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzY2hlbWEgZm9yIG5ldyB0aWNrZXQgd2l6YXJkIHB1YmxpYwo9Y3V0CnN1YiBHZXRCYXNpY0ZpZWxkc1NjaGVtYVB1YmxpYyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIiktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpLT57QmFzaWNTY2hlbWFQdWJsaWN9Owp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzdHJ1Y3R1cmUgZm9yIG5ldyB0aWNrZXQgZm9ybSB3aXphcmQKPWN1dApzdWIgR2V0QmFzaWNGaWVsZHNPcHRpb25zIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY0Zvcm19Owp9Cgo9aGVhZApSZXR1cm5zIGZpZWxkcyBzY2hlbWEgZm9yIG5ldyB0aWNrZXQgd2l6YXJkCj1jdXQKc3ViIEdldEJhc2ljRmllbGRzU2NoZW1hIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglyZXR1cm4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIiktPntCYXNpY1NjaGVtYX07Cn0KCj1oZWFkClJlcGxhY2VzIE9UUlMgc3lzdGVtIGZpZWxkIHZhbHVlcyAoc2VydmljZSBhbmQgdHlwZSkKPWN1dApzdWIgUmVwbGFjZU9UUlNWYWx1ZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICRzY2hlbWEgID0gJFBhcmFte1NjaGVtYX07CglteSAkb3B0aW9ucyA9ICRQYXJhbXtPcHRpb25zfTsKCglteSAoICRzZXJ2aWNlTmFtZXMsICRzZXJ2aWNlSURzICkgPSAkU2VsZi0+R2V0T1RSU1NlcnZpY2VzRGF0YSgpOwoJJHNjaGVtYSAgPX4gcy9PVFJTX3NlcnZpY2VfdmFsdWVzLyRzZXJ2aWNlSURzL2c7Cgkkb3B0aW9ucyA9fiBzL09UUlNfc2VydmljZV9sYWJlbHMvJHNlcnZpY2VOYW1lcy9nOwoKCW15ICggJHR5cGVOYW1lcywgJHR5cGVJRHMgKSA9ICRTZWxmLT5HZXRPVFJTVHlwZXNEYXRhKFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSk7Cgkkc2NoZW1hICA9fiBzL09UUlNfdHlwZV92YWx1ZXMvJHR5cGVJRHMvZzsKCSRvcHRpb25zID1+IHMvT1RSU190eXBlX2xhYmVscy8kdHlwZU5hbWVzL2c7CgoJcmV0dXJuICggJHNjaGVtYSwgJG9wdGlvbnMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgc2VydmljZXMgaW5mbyAoc2VydmljZSBhbmQgdHlwZSkKPWN1dApzdWIgR2V0T1RSU1NlcnZpY2VzRGF0YSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNlcnZpY2VzID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCglteSAlc2VydmljZUxpc3QgPSAkc2VydmljZXMtPlNlcnZpY2VMaXN0KCBWYWxpZCA9PiAxLCBVc2VySUQgPT4gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKS0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJykgKTsKCW15ICRzZXJ2aWNlTmFtZXMgPSAiIjsKCW15ICRzZXJ2aWNlSURzICAgPSAiIjsKCglmb3JlYWNoICggc29ydCB7ICggJHNlcnZpY2VMaXN0eyRhfSBjbXAgJHNlcnZpY2VMaXN0eyRifSApIH0ga2V5cyAlc2VydmljZUxpc3QgKSB7CgkJJHNlcnZpY2VOYW1lcyAuPSAiXCIkc2VydmljZUxpc3R7JF99XCIsIjsKCQkkc2VydmljZUlEcyAgIC49ICIkXywiOwoJfQoJJHNlcnZpY2VOYW1lcyA9IHN1YnN0cigkc2VydmljZU5hbWVzLCAwLCAtMSk7Cgkkc2VydmljZUlEcyA9IHN1YnN0cigkc2VydmljZUlEcywgMCwgLTEpOwoJcmV0dXJuICggJHNlcnZpY2VOYW1lcywgJHNlcnZpY2VJRHMgKTsKfQoKPWhlYWQKR2V0IE9UUlMgdGlja2V0IHR5cGVzIAo9Y3V0CnN1YiBHZXRPVFJTVHlwZXNEYXRhIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CglteSAkdGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoKCW15ICV0eXBlTGlzdCAgPSAkdGlja2V0T2JqZWN0LT5UaWNrZXRUeXBlTGlzdCggVXNlcklEID0+ICRQYXJhbXtVc2VySUR9ICk7CglteSAkdHlwZU5hbWVzID0gIiI7CglteSAkdHlwZUlEcyAgID0gIiI7CgoJZm9yZWFjaCAoIHNvcnQgeyAoICR0eXBlTGlzdHskYX0gY21wICR0eXBlTGlzdHskYn0gKSB9IGtleXMgJXR5cGVMaXN0ICkgewoJCWlmIChpbmRleCgkdHlwZUxpc3R7JF99LCAnOjonKSA9PSAtMSkgewoJCQkkdHlwZU5hbWVzIC49ICJcIiR0eXBlTGlzdHskX31cIiwiOwoJCQkkdHlwZUlEcyAgIC49ICIkXywiOwoJCX0KCX0KCQoJJHR5cGVOYW1lcyA9IHN1YnN0cigkdHlwZU5hbWVzLCAwLCAtMSk7CgkkdHlwZUlEcyA9IHN1YnN0cigkdHlwZUlEcywgMCwgLTEpOwoJCglyZXR1cm4gKCAkdHlwZU5hbWVzLCAkdHlwZUlEcyApOwp9Cgo9aGVhZApSZXBsYWNlcyBPVFJTIGR5bmFtaWMgZmllbGRzCj1jdXQKc3ViIFJlcGxhY2VPVFJTRHluYW1pY0ZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSAgPSAkUGFyYW17U2NoZW1hfTsKCW15ICRvcHRpb25zID0gJFBhcmFte09wdGlvbnN9OwoKCW15ICRkZmllbGRzICAgID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCIpOwoJbXkgQGRmaWVsZExpc3QgPSBAeyAkZGZpZWxkcy0+RHluYW1pY0ZpZWxkTGlzdEdldCggVmFsaWQgPT4gMSApIH07CgoJZm9yZWFjaCAoQGRmaWVsZExpc3QpIHsKCQlteSAkY2FtcG8gPSAkXzsKCgkJbXkgJG5hbWUgICAgICAgICAgPSAkY2FtcG8tPntOYW1lfTsKCQlteSAkY29uZmlnICAgICAgICA9ICRjYW1wby0+e0NvbmZpZ307CgkJbXkgJHR5cGUgICAgICAgICAgPSAkY2FtcG8tPntGaWVsZFR5cGV9OwoJCW15ICRpZEZpZWxkVmFsdWVzID0gIkRGXyIgLiAkbmFtZSAuICJfdmFsdWVzIjsKCQlteSAkaWRGaWVsZExhYmVscyA9ICJERl8iIC4gJG5hbWUgLiAiX2xhYmVscyI7CgkJaWYgKCAkdHlwZSBlcSAiRHJvcGRvd24iICkgewoJCQlteSAoICRkZlZhbHVlcywgJGRmTGFiZWxzICkgPSAkU2VsZi0+R2V0RHluYW1pY0ZpZWxkVmFsdWVzKCBDb25maWdERiA9PiAkY29uZmlnICk7CgkJCSRzY2hlbWEgID1+IHMvJGlkRmllbGRWYWx1ZXMvJGRmVmFsdWVzL2c7CgkJCSRvcHRpb25zID1+IHMvJGlkRmllbGRMYWJlbHMvJGRmTGFiZWxzL2c7CgkJfQoJfQoKCXJldHVybiAoICRzY2hlbWEsICRvcHRpb25zICk7Cn0KCj1oZWFkCkdldCBPVFJTIGR5YW5taWMgZmllbGQgdmFsdWVzCj1jdXQKc3ViIEdldER5bmFtaWNGaWVsZFZhbHVlcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJGNvbmZpZyA9ICRQYXJhbXtDb25maWdERn07CglteSAkdmFsdWVzID0gJGNvbmZpZy0+e1Bvc3NpYmxlVmFsdWVzfTsKCglteSAkZGZWYWx1ZXMgPSAiIjsKCW15ICRkZkxhYmVscyA9ICIiOwoKCWZvcmVhY2ggKCBzb3J0IHsgKCAkdmFsdWVzLT57JGF9IGNtcCAkdmFsdWVzLT57JGJ9ICkgfSBrZXlzICV7JHZhbHVlc30gKSB7CgkJJGRmVmFsdWVzIC49ICJcIiRfXCIsIjsKCQkkZGZMYWJlbHMgLj0gIlwiJHZhbHVlcy0+eyRffVwiLCI7Cgl9CgoJJGRmVmFsdWVzID0gc3Vic3RyKCRkZlZhbHVlcywgMCwgLTEpOwoJJGRmTGFiZWxzID0gc3Vic3RyKCRkZkxhYmVscywgMCwgLTEpOwoJcmV0dXJuICggJGRmVmFsdWVzLCAkZGZMYWJlbHMgKTsKCn0KCj1oZWFkCkJ1aWxkcyBzZXJ2aWNlIGNob29zaW5nIGNvbWJvCj1jdXQKc3ViIEJ1aWxkU2VydmljZXMgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlF1ZXVlU2VydmljZSIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIik7CglteSAkUmVzdHJpY3RlZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpSZXN0cmljdGVkU2VydmljZSIpOwoJCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJbXkgJVNlcnZpY2VzID0gKCk7CgoJaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJJVNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KCBVc2VySUQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksICk7Cgl9CgllbHNlIHsKCQklU2VydmljZXMgPQoJCSAgJFF1ZXVlU2VydmljZU9iamVjdC0+R2V0U2VydmljZUxpc3QoIFF1ZXVlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICksICk7Cgl9CglteSBAU2VydmljZXNDb21ibyA9ICgpOwoJCglteSBAcmVzdHJpY3RlZFNlcnZpY2VzID0gJFJlc3RyaWN0ZWRPYmplY3QtPkdldFJlc3RyaWN0ZWRTZXJ2aWNlcygpOwoJCglmb3IgbXkgJHNlcnZpY2VJRCAoIGtleXMgJVNlcnZpY2VzICkgewoJCWlmICggZ3JlcCB7IGluZGV4KCAkU2VydmljZXN7JF99LCAkU2VydmljZXN7JHNlcnZpY2VJRH0gLiAiOjoiICkgPj0gMCB9ICgga2V5cyAlU2VydmljZXMgKSApIHsJCQkKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gICAgPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgICAgPSAkc2VydmljZUlEOwoJCQkJJHNlcnZ7RGlzYWJsZWR9ID0gMTsKCQkJCXB1c2ggQFNlcnZpY2VzQ29tYm8sIFwlc2VydjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCEgKCAkc2VydmljZUlEIH5+IEByZXN0cmljdGVkU2VydmljZXMgKSApIHsKCQkJCW15ICVzZXJ2ID0gKCk7CgkJCQkkc2VydntWYWx1ZX0gPSAkU2VydmljZXN7JHNlcnZpY2VJRH07CgkJCQkkc2VydntLZXl9ICAgPSAkc2VydmljZUlEOwoJCQkJcHVzaCBAU2VydmljZXNDb21ibywgXCVzZXJ2OwoJCQl9CgkJfQoJfQoKCUBTZXJ2aWNlc0NvbWJvID0gc29ydCB7ICRhLT57VmFsdWV9IC4gIjo6IiBjbXAgJGItPntWYWx1ZX0gLiAiOjoiIH0gQFNlcnZpY2VzQ29tYm87CgkKCW15ICRyZXRvcm5vID0gIjxzZWxlY3QgaWQ9XCJTZXJ2aWNlSURcIiBkYXRhLWxpdmUtc2VhcmNoLW5vcm1hbGl6ZT1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGRhdGEtbGl2ZS1zZWFyY2g9XCJ0cnVlXCI+XG48b3B0aW9uIHZhbHVlPVwiXCI+LTwvb3B0aW9uPiI7CglteSAkaW5PcHQgPSAwOwoKCWZvciBteSAkc2VydmljZSAoQFNlcnZpY2VzQ29tYm8pIHsKCQlpZiAoJHNlcnZpY2UtPntEaXNhYmxlZH0pIHsKCQkJaWYgKCRpbk9wdCkgewoJCQkJJHJldG9ybm8gPSAkcmV0b3JubyAuICI8L29wdGdyb3VwPlxuIjsKCQkJfQoJCQkkaW5PcHQgPSAxOwoJCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjxvcHRncm91cCBsYWJlbD0nIiAuICRzZXJ2aWNlLT57VmFsdWV9IC4gIic+XG4iOwoJCX0gZWxzZSB7CgkJCSRyZXRvcm5vID0gJHJldG9ybm8gLiAiPG9wdGlvbiB2YWx1ZT0nIiAuICRzZXJ2aWNlLT57S2V5fSAuICInPiIgLiAkU2VsZi0+TGFzdFBhcnQoJHNlcnZpY2UtPntWYWx1ZX0pIC4gIjwvb3B0aW9uPlxuIjsKCQl9Cgl9CgkKCWlmICgkaW5PcHQpIHsKCQkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvb3B0Z3JvdXA+XG4iOwoJfQoJCgkkcmV0b3JubyA9ICRyZXRvcm5vIC4gIjwvc2VsZWN0PlxuIjsKCglyZXR1cm4gJHJldG9ybm87Cn0KCj1oZWFkClJldHVybnMgc2VydmljZSBuYW1lIHdpdGhvdXQgdGhlIHBhcmVudCBzZXJ2aWNlcyBuYW1lcwo9Y3V0CnN1YiBMYXN0UGFydCB7CglteSAkU2VsZiAgPSBzaGlmdDsKCW15ICRxdWV1ZSA9IHNoaWZ0OwoJbXkgQHBhcnRzID0gc3BsaXQoICI6OiIsICRxdWV1ZSApOwoJcmV0dXJuICRwYXJ0c1stMV07Cn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVwbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJVcGxvYWRGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiVXBsb2FkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZVJlY2VpdmUoKTsJCQoJfSBlbHNpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiVXBsb2FkRmlsZUNtZCIpIGVxICJEZWxldGVGaWxlIikgewoJCSRTZWxmLT5EZWJ1ZygiRGVsZXRlIHVwbG9hZGVkIGZpbGUgY29tbWFuZCByZWNlaXZlZCIpOwoJCXJldHVybiAkU2VsZi0+VXBsb2FkRmlsZURlbGV0ZSgpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiVW5rbm93biBmaWxlIGNvbW1hbmQgcmVjZWl2ZWQiKTsKCQlyZXR1cm4gMTsKCX0KfQoKPWhlYWQKSGFuZGxlcyBqUXVlcnlGaWxlVXBsb2FkIGNvbXBvbmVudCBpbiBBbHBhY2FKUwo9Y3V0CnN1YiBVcGxvYWRGaWxlRGVsZXRlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZpbGVOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRmlsZW5hbWUiKTsKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJGb3JtSUQiKTsKCQoJJFNlbGYtPkRlYnVnKCJGaWxlVXBsb2FkOiBEZWxldGUgZmlsZSAkZmlsZU5hbWUgZnJvbSBmb3JtICRmb3JtSWQiKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQlpZiAoJHVwbG9hZGVkRmlsZS0+e0ZpbGVuYW1lfSBlcSAkZmlsZU5hbWUpIHsKCQkJJFdlYlVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKEZvcm1JRCA9PiAkZm9ybUlkLCBGaWxlSUQgPT4gJHVwbG9hZGVkRmlsZS0+e0ZpbGVJRH0pOwoJCQkkU2VsZi0+RGVidWcoIkZpbGVVcGxvYWQ6IERlbGV0ZWQgZmlsZSAiIC4gJGZpbGVOYW1lKTsKCQkJJGZpbGVEZWxldGVkID0gMTsKCQl9Cgl9CgkKCWlmICgkZmlsZURlbGV0ZWQpIHsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgJGZpbGVOYW1lOiB0cnVlfSIsCgkJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCQlOb0NhY2hlICAgICA9PiAxLAoJCSk7CQkJCgl9IGVsc2UgewoJCXJldHVybiAxOwoJfQkKfQoKPWhlYWQKRGVsZXRlcyBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgZm9ybQo9Y3V0CnN1YiBDbGVhckNhY2hlKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCW15ICVEYXRhID0gKCk7CgkKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRXZWJVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CglteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCIpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbXtGb3JtSUR9OwoJCgkkU2VsZi0+RGVidWcoIkNsZWFyaW5nIGNhY2hlIGZvciBmb3JtICIgLiAkZm9ybUlkKTsKCQoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCW15ICRmaWxlRGVsZXRlZCA9IDA7CgkJCglmb3IgbXkgJHVwbG9hZGVkRmlsZSAoQGZpbGVzVXBsb2FkZWQpIHsKCQkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoRm9ybUlEID0+ICRmb3JtSWQsIEZpbGVJRCA9PiAxKTsJCQoJCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogRGVsZXRlZCBmaWxlICIgLiAkdXBsb2FkZWRGaWxlLT57RmlsZW5hbWV9KTsKCX0JCn0KCj1oZWFkCkhhbmRsZXMgalF1ZXJ5RmlsZVVQbG9hZCBjb21wb25lbnQgaW4gQWxwYWNhSlMKPWN1dApzdWIgVXBsb2FkRmlsZVJlY2VpdmUoKSB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCQoJbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCIpOwoJbXkgJFdlYlVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CgoJbXkgJXRtcEZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbChQYXJhbSA9PiAiYXR0YWNobWVudF9maWxlcyIpOwkKCW15ICRmb3JtSWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRm9ybUlEIiApOwoKCWlmICghICR0bXBGaWxle0ZpbGVuYW1lfSB8fCAhICRmb3JtSWQpIHsKCQlteSAkbXNnRXJyb3IgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkludmFsaWQgZmlsZSEiKTsKCQlyZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKCQkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQkJQ29udGVudCAgICAgPT4gInsgXCJlcnJvclwiOiBcIiRtc2dFcnJvclwiLCBcImZpbGVzXCI6IFtdIH0iLAoJCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQkJTm9DYWNoZSAgICAgPT4gMSwKCQkpOwoJfQoKCSRTZWxmLT5EZWJ1ZygiRmlsZVVwbG9hZDogQWRkaW5nIGZpbGUgdG8gY2FjaGUuIEZvcm1JRDogIiAuICRmb3JtSWQgLiAiIFx0IEZpbGVuYW1lOiAiIC4gJHRtcEZpbGV7RmlsZW5hbWV9IC4gIiBcdCBDb250ZW50VHlwZTogIiAuICR0bXBGaWxle0NvbnRlbnRUeXBlfSApOwoJCgkkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgRm9ybUlEICAgICAgPT4gJGZvcm1JZCwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkdG1wRmlsZXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHRtcEZpbGV7Q29udGVudH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJHRtcEZpbGV7Q29udGVudFR5cGV9CiAgICApOwogICAgCiAgICBteSAlcmV0b3JubyA9ICgpOwogICAgbXkgQGZpbGVzUmV0dXJuZWQgPSAoKTsKICAgIAogICAgbXkgJWRhZG9zID0gKCk7CiAgICAkZGFkb3N7bmFtZX0gPSAkdG1wRmlsZXtGaWxlbmFtZX07CiAgICAkZGFkb3N7c2l6ZX0gPSBsZW5ndGgoJHRtcEZpbGV7Q29udGVudH0pOwogICAgCiAgICAkZGFkb3N7ZGVsZXRlVXJsfSA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztVcGxvYWRGaWxlQ21kPURlbGV0ZUZpbGU7RmlsZW5hbWU9IiAuIHVyaV9lc2NhcGUoJHRtcEZpbGV7RmlsZW5hbWV9KSAuICI7Rm9ybUlEPSIgLiAkZm9ybUlkOwogICAgcHVzaCBAZmlsZXNSZXR1cm5lZCwgXCVkYWRvczsgICAgCiAgICAkcmV0b3Jub3siZmlsZXMifSA9IFxAZmlsZXNSZXR1cm5lZDsgICAgCiAgICAKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAoJCUNvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCgkJQ29udGVudCAgICAgPT4gZW5jb2RlX2pzb24oXCVyZXRvcm5vKSwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsJCQp9Cgo9aGVhZApSZXR1cm5zIHRoZSBjdXN0b20gc2NyaXB0IGRlZmluZWQgZm9yIGEgc2VydmljZSwgCglpZiBpdCBleGlzdHMgb3IganVzdCBhIGNvbW1lbnQtYmxhbmsgbGluZSBpZiBpdCBkb2Vzbid0Cj1jdXQKc3ViIEdldEZvcm1DdXN0b21Qcm9wcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiUXVldWVJRCIgKTsKCglpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm1Gb3JRdWV1ZSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CgkJaWYgKCEgJHNlcnZpY2VGb3Jte1NlcnZpY2VJRH0pIHsKCQkJJXNlcnZpY2VGb3JtID0gJFNlcnZpY2VGb3JtT2JqZWN0LT5HZXRTZXJ2aWNlRm9ybSggU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9ICk7CQoJCX0KCX0KCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAkc2VydmljZUZvcm17Q3VzdG9tUHJvcHN9IHx8ICIvKiovIiwKCQlUeXBlICAgICAgICA9PiAnaW5saW5lJywKCQlOb0NhY2hlICAgICA9PiAxLAoJKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgSlNPTiBmb3JtIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzZXJ2aWNlLCBpZiBvbmUgaXMgZGVmaW5lZAo9Y3V0CnN1YiBHZXRGb3JtSlNPTiB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJXNlcnZpY2VGb3JtOwoJCglteSAkU2VydmljZUZvcm1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6U2VydmljZUZvcm0iKTsKCW15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Iik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CgoJbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICJRdWV1ZUlEIik7CglteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiRm9ybUlEIik7CgoJaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCQklc2VydmljZUZvcm0gPSAkU2VydmljZUZvcm1PYmplY3QtPkdldFNlcnZpY2VGb3JtRm9yUXVldWUoIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwgUXVldWVJRCA9PiAkUXVldWVJRCApOwoJCQoJCWlmICghICRzZXJ2aWNlRm9ybXtTZXJ2aWNlSUR9KSB7CgkJCSVzZXJ2aWNlRm9ybSA9ICRTZXJ2aWNlRm9ybU9iamVjdC0+R2V0U2VydmljZUZvcm0oIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSApOwkKCQl9Cgl9CgkKCSRTZWxmLT5DbGVhckNhY2hlKEZvcm1JRCA9PiAkRm9ybUlEKTsKCglteSAoICRzY2hlbWEsICRmaWVsZHMsICRpbnRyb2R1Y3Rpb24gKSA9ICRTZWxmLT5HZXRGb3JtKCBQdWJsaWMgPT4gJFBhcmFte1B1YmxpY30sIFNlcnZpY2VGb3JtID0+IFwlc2VydmljZUZvcm0sIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKCQoJcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCgkJQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKCQlDb250ZW50ICAgICA9PiAiW3siIC4gJHNjaGVtYSAuICJ9LCB7IiAuICRmaWVsZHMgLiAifSwgXCIiIC4gJGludHJvZHVjdGlvbiAuICJcIl0iLAoJCVR5cGUgICAgICAgID0+ICdpbmxpbmUnLAoJCU5vQ2FjaGUgICAgID0+IDEsCgkpOwp9Cgo9aGVhZApBbGxvd3MgdXNpbmcgYSBmaWVsZCBpbiB0aGUgZm9ybSB0byBzZWxlY3QgYSB0YXJnZXQgcXVldWUuCklmIGEgcXVldWUgd2FzIGRlZmluZWQgaW4gcmVxdWVzdCBwYXJhbWV0ZXIsIHVzZXMgaXQuCklmIHRoZXJlIGlzIGEgcHJlZml4IGRlZmluZWQgZm9yIHRoZSBxdWV1ZXMgdG8gYXV0b21hdGljYWxseSBmb3J3YXJkIHRpY2tldHMsCmFuZCBhbHNvIGEgZmllbGQgd2FzIGRlZmluZWQgYXMgaGFuZGxpbmcgdGhlIHRhcmdldCBxdWV1ZSwgdHJ5IHRvIGxvY2F0ZSBvbmUuCgpJZiBub25lIGlzIGZvdW5kLCB1c2VzIHRoZSBkZWZhdWx0IHF1ZXVlLgoKRm9yIGV4YW1wbGU6CglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJUXVldWVQcmVmaXggPSBQcmltZWlybyBOaXZlbAoJUXVldWVGaWVsZCA9IFVuaWRhZGUKCQoJQXZhaWxhYmxlUXVldWVzID0gUHJpbWVpcm8gTml2ZWwgQ0NCLCBQcmltZWlybyBOaXZlbCBDQ0UsIFByaW1laXJvIE5pdmVsCglRdWV1ZURlZmF1bHQgPSBQcmltZWlybyBOaXZlbAoJCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDQiwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDQgoJaWYgUXVldWVGaWVsZCB2YWx1ZSBpcyBDQ0ogKG5vIHF1ZXVlIGJ5IHRoYXQgc3VmZml4KSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsCglpZiBRdWV1ZUZpZWxkIHZhbHVlIGlzIENDRSwgdGhlbiBzZWxlY3RzIHF1ZXVlIFByaW1laXJvIE5pdmVsIENDRQo9Y3V0CnN1YiBHZXRRdWV1ZUlEKCkgewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6UXVldWUiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJCgkjIENoZWNrIGlmIHF1ZXVlSUQgd2FzIHNlbnQKCW15ICRRdWV1ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpOwoJCglpZiAoJFF1ZXVlSUQpIHsKCQlteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KElEID0+ICRRdWV1ZUlEKTsKCQlyZXR1cm4gKCRRdWV1ZXsiTmFtZSJ9LCAkUXVldWVJRCk7IAoJfQoKCSMgR2V0cyBkZWZhdWx0IFF1ZXVlCglteSAkQ29uZmlnVGlja2V0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldE1lc3NhZ2UiKTsKCW15ICRDb25maWdUaWNrZXRXaXphcmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCQoKCW15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnVGlja2V0LT57IlF1ZXVlRGVmYXVsdCJ9OwoKCSMgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBxdWV1ZQoJbXkgJFF1ZXVlUHJlZml4ID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZVByZWZpeCJ9OwoJbXkgJFF1ZXVlRmllbGQgID0gJENvbmZpZ1RpY2tldFdpemFyZC0+eyJRdWV1ZUZpZWxkIn07CgoJbXkgJVF1ZXVlTGlzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3QoIFZhbGlkICAgICAgICAgPT4gMSApOwoJbXkgJVF1ZXVlTGlzdCAgID0gcmV2ZXJzZSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCggVmFsaWQgPT4gMSApOwoJJFF1ZXVlSUQgICAgID0gJFF1ZXVlTGlzdHskUXVldWVEZWZhdWx0fTsKCW15ICRRdWV1ZSAgICAgICA9ICRRdWV1ZUxpc3RJRHskUXVldWVJRH07CgoJaWYgKCAkUXVldWVQcmVmaXggJiYgJFF1ZXVlRmllbGQgKSB7CgkJbXkgJFF1ZXVlU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUXVldWVGaWVsZCApOwoJCW15ICRRdWV1ZU5hbWUgPSAiJFF1ZXVlUHJlZml4ICRRdWV1ZVNlbGVjdGVkIjsKCgkJaWYgKCAkUXVldWVMaXN0eyRRdWV1ZU5hbWV9ICkgewoJCQkkUXVldWVJRCA9ICRRdWV1ZUxpc3R7JFF1ZXVlTmFtZX07CgkJCSRRdWV1ZSAgID0gJFF1ZXVlTmFtZTsKCQl9Cgl9CgkKCXJldHVybiAoICRRdWV1ZSwgJFF1ZXVlSUQgKTsKfQoKPWhlYWQKUmV0dXJucyB0aGUgZm9ybSBjb2RlIGZvciBhIGdpdmVuIHNlcnZpY2UsIGlmIG9uZSBpcyBkZWZpbmVkCj1jdXQKc3ViIEdldEZvcm0gewoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCQoJbXkgJFRpY2tldFdpemFyZCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpUaWNrZXRXaXphcmQiKTsKCW15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OkNvbmZpZyIpOwoJbXkgJHNjaGVtYTsKCW15ICRmaWVsZHM7CgkKCSRTZWxmLT57Q29uZmlnTlRXfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgcHVibGljIGZvcm0gc2NoZW1hIik7CgkJJHNjaGVtYSA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzU2NoZW1hUHVibGljKCk7CgkJJGZpZWxkcyA9ICRUaWNrZXRXaXphcmQtPkdldEJhc2ljRmllbGRzT3B0aW9uc1B1YmxpYygpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIkdldHRpbmcgYXV0aGVudGljYXRlZCBmb3JtIHNjaGVtYSIpOwoJCSRzY2hlbWEgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc1NjaGVtYSgpOwoJCSRmaWVsZHMgPSAkVGlja2V0V2l6YXJkLT5HZXRCYXNpY0ZpZWxkc09wdGlvbnMoKTsKCX0KCQoJbXkgJGludHJvZHVjdGlvbjsKCgkoICRzY2hlbWEsICRmaWVsZHMgKSA9ICRUaWNrZXRXaXphcmQtPlJlcGxhY2VPVFJTVmFsdWVzKAoJCVNjaGVtYSAgPT4gJHNjaGVtYSwKCQlPcHRpb25zID0+ICRmaWVsZHMsCgkJVXNlcklEICA9PiAkU2VsZi0+e0RlZmF1bHRVc2VySUR9CgkpOwoJCglpZiAoICEkUGFyYW17U2VydmljZUZvcm19ICkgewoJCSRzY2hlbWEgPX4gcy9DRl9TQ0hFTUEvL2c7CgkJJGZpZWxkcyA9fiBzL0NGX0ZPUk0vL2c7CgkJJGludHJvZHVjdGlvbiA9ICIiOwoJfQoJZWxzZSB7CgkJbXkgJXNlcnZpY2VGb3JtID0gJXsgJFBhcmFte1NlcnZpY2VGb3JtfSB9OwoJCSRpbnRyb2R1Y3Rpb24gPSAkc2VydmljZUZvcm17SW50cm9kdWN0aW9ufTsKCgkJaWYgKCAhJFBhcmFte1NlcnZpY2VGb3JtfXtTY2hlbWF9ICkgewoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLy9nOwoJCQkkZmllbGRzID1+IHMvQ0ZfRk9STS8vZzsKCQl9CgkJZWxzZSB7CgkJCW15ICRzY2hlbWFGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte1NjaGVtYX07CgkJCW15ICRmaWVsZHNGb3JtID0gIiwiIC4gJHNlcnZpY2VGb3Jte0Zvcm19OwoJCQkkc2NoZW1hID1+IHMvQ0ZfU0NIRU1BLyRzY2hlbWFGb3JtL2c7CgkJCSRmaWVsZHMgPX4gcy9DRl9GT1JNLyRmaWVsZHNGb3JtL2c7CgkJfQoJCQoJCSMgU2V0IGZpeGVkIGZpZWxkIHZhbHVlcywgaWYgZGVmaW5lZAoJCWlmICgkc2VydmljZUZvcm17Rml4ZWRWYWx1ZXN9KSB7CgkJCSgkc2NoZW1hLCAkZmllbGRzKSA9ICRTZWxmLT5BZGp1c3RGaXhlZEZpZWxkcyhTY2hlbWEgPT4gJHNjaGVtYSwgRmllbGRzID0+ICRmaWVsZHMsIEZpeGVkVmFsdWVzID0+ICRzZXJ2aWNlRm9ybXtGaXhlZFZhbHVlc30pOwoJCX0JCgl9CgkKCSMgSW5jbHVkZSBkeW5hbWljIGZpZWxkcyBpbiByZXBsYWNlIGNvbW1hbmQKCSggJHNjaGVtYSwgJGZpZWxkcyApID0gJFRpY2tldFdpemFyZC0+UmVwbGFjZU9UUlNEeW5hbWljRmllbGRzKCBTY2hlbWEgPT4gJHNjaGVtYSwgT3B0aW9ucyA9PiAkZmllbGRzICk7CgkKCWlmICgkUGFyYW17IlF1ZXVlSUQifSkgewkJCQoJCSRzY2hlbWEgPSAkc2NoZW1hIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJzdHJpbmdcIixcblwiZGVmYXVsdFwiOiBcIiIgLiAkUGFyYW17IlF1ZXVlSUQifSAuICJcIn0iOwoJCSRmaWVsZHMgPSAkZmllbGRzIC4gIixcblwiUXVldWVJRFwiOiB7XG5cInR5cGVcIjogXCJoaWRkZW5cIlxufSI7Cgl9CgoJcmV0dXJuICggJHNjaGVtYSwgJGZpZWxkcywgJGludHJvZHVjdGlvbiApOwp9Cgo9aGVhZApJZiBzb21lIGZpZWxkcyBoYXZlIGZpeGVkIHZhbHVlcyBpbiBzZXJ2aWNlIGRlZmluaXRpb24sIHNldHMgdGhlbQo9Y3V0CnN1YiBBZGp1c3RGaXhlZEZpZWxkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJHNjaGVtYSA9ICRQYXJhbXtTY2hlbWF9OwoJbXkgJGZvcm0gPSAkUGFyYW17RmllbGRzfTsKCW15ICRmaXhlZFZhbHVlcyA9ICRQYXJhbXtGaXhlZFZhbHVlc307CgkKCW15IEB2YWx1ZXMgPSBzcGxpdCgvXG4vLCAkZml4ZWRWYWx1ZXMpOwoJCglmb3IgbXkgJHZhbHVlIChAdmFsdWVzKSB7CgoJCSR2YWx1ZSA9fiBzL1xyLy9nOwoJCW15IEBkYXRhID0gc3BsaXQoJz0nLCAkdmFsdWUpOwoJCQkJCQoJCW15ICRmaWVsZEtleSA9ICRkYXRhWzBdOwoJCW15ICRmaXhlZFZhbHVlID0gJGRhdGFbMV07CgkJCQkJCQkJCQkKCQlteSAka2V5ID0gJygiJyAuICRmaWVsZEtleSAuICciW1wgXT86W1wgXT97W159XSt9KSc7CgkJbXkgJHJlcGxhY2UgPSAnIicgLiAkZmllbGRLZXkgLiAnIicgLiAnOiB7InR5cGUiOiAic3RyaW5nIiwgImRlZmF1bHQiOiAiJyAuICRmaXhlZFZhbHVlIC4gJyJ9JzsKCQkKCQkkc2NoZW1hID1+IHMvJGtleS8kcmVwbGFjZS87CgkJCgkJJGtleSA9ICcoIicgLiAkZmllbGRLZXkgLiAnIltcIF0/OltcIF0/e1tefV0rfSknOwoJCSRyZXBsYWNlID0gJyInIC4gJGZpZWxkS2V5IC4gJyI6IHsidHlwZSI6ICJoaWRkZW4iJyAuICJcbn0iOwoJCSRmb3JtID1+IHMvJGtleS8kcmVwbGFjZS87Cgl9CQkKCQoJcmV0dXJuICgkc2NoZW1hLCAkZm9ybSk7CQp9Cgo9aGVhZApDcmVhdGVzIGEgbmV3IHRpY2tldCwgZ2l2ZW4gdGhlIGlucHV0IGRhdGEgYW5kIHNlbnQgYXR0YWNobWVudHMvaW1hZ2VzCj1jdXQKc3ViIENyZWF0ZVRpY2tldCB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJbXkgJURhdGEgPSAoKTsKCglteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldCIpOwoJbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6Q29uZmlnIik7CglteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Iik7CglteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQiKTsKCW15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkIik7CglteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlciIpOwoJCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgCglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoJCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCSRTZWxmLT57RGVmYXVsdFVzZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdEN1c3RvbWVySUQifTsKCSRTZWxmLT57RGVmYXVsdFVzZXJEb21haW59ID0gJFNlbGYtPntDb25maWdOVFd9LT57IkRlZmF1bHRVc2VyRG9tYWluIn07CgkKCSMgQ2hlY2sgaWYgcXVldWUgd2FzIHByZS1kZWZpbmVkCglteSAkcXVldWVGaXhlZCA9IDA7CglpZiAoJERhdGF7UXVldWVJRH0pIHsKCQkkcXVldWVGaXhlZCA9IDE7Cgl9CQoJCgkjIEdldCBxdWV1ZSBuYW1lIGFuZCBpZCB1c2luZyBydWxlcywgaWYgbm8gcXVldWUgd2FzIHByZWRlZmluZWQKCW15ICggJFF1ZXVlLCAkUXVldWVJRCApID0gJFRpY2tldFdpemFyZC0+R2V0UXVldWVJRCglUGFyYW0pOwoJJERhdGF7UXVldWVJRH0gPSAkUXVldWVJRDsKCgkjIE1vZHVsZSBjb25maWcKCSRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlIik7CgoJIyBUaWNrZXQgY3JlYXRpb24KCW15ICRjdXN0b21lcklEOwoJbXkgJGN1c3RvbWVyVXNlcjsKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJGN1c3RvbWVySUQgPSAkU2VsZi0+R2V0VXNlcklERnJvbUVtYWlsKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiZW1haWwiICkgKTsKCQkkY3VzdG9tZXJVc2VyID0gJFNlbGYtPkdldFVzZXJJREZyb21FbWFpbCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gImVtYWlsIiApICk7Cgl9IGVsc2UgewoJCSRjdXN0b21lcklEID0gJFBhcmFte0N1c3RvbWVySUR9OwoJCSRjdXN0b21lclVzZXIgPSAkUGFyYW17Q3VzdG9tZXJVc2VyfTsKCX0KCQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyB0aWNrZXQiKTsKCW15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKCQlUaXRsZSAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCVF1ZXVlSUQgICAgPT4gJFF1ZXVlSUQsCgkJUHJpb3JpdHkgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9LAoJCUxvY2sgICAgICAgPT4gJ3VubG9jaycsCgkJU3RhdGUgICAgICA9PiAnbmV3JywKCQlTZXJ2aWNlSUQgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzZXJ2aWNlIiApLAoJCVR5cGVJRCAgICAgPT4kUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAidHlwZSIgKSwKCQlDdXN0b21lcklEID0+ICRjdXN0b21lcklELAoJCUN1c3RvbWVyVXNlciA9PiAkY3VzdG9tZXJVc2VyLAoJCU93bmVySUQgPT4gJFNlbGYtPntEZWZhdWx0VXNlcklEfSwKCQlVc2VySUQgID0+ICRTZWxmLT57RGVmYXVsdFVzZXJJRH0sCgkpOwoJJFNlbGYtPkRlYnVnKCJDcmVhdGVkIHRpY2tldCBJRCAkVGlja2V0SUQiKTsKCglteSAkTWltZVR5cGUgICAgICA9ICd0ZXh0L2h0bWwnOwoJbXkgJXNlcnZpY2VGaWVsZHNWYWx1ZXMgPSAoKTsKCW15ICRzZXJ2aWNlRmllbGRzID0gIiI7CglteSBAc2VydmljZUZpZWxkc0tleXMgPSAoKTsKCgkjIFNlcnZpY2UgRmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmb3JtIHZhbHVlcyIpOwoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCggc3Vic3RyKCAkXywgMCwgMyApIGVxICJTRl8iICkgJiYgKCBzdWJzdHIoICRfLCAwLCA1ICkgbmUgIlNGX1RfIiApKSB7CgkJCWlmICgkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkXyApKSB7CgkJCQlteSBAcGFyYW1WYWxzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJF8gKTsJCQkJCgkJCQlmb3IgbXkgJHBhcmFtVmFsdWUgKEBwYXJhbVZhbHMpIHsKCQkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCQlpZiAoISAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30pIHsKCQkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSA9ICRwYXJhbVZhbHVlOwoJCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHNlcnZpY2VGaWVsZHNWYWx1ZXN7JF99IC49ICIsICIgLiAkcGFyYW1WYWx1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0JCQkJCgkJCX0gZWxzZSB7CgkJCQlteSAkcGFyYW1WYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7IAoJCQkJCgkJCQlpZiAoKCRwYXJhbVZhbHVlKSAmJiAoISgkcGFyYW1WYWx1ZSBlcSAiLSIpKSkgewoJCQkJCWlmICghICRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSkgewoJCQkJCQkkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gPSAkcGFyYW1WYWx1ZTsKCQkJCQkJcHVzaCBAc2VydmljZUZpZWxkc0tleXMsICRfOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRzZXJ2aWNlRmllbGRzVmFsdWVzeyRffSAuPSAiLCAiIC4gJHBhcmFtVmFsdWU7CgkJCQkJfQkJCQkJCQoJCQkJfQoJCQl9CgkJfQoJfQoJCglmb3IgKEBzZXJ2aWNlRmllbGRzS2V5cykgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8Qj4iIC4gJFNlbGYtPmJyZWFrV29yZHMoVGV4dCA9PiBzdWJzdHIoICRfLCAzICkpIC4gIjogPC9CPiIgLiAkc2VydmljZUZpZWxkc1ZhbHVlc3skX30gLiAiPEJSLz4iOwoJfQkKCQoJJHNlcnZpY2VGaWVsZHMgLj0gIjxCPklQOiA8L0I+IiAuICAkRU5WeydSRU1PVEVfQUREUid9IC4gIjxCUi8+IjsKCSRzZXJ2aWNlRmllbGRzIC49ICI8QlIvPjxCUi8+IjsKCgkjIER5bmFtaWMgRmllbGRzCglteSAkdXNlcklEREY7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkdXNlcklEREYgPSAkU2VsZi0+e0RlZmF1bHRVc2VySUR9OwoJfSBlbHNlIHsKCQkkdXNlcklEREYgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKTsKCX0KCSRTZWxmLT5EZWJ1ZygiUmV0cmlldmluZyBkeW5hbWljIGZpZWxkcyB2YWx1ZXMiKTsKCWZvciAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpICkgewoJCWlmICggc3Vic3RyKCAkXywgMCwgMyApIGVxICJERl8iICkgewoJCQlteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKCQkJCUR5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoIE5hbWUgPT4gc3Vic3RyKCAkXywgMyApICksCgkJCQlPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAoJCQkJVmFsdWUgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICksCgkJCQlVc2VySUQgPT4gJHVzZXJJRERGLAoJCQkpOwoJCX0KCX0KCgkjIFNlcnZpY2UgRmllbGRzIC0gVGFibGUgZmllbGRzCgkkU2VsZi0+RGVidWcoIlJldHJpZXZpbmcgc2VydmljZSBmaWVsZHMgLSB0YWJsZSBmaWVsZHMiKTsKCW15ICRsYXN0VGFiID0gIiI7CglteSAla2V5c0ZvdW5kID0gKCk7CglteSAkbmV3VGFiID0gMTsKCQoJZm9yICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCkgKSB7CgkJaWYgKCBzdWJzdHIoICRfLCAwLCA1ICkgZXEgIlNGX1RfIiApIHsKCQkJbXkgJHBhcmFtTmFtZSA9ICRfOwoJCQlteSBAcGFydHMgPSBzcGxpdCgnXycsICRfKTsKCQkJbXkgJGN1cnJUYWIgPSAkcGFydHNbMl07CgkJCW15ICRjdXJyS2V5ID0gJHBhcnRzWzRdOwoJCQkKCQkJaWYgKCRjdXJyVGFiIG5lICRsYXN0VGFiKSB7CgkJCQlpZiAoJGxhc3RUYWIgbmUgIiIpIHsKCQkJCQkkc2VydmljZUZpZWxkcyAuPSAiPC9UQUJMRT48QlIvPjxCUi8+IjsKCQkJCX0KCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VEFCTEUgc3R5bGU9J2JvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA3MDBweDsnIGJvcmRlcj0nMXB4Jz4iOwoJCQkJJGxhc3RUYWIgPSAkY3VyclRhYjsKCQkJCSRuZXdUYWIgPSAxOwoJCQl9IGVsc2UgewoJCQkJJG5ld1RhYiA9IDA7CgkJCX0KCQkJCgkJCSMjIG5ldyBsaW5lIGR1ZSB0byByZXBldGl0aW9uIG9yIG5ldyB0YWJsZQoJCQlpZiAoJGtleXNGb3VuZHskY3VycktleX0gfHwgKCRuZXdUYWIpICkgewoJCQkJJWtleXNGb3VuZCA9ICgpOwkJCQkKCQkJCSRzZXJ2aWNlRmllbGRzIC49ICI8VFI+PFREIENPTFNQQU49JzInIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogbGFyZ2UnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyVGFiKSAuICI8L0I+PC9URD48L1RSPiI7IAoJCQl9CgkJCSRrZXlzRm91bmR7JGN1cnJLZXl9ID0gMTsKCQkJJHNlcnZpY2VGaWVsZHMgLj0gIjxUUj48VEQgc3R5bGU9J3dpZHRoOiAxMDBweDsnPjxCPiIgLiAkU2VsZi0+YnJlYWtXb3JkcyhUZXh0ID0+ICRjdXJyS2V5KSAuICI8L0I+PC9URD48VEQ+IiAuICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRwYXJhbU5hbWUgKSAuICI8L1REPjwvVFI+IjsJCQkKCQl9Cgl9CgkKCWlmICgkbGFzdFRhYiBuZSAiIikgewoJCSRzZXJ2aWNlRmllbGRzIC49ICI8L1RBQkxFPjxCUi8+PEJSLz4iOwoJfQoJCglteSAkYm9keSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJkZXNjcmlwdGlvbiIgKTsKCgkjIEltYWdlcwoJJFNlbGYtPkRlYnVnKCJMb2FkaW5nIGltYWdlcyBmcm9tIGNhY2hlIik7CglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJbXkgJGZvcm1JZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIkZvcm1JRCIpOwoJbXkgQGZpbGVzVXBsb2FkZWQgPSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YShGb3JtSUQgPT4gJGZvcm1JZCk7CgkKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCW15ICRDb250ZW50SUQgPSAkdXBsb2FkZWRGaWxlLT57Q29udGVudElEfTsKICAgICAgICBpZiAoJENvbnRlbnRJRCAmJiAoICR1cGxvYWRlZEZpbGUtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSAmJiAoICR1cGxvYWRlZEZpbGUtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSkgewogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogcmVwbGFjaW5nIGltYWdlIFVSTCBpbiBib2R5IHdpdGggYXR0YWNobWVudCIpOwogICAgICAgIAkkU2VsZi0+RGVidWcoIk5ld1RpY2tldFdpemFyZDogQm9keTogJGJvZHkiKTsKICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoVGV4dCA9PiAkQ29udGVudElELCk7CgkJCSMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgJGJvZHkgPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKICAgICAgICAgICAgJFNlbGYtPkRlYnVnKCJOZXdUaWNrZXRXaXphcmQ6IG5ldyBib2R5OiAkYm9keSIpOwogICAgICAgIH0KCX0KCQoJIyBDcmVhdGUgYXJ0aWNsZQoJJFNlbGYtPkRlYnVnKCJDcmVhdGluZyBhcnRpY2xlIik7CglteSAkRnVsbE5hbWU7CglteSAkRW1haWw7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRGdWxsTmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJuYW1lIiApOwoJCSRFbWFpbCAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJlbWFpbCIgKTsJCQoJfSBlbHNlIHsKCQkkRnVsbE5hbWUgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSk7CgkJJEVtYWlsICAgID0gJFBhcmFte1VzZXJFbWFpbH07Cgl9CgkJCglteSAkRnJvbSAgICAgPSAiXCIkRnVsbE5hbWVcIiA8JEVtYWlsPiI7CglteSAkQXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKCQlUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKCQlBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKCQlTZW5kZXJUeXBlICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAoJCUZyb20gICAgICAgICAgICAgPT4gJEZyb20sCgkJVG8gICAgICAgICAgICAgICA9PiAkUXVldWUsCgkJU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAic3ViamVjdCIgKSwKCQlCb2R5ICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksCgkJTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCgkJQ2hhcnNldCAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAoJCVVzZXJJRCAgICAgICAgICAgPT4gJHVzZXJJRERGLAoJCUhpc3RvcnlUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAoJCUhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCgkJQXV0b1Jlc3BvbnNlVHlwZSA9PiAoICRDb25maWdPYmplY3QtPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkKCQk/ICdhdXRvIHJlcGx5JwoJCTogJycsCgkJT3JpZ0hlYWRlciA9PiB7CgkJCUZyb20gICAgPT4gJEZyb20sCgkJCVRvICAgICAgPT4gJFF1ZXVlLAoJCQlTdWJqZWN0ID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJzdWJqZWN0IiApLAoJCQlCb2R5ICAgID0+ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZShTdHJpbmcgPT4gJHNlcnZpY2VGaWVsZHMgLiAkYm9keSksLAoJCX0sCgkJUXVldWUgPT4gJFF1ZXVlLAoJKTsKCQoJIyBBdHRhY2htZW50cwoJJFNlbGYtPkRlYnVnKCJJbmNsdWRpbmcgYXR0YWNobWVudHMiKTsKCWZvciBteSAkdXBsb2FkZWRGaWxlIChAZmlsZXNVcGxvYWRlZCkgewoJCSRUaWNrZXRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCgkJCUZpbGVuYW1lID0+ICR1cGxvYWRlZEZpbGUtPntGaWxlbmFtZX0sCgkJCUNvbnRlbnQgPT4gJHVwbG9hZGVkRmlsZS0+e0NvbnRlbnR9LAoJCQlDb250ZW50VHlwZSA9PiAkdXBsb2FkZWRGaWxlLT57Q29udGVudFR5cGV9LAoJCQlBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKCQkJQ29udGVudElEID0+ICR1cGxvYWRlZEZpbGUtPntDb250ZW50SUR9LAoJCQlVc2VySUQgICAgPT4gJHVzZXJJRERGLAoJCSk7Cgl9CgkKCSREYXRhe1RpY2tldE51bWJlcn0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoJJFNlbGYtPntDb25maWdOVFd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lcjo6TmV3VGlja2V0V2l6YXJkIik7CglteSAkaWRDdXN0b21UZW1wbGF0ZSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJDdXN0b21UZW1wbGF0ZSJ9OwoJCgkjIGJ1aWxkIG91dHB1dAoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJERhdGF7UHVibGljTW9kZX0gPSAiUHVibGljIjsKCQkkRGF0YXtNb2R1bGV9ID0gInB1YmxpYyI7Cgl9IGVsc2UgewoJCSREYXRhe01vZHVsZX0gPSAiY3VzdG9tZXIiOwoJfQoJaWYgKCEgJHF1ZXVlRml4ZWQpIHsKCQlkZWxldGUgJERhdGF7UXVldWVJRH0gCgl9CglteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSwgVGl0bGUgPT4gIlRpY2tldCBjcmVhdGVkIiApOwoJJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCgkJRGF0YSAgICAgICAgID0+IFwlRGF0YSwKCQlUZW1wbGF0ZUZpbGUgPT4gJ05ld1RpY2tldFdpemFyZFRpY2tldENyZWF0ZWQnLAoJKTsKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKCn0KCj1oZWFkCklmIHB1YmxpYyBpbnRlcmZhY2Ugd2FzIHVzZWQsIHRyeSB0byBndWVzcyB0aGUgdXNlciBmcm9tIHRoZSBpbmZvcm1lZCBlLW1haWwKPWN1dApzdWIgR2V0VXNlcklERnJvbUVtYWlsIHsKCW15ICRTZWxmICAgICAgID0gc2hpZnQ7CglteSAkZW1haWwgICAgICA9IHNoaWZ0OwoJbXkgJHJlc3VsdCAgICAgPSAkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfTsKCW15ICRkb21haW5MaXN0ID0gJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn07CgkKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CgoJaWYgKCRkb21haW5MaXN0KSB7CgkJbXkgQGRvbWFpbnMgPSBzcGxpdCggIiwiLCAkZG9tYWluTGlzdCApOwoJCQoJCWZvciBteSAkZG9tYWluIChAZG9tYWlucykgewoJCQlteSBAcGFydHMgPSBzcGxpdCggIkAiLCAkZW1haWwgKTsKCQkJaWYgKCAkcGFydHNbMV0gZXEgJGRvbWFpbiApIHsKCQkJCW15ICRpZCAgID0gJHBhcnRzWzBdOwoJCQkJbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKCQkJCQlVc2VyTG9naW4gPT4gJGlkLAoJCQkJCVZhbGlkICAgICA9PiAxLCAgICAgICAgICAgICAgIyBub3QgcmVxdWlyZWQsIGRlZmF1bHQgMQoJCQkJKTsKCQkJCWlmICgga2V5cyAlTGlzdCApIHsKCQkJCQkkcmVzdWx0ID0gJGlkOwoJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiAkcmVzdWx0Owp9Cgo9aGVhZApEZWZhdWx0IGFjdGlvbiB0byBvcGVuIGEgbmV3IGZvcm0gKGZyb250ZW5kIG1ldGhvZCBzaGFyZSBieSBwdWJsaWMgYW5kIGN1c3RvbWVyIGZyb250ZW5kIG1vZHVsZXMpCj1jdXQKc3ViIE9wZW5Gb3JtIHsKCW15ICggJFNlbGYsICVQYXJhbSApID0gQF87CQkKCW15ICVEYXRhID0gKCk7CgkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRTZWxmLT5EZWJ1ZygiT3BlbmluZyBwdWJsaWMgZm9ybSIpOwoJfSBlbHNlIHsKCQkkU2VsZi0+RGVidWcoIk9wZW5pbmcgYXV0aGVudGljYXRlZCBmb3JtIik7Cgl9CgkKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgkKCW15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6VGlja2V0Iik7CglteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpDb25maWciKTsKCW15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QiKTsKCW15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCIpOwoJbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQiKTsKCW15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIik7CglteSAkVGlja2V0V2l6YXJkID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlRpY2tldFdpemFyZCIpOwoKCW15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZSIpOwoJbXkgJFF1ZXVlU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpRdWV1ZVNlcnZpY2UiKTsKCW15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UiKTsKCW15ICRNYWludGVuYW5jZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpNYWludGVuYW5jZSIpOwoJbXkgJERhdGVVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEYXRlVXRpbHMiKTsKCglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtBdXRoZW50aWNhdGVVUkx9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6QXV0aE1vZHVsZTo6Q0FTOjpDQVNVcmwnKQoJCQkgIC4gIi9sb2dpbj9zZXJ2aWNlPSIKCQkJICAuICJodHRwczovLyIKCQkJICAuICRFTlZ7U0VSVkVSX05BTUV9CgkJCSAgLiAkRU5We1NDUklQVF9OQU1FfQoJCQkgIC4gIj9BY3Rpb249TmV3VGlja2V0V2l6YXJkIjsKCX0KCQoJIyBDaGVjayBpZiBxdWV1ZSBwYXJhbWV0ZXIgd2FzIHJlY2VpdmVkCglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVldWVJRCIpKSB7CQkKCQkkRGF0YXtRdWV1ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXVlSUQiKTsKCQkkU2VsZi0+RGVidWcoIlNwZWNpZmljIHF1ZXVlIGRlZmluZWQgPT4gIiAuICREYXRhe1F1ZXVlSUR9KTsKCX0gZWxzZSB7CgkJICMgQ2hlY2sgaWYgbXVzdCBzaG93IHF1ZXVlIC0gaWYgc28sIHJlZGlyZWN0IHVzZXIKICAgICAgICBteSAkX0NvbmZpZ1RpY2tldFdpemFyZCA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXI6Ok5ld1RpY2tldFdpemFyZCIpOwogICAgICAgIG15ICRfU2hvd1F1ZXVlICAgICAgICAgID0gJF9Db25maWdUaWNrZXRXaXphcmQtPnsiU2hvd1F1ZXVlIn07CiAgICAgICAgaWYgKCEgJF9TaG93UXVldWUpIHsKICAgICAgICAJJFNlbGYtPkRlYnVnKCJRdWV1ZSBzZWxlY3Rpb24gbXVzdCBiZSBzaG93biAtIHJlZGlyZWN0aW9uIHRvIFF1ZXVlUGFuZWxQdWJsaWMgYWN0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj1RdWV1ZXNQYW5lbFB1YmxpYyIgKTsKICAgICAgICB9CQkKCX0KCQoJbXkgKCAkc2NoZW1hLCAkZmllbGRzICkgPSAkVGlja2V0V2l6YXJkLT5HZXRGb3JtKFB1YmxpYyA9PiAkUGFyYW17UHVibGljfSk7CgkKCSREYXRhe1NjaGVtYUZvcm19ID0gJHNjaGVtYTsKCSREYXRhe0ZpZWxkc0Zvcm19ID0gJGZpZWxkczsKCgkjIENvbW1vbiBpbmZvCgkkU2VsZi0+e0NvbmZpZ05UV30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyOjpOZXdUaWNrZXRXaXphcmQiKTsKCW15ICRpZEN1c3RvbVRlbXBsYXRlID0gJFNlbGYtPntDb25maWdOVFd9LT57IkN1c3RvbVRlbXBsYXRlIn07CgkKCW15ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCWlmICgkUGFyYW17UHVibGljfSkgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlUHVibGljIn07Cgl9IGVsc2UgewoJCSRtc2dDaG9vc2VTZXJ2aWNlID0gJFNlbGYtPntDb25maWdOVFd9LT57Ik1lc3NhZ2VDaG9vc2VTZXJ2aWNlIn07Cgl9CglpZiAoJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkgKSB7CgkJbXkgJXF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlF1ZXVlSUQiICkpOwoJCW15ICRxdWV1ZU5hbWUgPSAkcXVldWVEYXRhe05hbWV9OwkJCgkJJG1zZ0Nob29zZVNlcnZpY2UgPX4gcy9QTEFDRVxfTkFNRS8kcXVldWVOYW1lL2c7Cgl9CgkkRGF0YXtNc2dDaG9vc2VTZXJ2aWNlfSA9ICRtc2dDaG9vc2VTZXJ2aWNlOwkKCQoJJFNlbGYtPntEZWZhdWx0VXNlcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0VXNlcklEIn07CgkkU2VsZi0+e0RlZmF1bHRDdXN0b21lcklEfSA9ICRTZWxmLT57Q29uZmlnTlRXfS0+eyJEZWZhdWx0Q3VzdG9tZXJJRCJ9OwoJJFNlbGYtPntEZWZhdWx0VXNlckRvbWFpbn0gPSAkU2VsZi0+e0NvbmZpZ05UV30tPnsiRGVmYXVsdFVzZXJEb21haW4ifTsKCQoJCgkKCgkjIEJ1aWxkIHNlcnZpY2UgY2hvb3NlcgoJJERhdGF7U2VydmljZVN0cmd9ID0gJFRpY2tldFdpemFyZC0+QnVpbGRTZXJ2aWNlcyhTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIlNlcnZpY2VJRCIgKSk7CgoJIyBCdWlsZCBvdXRwdXQKCW15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcihUeXBlID0+ICRpZEN1c3RvbVRlbXBsYXRlLCAgVGl0bGUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXcgdGlja2V0IHdpemFyZCIpICk7CgkJICAKCSMgTG9hZCBjdXJyZW50IG1haW50ZW5hbmNlcyAgCglteSBAbWFpbnRlbmFuY2VzID0gJE1haW50ZW5hbmNlT2JqZWN0LT5MaXN0Q3VycmVudE1haW50ZW5hbmNlcygpOwoJCQoJaWYgKEBtYWludGVuYW5jZXMpIHsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnTWFpbnRlbmFuY2VzUGFuZWwnLAoJCSk7CQkKCQkJCgkJZm9yIG15ICRtYWludGVuYW5jZUhhc2ggKEBtYWludGVuYW5jZXMpIHsKCQkJbXkgJW1haW50ZW5hbmNlID0gJXskbWFpbnRlbmFuY2VIYXNofTsKCQkJCQkJCQoJCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJCU5hbWUgPT4gJ01haW50ZW5hbmNlTGluZScsCgkJCQlEYXRhID0+IHsKCQkJCQlNZXNzYWdlICAgPT4gJG1haW50ZW5hbmNleydEZXNjcmlwdGlvbid9LAkJCQkJCQoJCQkJCVN0YXJ0RGF0ZSA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5CcmF6aWxpYW5EYXRlKFRpbWVzdGFtcCA9PiAkRGF0ZVV0aWxzT2JqZWN0LT5Gcm9tU1FMKFN0cmluZ0RhdGUgPT4gJG1haW50ZW5hbmNle1N0YXJ0RGF0ZX0pKSwKCQkJCX0pOwkJCQkJCQkKCQl9CQoJfQkJCgkKCQoJaWYgKCRQYXJhbXtQdWJsaWN9KSB7CgkJJFNlbGYtPkRlYnVnKCJQdWJsaWMgdmlldyAtIHVuYXV0aGVudGljYXRlZCBtZXNzYWdlIGVuYWJsZWQiKTsKCQkkTGF5b3V0T2JqZWN0LT5CbG9jaygKCQkJTmFtZSA9PiAnVW5hdXRoZW50aWNhdGVkTWVzc2FnZScsCgkJKTsKCQkkU2VsZi0+RGVidWcoIlB1YmxpYyB2aWV3IC0gcHVibGljIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAoJCQlOYW1lID0+ICdUb29sQmFyUHVibGljJywKCQkpOwkJCgl9IGVsc2UgewoJCSRTZWxmLT5EZWJ1ZygiQ3VzdG9tZXIgdmlldyAtIGN1c3RvbWVyIHRvb2xiYXIgZW5hYmxlZCIpOwoJCSRMYXlvdXRPYmplY3QtPkJsb2NrKAkJCgkJCU5hbWUgPT4gJ1Rvb2xCYXJDdXN0b21lcicsCgkJKTsKCX0KCgkjIFByZXBhcmUgY2FjaGUgZm9yIGltYWdlbnMgYW5kIGF0dGFjaG1lbnRzCglteSAkV2ViVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoJJERhdGF7Rm9ybUlEfSA9ICRXZWJVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQ3JlYXRlKCk7CglpZiAoJFBhcmFte1B1YmxpY30pIHsKCQkkRGF0YXtQdWJsaWNNb2RlfSA9ICJQdWJsaWMiOwoJfQoKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAoJCURhdGEgICAgICAgICA9PiBcJURhdGEsCgkJVGVtcGxhdGVGaWxlID0+ICdOZXdUaWNrZXRXaXphcmQnLAoJKTsKCQkKCSRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoVHlwZSA9PiAkaWRDdXN0b21UZW1wbGF0ZSk7CglyZXR1cm4gJE91dHB1dDsKfQoKPWhlYWQKU2VwYXJhdGUgc2VydmljZS1maWVsZCBsYWJlbCBuYW1lcywgdG8gbWFrZSBpdCBodW1hbi1yZWFkYWJsZSAoQ2FwaXRhbExpa2VMYWJlbHMgLT4gQ2FwaXRhbCBsaWtlIGxhYmVscykKPWN1dApzdWIgYnJlYWtXb3JkcyB7CglteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoJCQoJbXkgJHJldHVybiA9ICRQYXJhbXtUZXh0fTsJCgkKCSRyZXR1cm4gPX4gcy8oLikoW0EtWl1bXkEtWl0pLyQxICQyL2c7CgkkcmV0dXJuID1+IHMvKFtcdyddKykvXHVcTCQxL2c7CgkKCXJldHVybiAkcmV0dXJuOwp9CgpzdWIgRGVidWcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRtc2cgPSBzaGlmdDsKCSRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpMb2ciKS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICRtc2cgKTsKfQoKCjE7Cg==</File> | |
| 52 | + <File Location="Kernel/System/RestrictedService.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVzdHJpY3RlZFNlcnZpY2UucG0gLSBjb3JlIG1vZHVsZQojIAojIENvcHlyaWdodCAoQykgU2VUSUMgLSBVRlNDIC0gaHR0cDovL3NldGljLnVmc2MuYnIvCiMgVmVyc2lvbiAyMDE1LTA2LTI0IC0gRmlyc3QgdmVyc2lvbgojCiMgTWFuYWdlcyB3aGljaCBzZXJ2aWNlcyBzaG91bGQgb25seSBiZSBhbGxvd2VkIGluIHRoZSBsb2dnZWQgaW4gaW50ZXJmYWNlIGZvciBPVFJTCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UmVzdHJpY3RlZFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiJLZXJuZWw6OlN5c3RlbTo6REIiLAoiS2VybmVsOjpTeXN0ZW06OkxvZyIpOwoKCnN1YiBuZXcgewoJbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCgkjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKCW15ICRTZWxmID0geyVQYXJhbX07CglibGVzcyggJFNlbGYsICRUeXBlICk7CgoJcmV0dXJuICRTZWxmOwp9Cgo9aGVhZAoKUmV0dXJucyBhIHNlcnZpY2UgZm9ybQoKQElkc1Jlc3RyaWN0ZWRTZXJ2aWNlcwoKPWN1dAoKc3ViIEdldFJlc3RyaWN0ZWRTZXJ2aWNlcyB7CgoJbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCglteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6OlN5c3RlbTo6REIiKTsKCgkjIGdldCBzZXJ2aWNlIGZvcm0gZnJvbSBkYgoJJERCT2JqZWN0LT5QcmVwYXJlKAoJCVNRTCAgID0+ICdTRUxFQ1Qgc2VydmljZV9pZCBmcm9tIHJlc3RyaWN0ZWRfc2VydmljZSBvcmRlciBieSBzZXJ2aWNlX2lkIGFzYycKCSk7CgoJIyBmZXRjaCB0aGUgcmVzdWx0CglteSBAU2VydmljZURhdGE7Cgl3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCQlwdXNoKEBTZXJ2aWNlRGF0YSwkUm93WzBdKTsKCX0KCglyZXR1cm4gQFNlcnZpY2VEYXRhOwp9Cgo9aGVhZAoKQElkc0xpc3QKClNldHMgdGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBzZXJ2aWNlcwoKPWN1dApzdWIgU2V0UmVzdHJpY3RlZFNlcnZpY2VzIHsKCglteSAoICRTZWxmLCBAUGFyYW0gKSA9IEBfOwoKCW15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoIktlcm5lbDo6U3lzdGVtOjpEQiIpOwkKCW15ICRpZHNTdHJpbmcgPSBqb2luKCIsIiwgQFBhcmFtKTsKCgkjIGRlbGV0ZSBvbGQgc2VydmljZXMKCSREQk9iamVjdC0+RG8oU1FMICAgPT4gJ0RFTEVURSBGUk9NIHJlc3RyaWN0ZWRfc2VydmljZSB3aGVyZSBzZXJ2aWNlX2lkIE5PVCBJTiAoJyAuICRpZHNTdHJpbmcgLiAnKScpOwoJCgkjIGFkZCBuZXcgc2VydmljZXMKCXdoaWxlIChteSAkaWQgPSBAUGFyYW0pIHsKCQkkREJPYmplY3QtPkRvKFNRTCAgID0+ICdSRVBMQUNFIElOVE8gcmVzdHJpY3RlZF9zZXJ2aWNlIChzZXJ2aWNlX2lkKSBWQUxVRVMgKCcgLiAkaWQgLiAnKScpOwoJfQoJCglyZXR1cm4gMTsKfQoKCjE7Cg==</File> | |
| 53 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js" Permission="644" Encode="Base64">CihmdW5jdGlvbihyb290LCBmYWN0b3J5KQp7CiAgICB2YXIgdW1kRW5hYmxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAmJiB0eXBlb2Yocm9vdC51bWQpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdW1kRW5hYmxlZCA9IHJvb3QudW1kOwogICAgfQoKICAgIGlmICh1bWRFbmFibGVkICYmIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKICAgIHsKICAgICAgICAvLyBjb21tb24ganMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ2hhbmRsZWJhcnMnKSwgcmVxdWlyZSgnYm9vdHN0cmFwJykpOwogICAgfQogICAgZWxzZSBpZiAodW1kRW5hYmxlZCAmJiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCiAgICB7CiAgICAgICAgLy8gYW1kCiAgICAgICAgZGVmaW5lKCJhbHBhY2EiLCBbImpxdWVyeSIsImhhbmRsZWJhcnMiLCJib290c3RyYXAiXSwgZmFjdG9yeSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gZ2xvYmFsCiAgICAgICAgcm9vdFsiQWxwYWNhIl0gPSBmYWN0b3J5KHJvb3RbImpRdWVyeSJdLCByb290WyJIYW5kbGViYXJzIl0sIHJvb3RbIkJvb3RzdHJhcCJdKTsKICAgIH0KCn0odGhpcywgZnVuY3Rpb24gKCQsIEhhbmRsZWJhcnMsIEJvb3RzdHJhcCkgewoKICAgIC8valF1ZXJ5ID0gJDsKCiAgICAKICAgICAgICB0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLWFycmF5Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIlxuICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW0gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW0gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbSkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLW9iamVjdC1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW1GaWVsZCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPHRoPiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5pdGVtIHx8IChkZXB0aDAgJiYgZGVwdGgwLml0ZW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ciIseyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5VG9vbGJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlUb29sYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlUb29sYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheVRvb2xiYXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8dGFibGU+XG5cbiAgICAgICAgICAgIDwhLS0gdGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZWFjaFByb3BlcnR5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmVhY2hQcm9wZXJ0eSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjaGVtYSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaXRlbXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnByb3BlcnRpZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2hQcm9wZXJ0eSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgIDwvdGFibGU+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udGFpbmVyLXRhYmxlcm93LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRkPlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiAgICA8L3RkPlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRhaW5lci10YWJsZXJvdyJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250YWluZXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi1oZWxwZXJcIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250YWluZXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRhaW5lciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRhaW5lciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1hbnkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtY2hlY2tib3giXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zdHIgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc3RyKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkseyJuYW1lIjoic3RyIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtaGlkZGVuIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZGlzcGxheSJdWyJjb250cm9sLWltYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aW1nIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiLWltYWdlXCIgc3JjPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5kaXNndWlzZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5kaXNndWlzZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApLCImYnVsbDsiLHsibmFtZSI6ImRpc2d1aXNlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC10ZXh0Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGF0YSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxwPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvcD5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbC11cmwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJ0YXJnZXQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGFyZ2V0IDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmFuY2hvclRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kYXRhIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kYXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJkYXRhIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNvbnRyb2wtdXJsLWFuY2hvci13cmFwcGVyXCI+XG4gICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGF0YSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGF0YSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUYXJnZXQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiIHRpdGxlPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYW5jaG9yVGl0bGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hbmNob3JUaXRsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgYWxwYWNhLWNvbnRyb2wtbGFiZWxcIiBmb3I9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj4iCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvbGFiZWw+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiaW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1kaXNwbGF5Il1bImZvcm0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwic3VibWl0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCJyZXNldCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2J1dHRvbj5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJzdWJtaXRcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInR5cGU9XCJyZXNldFwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxmb3JtIHJvbGU9XCJmb3JtXCI+XG5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZvcm1JdGVtcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZm9ybUl0ZW1zIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiZm9ybUl0ZW1zIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5mb3JtSXRlbXMpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L2Rpdj5cblxuICAgIDwvZm9ybT5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LWFjdGlvbmJhciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9idXR0b24+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPjwvaT5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1hcnJheS1hY3Rpb25iYXIgYWxwYWNhLWFycmF5LWFjdGlvbmJhci0iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbmJhclN0eWxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYWN0aW9uYmFyU3R5bGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuLWdyb3VwXCIgZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLXBhcmVudC1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50RmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50RmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoicGFyZW50RmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmllbGRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmllbGRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmllbGRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtSW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1JbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaXRlbUluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheS1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IAogICIgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheUFjdGlvbmJhciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXJyYXlBY3Rpb25iYXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJhcnJheUFjdGlvbmJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBhbGlhczQuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgYnVmZmVyICs9ICJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCI+PC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJyaWdodCIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAKICAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtRmllbGQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1GaWVsZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6Iml0ZW1GaWVsZCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gYWxpYXM0LmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIGJ1ZmZlciArPSAiXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGFsaWFzNC5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWNsZWFyXCI+PC9kaXY+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbmJhclN0eWxlIDogZGVwdGgwKSwidG9wIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uYmFyU3R5bGUgOiBkZXB0aDApLCJib3R0b20iLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYXJyYXlBY3Rpb25iYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5QWN0aW9uYmFyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiYXJyYXlBY3Rpb25iYXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5hcnJheUFjdGlvbmJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb25iYXJTdHlsZSA6IGRlcHRoMCksImxlZnQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udGFpbmVyLWFycmF5LXRvb2xiYXIiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgYnRuLWdyb3VwIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZzsKCiAgcmV0dXJuICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImxpbmsiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnRvb2xiYXJTdHlsZSA6IGRlcHRoc1sxXSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYWN0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hY3Rpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMj1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uICIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS52aWV3IDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnNtYWxsQnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uPVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hY3Rpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFjdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMyLHsibmFtZSI6ImFjdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMyLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5sYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXIgYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sYmFyUG9zaXRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJQb3NpdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidG9vbGJhclBvc2l0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2xiYXJTdHlsZSA6IGRlcHRoMCksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1hcnJheSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICIgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5VG9vbGJhcikgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pdGVtIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLml0ZW0pIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyUG9zaXRpb24gOiBzdGFjazEpLCJ0b3AiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJQb3NpdGlvbiA6IHN0YWNrMSksImJvdHRvbSIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItb2JqZWN0LWl0ZW0iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbUZpZWxkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtRmllbGQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJpdGVtRmllbGQiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtRmllbGQpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci1vYmplY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiXG4gICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pdGVtcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUtaXRlbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0cj5cbiAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtRmllbGQpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCJ0ZCIseyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC90cj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lci10YWJsZXJvdy1pdGVtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZD5cbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLml0ZW1GaWVsZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbUZpZWxkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiaXRlbUZpZWxkIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuaXRlbUZpZWxkKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgPC90ZD5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250YWluZXItdGFibGVyb3ciXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJcbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIHNvcnQgb3JkZXIgY29sdW1uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGxcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSByZW9yZGVyIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1tZW51LWhhbWJ1cmdlclwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oaWRkZW4gOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYnVmZmVyID0gCiAgIiAgICAgICAgICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5pdGVtKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGJ1ZmZlciA9IAogICIgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCIgZGF0YS1tZXJnZS11cC1maWVsZC1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFycmF5QWN0aW9uYmFyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheUFjdGlvbmJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLChvcHRpb25zPXsibmFtZSI6ImFycmF5QWN0aW9uYmFyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmFycmF5QWN0aW9uYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG4gICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLW1lcmdlLXVwXCI+XG5cbiAgICAgICAgPCEtLSBkcmFnIGNlbGwgLS0+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLml0ZW1zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gYWN0aW9ucyBjZWxsIC0tPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd0FjdGlvbnNDb2x1bW4gOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udGFpbmVyLWxhYmVsXCI+IgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiYWxwYWNhLWhlbHBlciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFscGFjYS1pY29uLWhlbHBlclwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWFueSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgc2l6ZT1cIjQwXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNoZWNrYm94Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNoZWNrYm94T3B0aW9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIlxuICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1jaGVja2JveC1pbmRleD1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5kZXggfHwgKGRhdGEgJiYgZGF0YS5pbmRleCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5kZXgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWNoZWNrYm94LXZhbHVlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ub3B0aW9ucyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuICAgICAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50ZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50ZXh0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0ZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICJcbiAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgPGxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJpZ2h0TGFiZWwgOiBzdGFjazEpLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPC9kaXY+XG5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5tdWx0aXBsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLWNrZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPHRleHRhcmVhIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGNvbHM9XCI4MFwiIHJvd3M9XCIxMFwiPlxuICAgIDwvdGV4dGFyZWE+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZWRpdG9yIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImNvbnRyb2wtZmllbGQtZWRpdG9yLWVsXCI+PC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtZmlsZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1oaWRkZW4iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtaW1hZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtaW1hZ2UtZGlzcGxheVwiPlxuICAgICAgICA8aDU+UHJldmlldzwvaDU+XG4gICAgICAgIDxpbWcgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICItaW1hZ2VcIiBzcmM9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRhdGEgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRhdGEgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRhdGEiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1vcHRpb250cmVlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICJkYXRhLSIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbnRyZWVcIj48L2Rpdj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcGFzc3dvcmQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInNpemU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgPGRpdiBjbGFzcz1cInJhZGlvXCI+XG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgbmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHZhbHVlPVwiXCIvPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24sIGFsaWFzMz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzND0iZnVuY3Rpb24iOwoKICByZXR1cm4gIiAgICA8ZGl2IGNsYXNzPVwicmFkaW9cIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBuYW1lPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0ubmFtZSA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiB2YWx1ZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RlZCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRleHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiY2hlY2tlZD1cImNoZWNrZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oaWRlTm9uZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJtdWx0aXBsZT1cIm11bHRpcGxlXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGlkZU5vbmUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNlbGVjdE9wdGlvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5vbmVMYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VsZWN0ZWQgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIj4iCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGV4dCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGV4dCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvb3B0aW9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInNlbGVjdGVkPVwic2VsZWN0ZWRcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxzZWxlY3QgZGF0YS1saXZlLXNlYXJjaC1ub3JtYWxpemU9XCJ0cnVlXCIgZGF0YS1saXZlLXNlYXJjaD1cInRydWVcIiBjbGFzcz1cInNlbGVjdHBpY2tlclwiIGlkPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm11bHRpcGxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvc2VsZWN0PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxpbnB1dCB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pbnB1dFR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlucHV0VHlwZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaW5wdXRUeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgaWQ9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdHRyaWJ1dGVzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIi8+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bImNvbnRyb2wtdGV4dGFyZWEiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJwbGFjZWhvbGRlcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInJvd3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucm93cyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gImNvbHM9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29scyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gInJlYWRvbmx5PVwicmVhZG9ubHlcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIm5hbWU9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gImRhdGEtIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpZWxkSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpZWxkSWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpZWxkSWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ZXh0YXJlYSBpZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yb3dzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZWFkb25seSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGF0YSA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sLXVybCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gInBsYWNlaG9sZGVyPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnBsYWNlaG9sZGVyIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAic2l6ZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAicmVhZG9ubHk9XCJyZWFkb25seVwiIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAibmFtZT1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5wbGFjZWhvbGRlciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucmVhZG9ubHkgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRhdGEgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIvPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJjb250cm9sIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICA8bGFiZWwgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuIjsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIHR5cGU9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnR5cGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InR5cGUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBjbGFzcz1cImFscGFjYS1jb250cm9sLWJ1dHRvbiBhbHBhY2EtY29udHJvbC1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udHJvbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udHJvbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImNvbnRyb2wiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7CiAgaWYgKCFoZWxwZXJzLmNvbnRyb2wpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlbmRlckJ1dHRvbnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJ3ZWItZWRpdCJdWyJmb3JtIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbiBhbHBhY2EtZm9ybS1idXR0b24tIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIiAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN0eWxlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3R5bGVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJzdHlsZXMiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdHRyaWJ1dGVzIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImtleSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIj1cIiIKICAgICsgYWxpYXMxKGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8Zm9ybSByb2xlPVwiZm9ybVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5mb3JtSXRlbXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZvcm1JdGVtcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImZvcm1JdGVtcyIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuZm9ybUl0ZW1zKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Zvcm0+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bIndlYi1lZGl0Il1bIm1lc3NhZ2UiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1tZXNzYWdlIGFscGFjYS1tZXNzYWdlLSIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsid2ViLWVkaXQiXVsid2l6YXJkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1uYXZcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWRlZmF1bHRcIiByb2xlPVwibmF2aWdhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgYWxwYWNhLXdpemFyZC1iYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXZiYXItbmF2XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgPC9kaXY+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmluZGV4IHx8IChkYXRhICYmIGRhdGEuaW5kZXgpKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImluZGV4IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50aXRsZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGl0bGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZXZyb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDM+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkVGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZFRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZFRpdGxlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2gzPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2l6YXJkRGVzY3JpcHRpb24gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6IndpemFyZERlc2NyaXB0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI8L2g0PlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxpZ24gOiBkZXB0aDApLCJsZWZ0Iix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY2xhc3M9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0udmlldyA6IGRlcHRoc1sxXSkpICE9IG51bGwgPyBzdGFjazEuc3R5bGVzIDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS5idXR0b24gOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXR0cmlidXRlcyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTQsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9idXR0b24+XG4iOwp9LCIxMiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiaWQ9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIiOwp9LCIxNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsaWduIDogZGVwdGgwKSwicmlnaHQiLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZFwiPlxuXG4gICAgICAgIDwhLS0gbmF2IGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93U3RlcHMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwhLS0gd2l6YXJkIHByb2dyZXNzIGJhciAtLT5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UHJvZ3Jlc3NCYXIgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2l6YXJkVGl0bGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpemFyZERlc2NyaXB0aW9uIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8IS0tIHdpemFyZCBzdGVwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFscGFjYS13aXphcmQtc3RlcHNcIj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIHdpemFyZCBidXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxwYWNhLXdpemFyZC1idXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY2xlYXI6Ym90aFwiPjwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXSA9IHRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdIHx8IHt9Owp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udGFpbmVyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cIiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiYWxwYWNhLWNvbnRhaW5lci1sYWJlbFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbGxhcHNpYmxlIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L2xlZ2VuZD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiAiOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCI+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICA8L3NwYW4+XG4iOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiOSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8cCBjbGFzcz1cImFscGFjYS1oZWxwZXIgaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhbHBhY2EtaWNvbi0xNiBnbHlwaGljb24gZ2x5cGhpY29uLWluZm8tc2lnblwiPjwvaT5cbiAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvcD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLCBkZXB0aDApKTsKfSwiMTIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAiOwogIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY29udGFpbmVyIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250YWluZXIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250YWluZXIiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250YWluZXIpIHsgc3RhY2sxID0gaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsc3RhY2sxLG9wdGlvbnMpfQogIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CiAgcmV0dXJuIGJ1ZmZlciArICJcblxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtcmFkaW8iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSwoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZGF0YSA6IGRlcHRoc1sxXSkseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRleHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoidGV4dCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zZWxlY3RPcHRpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgIDwvZGl2PlxuXG48L3NjcmlwdD5cbiI7Cn0sInVzZURhdGEiOnRydWUsInVzZURlcHRocyI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC1zZWxlY3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZGlzcGxheWFibGVUZXh0IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kaXNwbGF5YWJsZVRleHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiZGlzcGxheWFibGVUZXh0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPlxuICAgICAgICAgICAgPHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+XG4gICAgICAgICAgICBFcnJvcjpcbiAgICAgICAgICAgICIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcbiAgICAgICAgPC90ZD5cbiI7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJnYWxsZXJ5XCIgZG93bmxvYWQ9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj48c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2l6ZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD5cbiI7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxhIGhyZWY9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIHRpdGxlPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1nYWxsZXJ5PVwiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGh1bWJuYWlsVXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNEZWxldGUgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIGhlbHBlciwgYWxpYXMxPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUgYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdHJhc2ggZ2x5cGhpY29uLXdoaXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgYnRuICIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuYnV0dG9uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmJ1dHRvbkNsYXNzIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJidXR0b25DbGFzcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGRhdGEtZmlsZS1pbmRleD1cIiIKICAgICsgYWxpYXM0KGNvbnRhaW5lci5sYW1iZGEoKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLmZpbGVJbmRleCA6IGRlcHRoc1sxXSksIGRlcHRoMCkpCiAgICArICJcIiBkYXRhLWJ1dHRvbi1rZXk9XCIiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAua2V5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6ImxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXG4iOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLWRvd25sb2FkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25zIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlLCJ1c2VEZXB0aHMiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1kaXNwbGF5Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhZGVcIj48L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICA8dGQgY2xhc3M9XCJlcnJvclwiIGNvbHNwYW49XCIyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1pbXBvcnRhbnRcIj5FcnJvcjwvc3Bhbj4gIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmFsaWQgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoYWxpYXMxLChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInN0YXJ0XCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5hdXRvVXBsb2FkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcyBwcm9ncmVzcy1zdWNjZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgYXJpYS12YWx1ZW5vdz1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBzdHlsZT1cIndpZHRoOjAlO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjEzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdXBsb2FkIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4iOwp9LCIxNSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjYW5jZWxcIj5cbiIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkYXRhICYmIGRhdGEuaW5kZXgpLDAseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L3RkPlxuIjsKfSwiMTYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1iYW4tY2lyY2xlIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2FuY2VsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIubGFtYmRhLCBhbGlhczM9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDx0ciBjbGFzcz1cInRlbXBsYXRlLXVwbG9hZFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPHRkIGNsYXNzPVwibmFtZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczMoYWxpYXMyKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmVycm9yIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgPHRkPjwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbC11cGxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY3NzQ2xhc3NlcyB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJjc3NDbGFzc2VzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKTsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlNpemU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwhLS0gZXJyb3Igb3Igc3RhcnQgb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+QWN0aW9uczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+VGh1bWJuYWlsPC90ZD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uLCBhbGlhczM9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczQ9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWNvbnRhaW5lciAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY3NzQ2xhc3NlcyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC1jaG9vc2Vyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIgogICAgKyBhbGlhczIoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZpZXcgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIiBmaWxlaW5wdXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGV1cGxvYWQtYWRkLWJ1dHRvblwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuY2hvb3NlQnV0dG9uTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNob29zZUJ1dHRvbkxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJjaG9vc2VCdXR0b25MYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFscGFjYS1maWxldXBsb2FkLWlucHV0LWhpZGRlblwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiIgogICAgKyBhbGlhczIoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiX2ZpbGVzX2hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbHBhY2EtZmlsZXVwbG9hZC13ZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWxldXBsb2FkLWFjdGl2ZS16b25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dIZWFkZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj1cImNlbnRlclwiIGNsYXNzPVwiZHJvcHpvbmUtbWVzc2FnZVwiPiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZHJvcFpvbmVNZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kcm9wWm9uZU1lc3NhZ2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImRyb3Bab25lTWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2Vzc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWRpc3BsYXkiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGJ1ZmZlciA9IAogICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5jb250cm9sIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250cm9sIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udHJvbCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udHJvbCkgeyBzdGFjazEgPSBoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCxzdGFjazEsb3B0aW9ucyl9CiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KICByZXR1cm4gYnVmZmVyICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5oZWxwZXJzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZGlzcGxheSJdWyJtZXNzYWdlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiPjwvaT4mbmJzcDsiCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXNzYWdlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHsibmFtZSI6Im1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgIDwvZGl2PlxuXG48L3NjcmlwdD4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdID0gdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il0gfHwge307CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItZ3JpZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiBidG4tZ3JvdXAiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nOwoKICByZXR1cm4gIlxuIgogICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5vcHRpb25zIDogZGVwdGhzWzFdKSkgIT0gbnVsbCA/IHN0YWNrMS50b29sYmFyU3R5bGUgOiBzdGFjazEpLCJsaW5rIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLm9wdGlvbnMgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnRvb2xiYXJTdHlsZSA6IHN0YWNrMSksImJ1dHRvbiIseyJuYW1lIjoiY29tcGFyZSIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBhbGlhczE9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMyPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWxwYWNhLWFycmF5LXRvb2xiYXItYWN0aW9uXCIgZGF0YS1hcnJheS10b29sYmFyLWFjdGlvbj1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSwgZGVwdGgwKSkKICAgICsgIlwiPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLCBkZXB0aDApKQogICAgKyAiPC9hPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMsZGVwdGhzKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMyPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24gIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoc1sxXSAhPSBudWxsID8gZGVwdGhzWzFdLnZpZXcgOiBkZXB0aHNbMV0pKSAhPSBudWxsID8gc3RhY2sxLnN0eWxlcyA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9uIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYXJyYXktdG9vbGJhci1hY3Rpb249XCIiCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmFjdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWN0aW9uIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczIseyJuYW1lIjoiYWN0aW9uIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczIsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxhYmVsIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiAiICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pY29uQ2xhc3MgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmljb25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJpY29uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIj48L2k+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyOwoKICByZXR1cm4gKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtYXJyYXktdG9vbGJhclwiICIKICAgICsgKChzdGFjazEgPSAoaGVscGVycy5jb21wYXJlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmNvbXBhcmUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudG9vbGJhclN0eWxlIDogc3RhY2sxKSwiYnV0dG9uIix7Im5hbWUiOiJjb21wYXJlIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hcnJheVRvb2xiYXJBY3Rpb25zIDogZGVwdGgwKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udGFpbmVyLWdyaWQtaG9sZGVyXCI+PC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250YWluZXItdGFibGUiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDwhLS0gaGlkZGVuIGNvbHVtbiBzdG9yaW5nIHNvcnQgb3JkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlclwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZHJhZ2dhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJhbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtaGVhZGVyXCI+PC90aD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWhlYWRlci1pZD1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhpZGRlbiA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICI+IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGl0bGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRpdGxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0aXRsZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC90aD5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gImNsYXNzPVwiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW5cIiI7Cn0sIjgiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiI7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJcbiAgICAgICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXRlbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pdGVtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwidHIiLHsibmFtZSI6Iml0ZW0iLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcblxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuXG4gICAgICAgICI7CiAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5hcnJheVRvb2xiYXIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFycmF5VG9vbGJhciA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLChvcHRpb25zPXsibmFtZSI6ImFycmF5VG9vbGJhciIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuYXJyYXlUb29sYmFyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICAgICAgPHRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIHRhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kcmFnUm93cyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmhlYWRlcnMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNob3dBY3Rpb25zQ29sdW1uIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPCEtLSB0YWJsZSBib2R5IC0tPlxuICAgICAgICAgICAgPHRib2R5PlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXRlbXMgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRhaW5lciJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTsKCiAgcmV0dXJuICIgICAgICAgIDxsZWdlbmQgY2xhc3M9XCIiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgImFscGFjYS1jb250YWluZXItbGFiZWxcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29sbGFwc2libGUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSksIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb2xsYXBzaWJsZSA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9sZWdlbmQ+XG4iOwp9LCIyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgIjsKfSwiNCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiPlxuIjsKfSwiNiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgPC9zcGFuPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjkiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHAgY2xhc3M9XCJhbHBhY2EtaGVscGVyIGhlbHAtYmxvY2sgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYWxwYWNhLWljb24tMTYgZ2x5cGhpY29uIGdseXBoaWNvbi1pbmZvLXNpZ25cIj48L2k+XG4gICAgICAgICAgICAiCiAgICArICgoc3RhY2sxID0gY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8L3A+XG4iOwp9LCIxMCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCJjb21waWxlciI6WzcsIj49IDQuMC4wIl0sIm1haW4iOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBidWZmZXIgPSAKICAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXY+XG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRhaW5lciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGFpbmVyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoiY29udGFpbmVyIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09ICJmdW5jdGlvbiIgPyBoZWxwZXIuY2FsbChhbGlhczEsb3B0aW9ucykgOiBoZWxwZXIpKTsKICBpZiAoIWhlbHBlcnMuY29udGFpbmVyKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+XG4iOwp9LCJ1c2VEYXRhIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLWNvbG9ycGlja2VyIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAicGxhY2Vob2xkZXI9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICJzaXplPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCIiOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICJyZWFkb25seT1cInJlYWRvbmx5XCIiOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICJuYW1lPVwiIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiZGF0YS0iCiAgICArIGFsaWFzMSgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI9XCIiCiAgICArIGFsaWFzMShjb250YWluZXIubGFtYmRhKGRlcHRoMCwgZGVwdGgwKSkKICAgICsgIlwiIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiBhbGlhczEoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRhdGEgJiYgZGF0YS5rZXkpKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYShkZXB0aDAsIGRlcHRoMCkpCiAgICArICJcIiI7Cn0sIjE1IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj48aT48L2k+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIlxuICAgICAgICA8aW5wdXQgdHlwZT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaW5wdXRUeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnB1dFR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlucHV0VHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiIGlkPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEucGxhY2Vob2xkZXIgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnJlYWRvbmx5IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kYXRhIDogc3RhY2sxKSx7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAiCiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmF0dHJpYnV0ZXMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiLz5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29tcG9uZW50IDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtZG93bmxvYWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8c3Bhbj4iCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCBjbGFzcz1cInNpemVcIj5cbiAgICAgICAgICAgIDxzcGFuPiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPlxuICAgICAgICAgICAgRXJyb3I6XG4gICAgICAgICAgICAiCiAgICArIGFsaWFzMihhbGlhczEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXG4gICAgICAgIDwvdGQ+XG4iOwp9LCIzIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgIDx0ZCBjbGFzcz1cInByZXZpZXdcIj5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJuYW1lXCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aHVtYm5haWxVcmwgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiZ2FsbGVyeVwiIGRvd25sb2FkPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiXCI+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJzaXplXCI+PHNwYW4+IgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnNpemUgOiBzdGFjazEpLCBkZXB0aDApKQogICAgKyAiPC9zcGFuPjwvdGQ+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWNvbnRhaW5lci5sYW1iZGEsIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICA8YSBocmVmPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIiB0aXRsZT1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtZ2FsbGVyeT1cImdhbGxlcnlcIiBkb3dubG9hZD1cIiIKICAgICsgYWxpYXMyKGFsaWFzMSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5uYW1lIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiIgogICAgKyBhbGlhczIoYWxpYXMxKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRodW1ibmFpbFVybCA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICJcIj5cbiAgICAgICAgICAgIDwvYT5cbiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIik7Cn0sIjciOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVsZXRlIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBoZWxwZXIsIGFsaWFzMT1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlIGJ0biBidG4tZGFuZ2VyXCIgZGF0YS1maWxlLWluZGV4PVwiIgogICAgKyBhbGlhczEoY29udGFpbmVyLmxhbWJkYSgoZGVwdGhzWzFdICE9IG51bGwgPyBkZXB0aHNbMV0uZmlsZUluZGV4IDogZGVwdGhzWzFdKSwgZGVwdGgwKSkKICAgICsgIlwiIGRhdGEtYnV0dG9uLWtleT1cIiIKICAgICsgYWxpYXMxKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5rZXkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRyYXNoIGdseXBoaWNvbi13aGl0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTAiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zLGRlcHRocykgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiIGJ0biAiCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmJ1dHRvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5idXR0b25DbGFzcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiYnV0dG9uQ2xhc3MiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiBkYXRhLWZpbGUtaW5kZXg9XCIiCiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKChkZXB0aHNbMV0gIT0gbnVsbCA/IGRlcHRoc1sxXS5maWxlSW5kZXggOiBkZXB0aHNbMV0pLCBkZXB0aDApKQogICAgKyAiXCIgZGF0YS1idXR0b24ta2V5PVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5rZXkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWNvbkNsYXNzIDogZGVwdGgwKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTEsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGFiZWwgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImludmVyc2UiOmNvbnRhaW5lci5ub29wLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCIiCiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWNvbkNsYXNzIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pY29uQ2xhc3MgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiaWNvbkNsYXNzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCI+PC9pPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5sYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJsYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlxuIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSxibG9ja1BhcmFtcyxkZXB0aHMpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS1kb3dubG9hZFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZXJyb3IgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICA8dGQ+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYnV0dG9ucyA6IGRlcHRoMCkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDwvdGQ+XG4gICAgPC90cj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZSwidXNlRGVwdGhzIjp0cnVlfSk7CnRoaXNbIkhhbmRsZWJhcnNQcmVjb21waWxlZCJdWyJib290c3RyYXAtZWRpdCJdWyJjb250cm9sLXVwbG9hZC1wYXJ0aWFsLXVwbG9hZCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwicHJldmlld1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWRlXCI+PC9zcGFuPlxuICAgICAgICA8L3RkPlxuIjsKfSwiMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sIjUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgPHRkIGNsYXNzPVwiZXJyb3JcIiBjb2xzcGFuPVwiMlwiPjxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW1wb3J0YW50XCI+RXJyb3I8L3NwYW4+ICIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3RkPlxuIjsKfSwiNyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGUgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZhbGlkIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksImludmVyc2UiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI4IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307CgogIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLmNvbXBhcmUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuY29tcGFyZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8dGQgY2xhc3M9XCJzdGFydFwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYXV0b1VwbG9hZCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLCJkYXRhIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIiAgICAgICAgICAgIDwvdGQ+XG4iOwp9LCI5IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MgcHJvZ3Jlc3Mtc3VjY2VzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIGFyaWEtdmFsdWVub3c9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgc3R5bGU9XCJ3aWR0aDowJTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjExIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIiOwp9LCIxMyI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHJldHVybiAiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXVwbG9hZCBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuIjsKfSwiMTUiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FuY2VsXCI+XG4iCiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuY29tcGFyZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5jb21wYXJlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGF0YSAmJiBkYXRhLmluZGV4KSwwLHsibmFtZSI6ImNvbXBhcmUiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDE2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiICAgICAgICAgICAgPC90ZD5cbiI7Cn0sIjE2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tYmFuLWNpcmNsZSBnbHlwaGljb24td2hpdGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9Y29udGFpbmVyLmxhbWJkYSwgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8dHIgY2xhc3M9XCJ0ZW1wbGF0ZS11cGxvYWRcIj5cblxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuc2hvd1VwbG9hZFByZXZpZXcgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgICAgIDx0ZCBjbGFzcz1cIm5hbWVcIj48c3Bhbj4iCiAgICArIGFsaWFzMyhhbGlhczIoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICI8L3NwYW4+PC90ZD5cbiAgICAgICAgPHRkIGNsYXNzPVwic2l6ZVwiPjxzcGFuPiIKICAgICsgYWxpYXMzKGFsaWFzMigoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaXplIDogc3RhY2sxKSwgZGVwdGgwKSkKICAgICsgIjwvc3Bhbj48L3RkPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5lcnJvciA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgIDx0ZD48L3RkPlxuICAgIDwvdHI+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKdGhpc1siSGFuZGxlYmFyc1ByZWNvbXBpbGVkIl1bImJvb3RzdHJhcC1lZGl0Il1bImNvbnRyb2wtdXBsb2FkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBoZWxwZXI7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNzc0NsYXNzZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30seyJuYW1lIjoiY3NzQ2xhc3NlcyIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSk7Cn0sIjMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9ImZ1bmN0aW9uIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uOwoKICByZXR1cm4gIiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93VXBsb2FkUHJldmlldyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4iCiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmZpbGVuYW1lTGFiZWwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmZpbGVuYW1lTGFiZWwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImZpbGVuYW1lTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5maWxlU2l6ZUxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5maWxlU2l6ZUxhYmVsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJmaWxlU2l6ZUxhYmVsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD48IS0tIGVycm9yIG9yIHN0YXJ0IG9yIHByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4iOwp9LCI0IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIGhlbHBlcjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IgogICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRodW1ibmFpbExhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aHVtYm5haWxMYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSAiZnVuY3Rpb24iID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSx7Im5hbWUiOiJ0aHVtYm5haWxMYWJlbCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIjwvdGQ+XG4iOwp9LCI2IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgcmV0dXJuICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiI7Cn0sImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbiwgYWxpYXMzPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXM0PSJmdW5jdGlvbiI7CgogIHJldHVybiAiPHNjcmlwdCB0eXBlPVwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNzc0NsYXNzZXMgOiBkZXB0aDApLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiIKICAgICsgYWxpYXMyKGNvbnRhaW5lci5sYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52aWV3IDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zdHlsZXMgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmJ1dHRvbiA6IHN0YWNrMSksIGRlcHRoMCkpCiAgICArICIgZmlsZWlucHV0LWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxldXBsb2FkLWFkZC1idXR0b25cIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNob29zZUJ1dHRvbkxhYmVsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jaG9vc2VCdXR0b25MYWJlbCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoiY2hvb3NlQnV0dG9uTGFiZWwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYWxwYWNhLWZpbGV1cGxvYWQtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCIiCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMzKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXM0ID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJfZmlsZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhbHBhY2EtZmlsZXVwbG9hZC1pbnB1dC1oaWRkZW5cIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiIKICAgICsgYWxpYXMyKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczMpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczQgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIl9maWxlc19oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxwYWNhLWZpbGV1cGxvYWQtd2VsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmlsZXVwbG9hZC1hY3RpdmUtem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5zaG93SGVhZGVycyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmaWxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPHAgYWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cImRyb3B6b25lLW1lc3NhZ2VcIj4iCiAgICArIGFsaWFzMigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRyb3Bab25lTWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZHJvcFpvbmVNZXNzYWdlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMyksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzNCA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJkcm9wWm9uZU1lc3NhZ2UiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICI8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJwcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN1Y2Nlc3NcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PlxuIjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsiY29udHJvbCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9OwoKICByZXR1cm4gIiAgICAgICAgPGxhYmVsIGNsYXNzPVwiIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbImlmIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGFiZWxDbGFzcyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgY29udHJvbC1sYWJlbCBhbHBhY2EtY29udHJvbC1sYWJlbFwiIGZvcj1cIiIKICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKICAgICsgIlwiPiIKICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxhYmVsIDogc3RhY2sxKSwgZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPC9sYWJlbD5cbiI7Cn0sIjIiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbENsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjQiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICByZXR1cm4gIiI7Cn0sIjYiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpOwp9LCI3IjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICIgICAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayAiCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuaGVscGVyQ2xhc3MgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24taW5mby1zaWduXCI+PC9pPlxuICAgICAgICAgICAgIgogICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoZGVwdGgwLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgPC9wPlxuIjsKfSwiOCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazE7CgogIHJldHVybiBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbihjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlckNsYXNzIDogc3RhY2sxKSwgZGVwdGgwKSk7Cn0sIjEwIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMTsKCiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKTsKfSwiMTEiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgc3RhY2sxOwoKICByZXR1cm4gIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b25zLWNvbnRhaW5lclwiPlxuIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub3B0aW9ucyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuYnV0dG9ucyA6IHN0YWNrMSkseyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTIsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICIgICAgICAgICAgICA8L2Rpdj5cbiI7Cn0sIjEyIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuICIgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWtleT1cIiIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICJcIiB0eXBlPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50eXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJ0eXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgY2xhc3M9XCJhbHBhY2EtY29udHJvbC1idXR0b24gYWxwYWNhLWNvbnRyb2wtYnV0dG9uLSIKICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7Im5hbWUiOiJrZXkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCiAgICArICIgIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdHlsZXMgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN0eWxlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoic3R5bGVzIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIgogICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiPiIKICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpICE9IG51bGwgPyBzdGFjazEgOiAiIikKICAgICsgIjwvYnV0dG9uPlxuIjsKfSwiMTMiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPSJmdW5jdGlvbiIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjsKCiAgcmV0dXJuIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoia2V5IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiPVwiIgogICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQogICAgKyAiXCIgIjsKfSwiY29tcGlsZXIiOls3LCI+PSA0LjAuMCJdLCJtYWluIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewogICAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYnVmZmVyID0gCiAgIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5sYWJlbCA6IHN0YWNrMSkseyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICAgICAgIjsKICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvbnRyb2wgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnRyb2wgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJjb250cm9sIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gImZ1bmN0aW9uIiA/IGhlbHBlci5jYWxsKGFsaWFzMSxvcHRpb25zKSA6IGhlbHBlcikpOwogIGlmICghaGVscGVycy5jb250cm9sKSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX0KICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQogIHJldHVybiBidWZmZXIgKyAiXG5cbiIKICAgICsgKChzdGFjazEgPSBoZWxwZXJzWyJpZiJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm9wdGlvbnMgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmhlbHBlcnMgOiBzdGFjazEpLHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSwiaW52ZXJzZSI6Y29udGFpbmVyLm5vb3AsImRhdGEiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4iCiAgICArICgoc3RhY2sxID0gaGVscGVyc1siaWYiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vcHRpb25zIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5yZW5kZXJCdXR0b25zIDogc3RhY2sxKSx7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLCJpbnZlcnNlIjpjb250YWluZXIubm9vcCwiZGF0YSI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcbiAgICA8L2Rpdj5cblxuPC9zY3JpcHQ+IjsKfSwidXNlRGF0YSI6dHJ1ZX0pOwp0aGlzWyJIYW5kbGViYXJzUHJlY29tcGlsZWQiXVsiYm9vdHN0cmFwLWVkaXQiXVsibWVzc2FnZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7ImNvbXBpbGVyIjpbNywiPj0gNC4wLjAiXSwibWFpbiI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz0iZnVuY3Rpb24iOwoKICByZXR1cm4gIjxzY3JpcHQgdHlwZT1cInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9jayBhbHBhY2EtbWVzc2FnZSBhbHBhY2EtbWVzc2FnZS0iCiAgICArICgoc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKSAhPSBudWxsID8gc3RhY2sxIDogIiIpCiAgICArICJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIj48L2k+Jm5ic3A7IgogICAgKyAoKHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEseyJuYW1lIjoibWVzc2FnZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6ICIiKQogICAgKyAiXG4gICAgPC9kaXY+XG5cbjwvc2NyaXB0PiI7Cn0sInVzZURhdGEiOnRydWV9KTsKLyoqCiAqIFVzaW5nIGZvcms6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rY21vb3QvQmFzZS5qcy1Gb3JrL2Jsb2IvbWFzdGVyL2J1aWxkL2Jhc2UuanMKICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogICAgLyoKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAocm9vdC5yZXR1cm5FeHBvcnRzR2xvYmFsID0gZmFjdG9yeSgpKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKICAgICAgICAvLyBsaWtlIE5vZGUuCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgICB9IGVsc2UgewogICAgKi8KICAgICAgICByb290WydCYXNlJ10gPSBmYWN0b3J5KCk7CiAgICAvKgogICAgfQogICAgKi8KfSh0aGlzLCBmdW5jdGlvbiAoKSB7CgogICAgLyoqCiAgICAgKiAgIEJhc2UuanMsIHZlcnNpb24gMS4xYQogICAgICogICBDb3B5cmlnaHQgMjAwNi0yMDEwLCBEZWFuIEVkd2FyZHMKICAgICAqICAgTGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICAgICAqCiAgICAgKiAgIE1vZGlmaWVkIGJ5IHRoZSBOZXJkZXJ5IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgdmFyaW91cyBidWdmaXhlcwogICAgICovCgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwoKICAgIC8qKgogICAgICogT2JqZWN0IHR5cGUKICAgICAqCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBpZ25vcmUKICAgICAqIEBmaW5hbAogICAgICovCiAgICB2YXIgVFlQRV9PQkpFQ1QgPSAnb2JqZWN0JzsKCiAgICAvKioKICAgICAqIFN0cmluZyB0eXBlCiAgICAgKgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAaWdub3JlCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgdmFyIFRZUEVfU1RSSU5HID0gJ3N0cmluZyc7CgogICAgLyoqCiAgICAgKiBGbGFnIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY3VycmVudGx5IGNyZWF0aW5nIGEgY2xlYW4gcHJvdG90eXBlIG9mIGEgY2xhc3MKICAgICAqCiAgICAgKiBAdHlwZSBCb29sZWFuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3Byb3RvdHlwaW5nID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBNZXRob2QgdG8gZXh0ZW5kIG1hbnVhbGx5IC0gZG8gbm90IGRvIGF1dG9tYXRpY2FsbHkKICAgICAqCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzID0gWydjb25zdHJ1Y3RvcicsICd0b1N0cmluZycsICd2YWx1ZU9mJ107CgogICAgLyoqCiAgICAgKiBMZW50aCBvZiBoaWRkZW4gbWV0aG9kcyBhcnJheQogICAgICoKICAgICAqIEB0eXBlIE51bWJlcgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9oaWRkZW5NZXRob2RzTGVuZ3RoID0gX2hpZGRlbk1ldGhvZHMubGVuZ3RoOwoKICAgIC8qKgogICAgICogUmVnZXggdG8gZmluZCBhbnkgY2FsbHMgdG8gYSBwYXJlbnQgbWV0aG9kCiAgICAgKgogICAgICogQHR5cGUgUmVnRXhwCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGlnbm9yZQogICAgICovCiAgICB2YXIgX3N1cGVyTWV0aG9kUmVnZXggPSAvXGJiYXNlXGIvOwoKICAgIC8qKgogICAgICogQmxhbmsgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAdHlwZSBGdW5jdGlvbgogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9ibGFua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7fTsKCiAgICAvKioKICAgICAqIFByb3RvdHlwZSBkZWZhdWx0IHZhbHVlcy4gV2hlbiBleHRlbmRpbmcgbWV0aG9kcywgaWYgYm90aCBzb3VyY2VzIGhhdmUgdGhlc2UgdmFsdWVzLCBkbyBub3QgY29weSB0aGVtLgogICAgICoKICAgICAqIEB0eXBlIE9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqIEBpZ25vcmUKICAgICAqLwogICAgdmFyIF9wcm90b3R5cGVEZWZhdWx0cyA9IHsgdG9Tb3VyY2U6IG51bGwsIGJhc2U6IF9ibGFua0Z1bmN0aW9uIH07CgogICAgLyoqCiAgICAgKiBCYXNlTGliIGNsYXNzCiAgICAgKgogICAgICogQSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIG1vcmUgdHJhZGl0aW9uYWwgT09QIGludGVyZmFjZSBmb3IgZGV2ZWxvcGVycyB0byB3b3JrIHdpdGgKICAgICAqCiAgICAgKiBAY2xhc3MgTGliLkJhc2UuQmFzZQogICAgICoKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICB2YXIgQmFzZSA9IGZ1bmN0aW9uKCkge307CgogICAgLyoqCiAgICAgKiBTdWJjbGFzcyBhIGNsYXNzCiAgICAgKgogICAgICogQG1ldGhvZCBleHRlbmQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdGFuY2VNZXRob2RzXSBJbnN0YW5jZSBtZW1iZXJzL21ldGhvZHMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGljTWV0aG9kc10gU3RhdGljIG1lbWJlcnMvbWV0aG9kcwogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAc3RhdGljCiAgICAgKi8KICAgIEJhc2UuZXh0ZW5kID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzLCBzdGF0aWNNZXRob2RzKSB7IC8vIHN1YmNsYXNzCiAgICAgICAgdmFyIGV4dGVuZCA9IEJhc2UucHJvdG90eXBlLmV4dGVuZDsKCiAgICAgICAgLy8gYnVpbGQgdGhlIHByb3RvdHlwZQogICAgICAgIF9wcm90b3R5cGluZyA9IHRydWU7CgogICAgICAgIHZhciBwcm90byA9IG5ldyB0aGlzKCk7CiAgICAgICAgZXh0ZW5kLmNhbGwocHJvdG8sIGluc3RhbmNlTWV0aG9kcyk7CgogICAgICAgIC8vIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhbnkgb3RoZXIgbWV0aG9kIHRvIGludm9rZSB0aGF0IG1ldGhvZCdzIGFuY2VzdG9yCiAgICAgICAgcHJvdG8uYmFzZSA9IF9wcm90b3R5cGVEZWZhdWx0cy5iYXNlOwoKICAgICAgICBfcHJvdG90eXBpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gY3JlYXRlIHRoZSB3cmFwcGVyIGZvciB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICB2YXIga2xhc3MgPSBwcm90by5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIV9wcm90b3R5cGluZykgewogICAgICAgICAgICAgICAgLy8gaW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgaWYgKHRoaXMgJiYgKHRoaXMuX2NvbnN0cnVjdGluZyB8fCB0aGlzLmNvbnN0cnVjdG9yID09PSBrbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3RpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIC8vIGNhc3RpbmcKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEJhc2UuY2FzdC5hcHBseShrbGFzcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gYnVpbGQgdGhlIGNsYXNzIGludGVyZmFjZQogICAgICAgIGV4dGVuZC5jYWxsKGtsYXNzLCB0aGlzKTsKICAgICAgICBrbGFzcy5hbmNlc3RvciA9IHRoaXM7CiAgICAgICAga2xhc3MucHJvdG90eXBlID0gcHJvdG87CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBvcmlnaW5hbCBtZXRob2QKICAgICAgICAgKgogICAgICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0KICAgICAgICAgKiBAcmV0dXJuIEZ1bmN0aW9uCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIGtsYXNzLnZhbHVlT2YgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8ga2xhc3MgOiBjb25zdHJ1Y3Rvci52YWx1ZU9mKCk7CiAgICAgICAgfTsKICAgICAgICBleHRlbmQuY2FsbChrbGFzcywgc3RhdGljTWV0aG9kcyk7CgogICAgICAgIC8vIGlmIHN0YXRpYyBpbml0IG1ldGhvZCBleGlzdHMsIGNhbGwgaXQKICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmluaXQgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAga2xhc3MuaW5pdCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZXRob2QgZXh0ZW5kCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHNvdXJjZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ZhbHVlXQogICAgICogQGNoYWluYWJsZQogICAgICovCiAgICBCYXNlLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYSBuYW1lL3ZhbHVlIHBhaXIKICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gVFlQRV9TVFJJTkcgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpc1tzb3VyY2VdOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBhbmNlc3RvciAmJgogICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRpbmcgYSBtZXRob2Q/CiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBUWVBFX0ZVTkNUSU9OKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZU9mKCkgY29tcGFyaXNvbiBpcyB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAoIWFuY2VzdG9yLnZhbHVlT2YgfHwgYW5jZXN0b3IudmFsdWVPZigpICE9PSB2YWx1ZS52YWx1ZU9mKCkpICYmCiAgICAgICAgICAgICAgICBfc3VwZXJNZXRob2RSZWdleC50ZXN0KHZhbHVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdW5kZXJseWluZyBtZXRob2QKICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZS52YWx1ZU9mKCk7CgogICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuYmFzZSB8fCBfcHJvdG90eXBlRGVmYXVsdHMuYmFzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2UgPSBhbmNlc3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1ldGhvZC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHVuZGVybHlpbmcgbWV0aG9kCiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZU9mID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PT0gVFlQRV9PQkpFQ1QpID8gdmFsdWUgOiBtZXRob2Q7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBCYXNlLnRvU3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNbc291cmNlXSA9IHZhbHVlOwoKICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwKICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSkgewogICAgICAgICAgICB2YXIgZXh0ZW5kID0gQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgLy8gaWYgdGhpcyBvYmplY3QgaGFzIGEgY3VzdG9taXNlZCBleHRlbmQgbWV0aG9kIHRoZW4gdXNlIGl0CiAgICAgICAgICAgIGlmICghX3Byb3RvdHlwaW5nICYmIHR5cGVvZiB0aGlzICE9PSBUWVBFX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICAgICBleHRlbmQgPSB0aGlzLmV4dGVuZCB8fCBleHRlbmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvIGhpZGRlbiBtZXRob2RzIHNlcGFyYXRlbHkKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByb3RvdHlwaW5nIHRoZW4gaW5jbHVkZSB0aGUgY29uc3RydWN0b3IKICAgICAgICAgICAgdmFyIGkgPSBfcHJvdG90eXBpbmcgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yICg7IGkgPCBfaGlkZGVuTWV0aG9kc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSBfaGlkZGVuTWV0aG9kc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vba2V5XSAhPT0gX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBlYWNoIG9mIHRoZSBzb3VyY2Ugb2JqZWN0J3MgcHJvcGVydGllcyB0byB0aGlzIG9iamVjdAogICAgICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICghX3Byb3RvdHlwZURlZmF1bHRzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQuY2FsbCh0aGlzLCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8vIGluaXRpYWxpc2UKICAgIEJhc2UgPSBCYXNlLmV4dGVuZCh7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgc3RhdGljIGJhc2UgbWV0aG9kCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGJhc2UKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYmFzZTogX3Byb3RvdHlwZURlZmF1bHRzLmJhc2UKCiAgICB9LCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcmVudCBvYmplY3QvY2xhc3MKICAgICAgICAgKgogICAgICAgICAqIEBwcm9wZXJ0eSBhbmNlc3RvcgogICAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgYW5jZXN0b3I6IE9iamVjdCwKCiAgICAgICAgLyoqCiAgICAgICAgICogQmFzZS5qcyB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvcGVydHkgdmVyc2lvbgogICAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAaWdub3JlCiAgICAgICAgICovCiAgICAgICAgdmVyc2lvbjogJzEuMScsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuZCBjdXJyZW50IGNsYXNzIGludG8gYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGUgaXMgcGFzc2VkLCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICogd2lsbCBiZSBjYXN0IEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogSWYgYW4gYSBjbGFzcyAod2l0aCBjb25zdHJ1Y3RvcikgaXMgcGFzc2VkLCBib3RoIHN0YXRpYyBhbmQKICAgICAgICAgKiBwcm90b3R5cGUgbWV0aG9kcyB3aWxsIGJlIGNhc3QgRVhDRVBUIGZvciB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBAbWV0aG9kIGNhc3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBjYXN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGV4dGVuZDsKICAgICAgICAgICAgdmFyIGNhc3RlcjsKCiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhc3RlciA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgIGV4dGVuZCA9IGNhc3Rlci5leHRlbmQgfHwgQmFzZS5wcm90b3R5cGUuZXh0ZW5kOwoKICAgICAgICAgICAgICAgIC8vIGNhc3QgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXN0ZXIgPT09IFRZUEVfRlVOQ1RJT04pIHsKICAgICAgICAgICAgICAgICAgICBleHRlbmQgPSBjYXN0ZXIucHJvdG90eXBlLmV4dGVuZCB8fCBCYXNlLnByb3RvdHlwZS5leHRlbmQ7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kLmNhbGwoY2FzdGVyLnByb3RvdHlwZSwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY2FzdGVyLmFuY2VzdG9yID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2FzdCBvbmx5IHByb3RvdHlwZSBtZXRob2RzCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZC5jYWxsKGNhc3RlciwgdGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnQgYSBjbGFzcyBpbnRvIHRoZSBjdXJyZW50IGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQWxsIHByb3RvdHlwZSBhbmQgc3RhdGljIHByb3BlcnRpZXMgd2lsbCBiZSBleHRlbmRlZCBpbnRvCiAgICAgICAgICogYHRoaXNgIEVYQ0VQVCBmb3IgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCBpbXBsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY2xhc3MqIENsYXNzZXMgb3Igb2JqZWN0cyB0byBjYXN0CiAgICAgICAgICogQGNoYWluYWJsZQogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKi8KICAgICAgICBpbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5jYXN0LmNhbGwoYXJndW1lbnRzW2ldLCB0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHN0cmluZyB2YWx1ZSBvZiBjbGFzcwogICAgICAgICAqCiAgICAgICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJyc7CiAgICAgICAgfQoKICAgIH0pOwoKICAgIHJldHVybiBCYXNlOwoKCn0pKTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQovKioKICogQWxwYWNhIGZvcm1zIGVuZ2luZSBmb3IgalF1ZXJ5CiAqLwooZnVuY3Rpb24oJCkgewoKICAgIC8qKgogICAgICogUmVuZGVycyBhbiBBbHBhY2EgZmllbGQgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBiYXNpYyBzeW50YXggaXM6CiAgICAgKgogICAgICogPGNvZGU+CiAgICAgKiAgICAgPHByZT4KICAgICAqICAgICAgICAgQWxwYWNhKGVsLCBjb25maWcpOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIFRoZSBmdWxsIHN5bnRheCBpczoKICAgICAqCiAgICAgKiA8Y29kZT4KICAgICAqICAgICA8cHJlPgogICAgICogICAgICAgICBBbHBhY2EoZWwsIHsKICAgICAqICAgICAgICAgICAgICAiZGF0YSIgOiB7QW55fSBmaWVsZCBkYXRhIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInNjaGVtYSI6IHtPYmplY3R9IGZpZWxkIHNjaGVtYSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJvcHRpb25zIiA6IHtPYmplY3R9IGZpZWxkIG9wdGlvbnMgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAidmlldyI6IHtPYmplY3R8U3RyaW5nfSBmaWVsZCB2aWV3IChvYmplY3Qgb3IgaWQgcmVmZXJlbmNlKSAob3B0aW9uYWwpLAogICAgICogICAgICAgICAgICAgICJyZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXBsYWNpbmcgZGVmYXVsdCByZW5kZXJpbmcgbWV0aG9kIChvcHRpb25hbCksCiAgICAgKiAgICAgICAgICAgICAgInBvc3RSZW5kZXIiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXJlbmRlcmluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiZXJyb3IiOiB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlcnJvciBoYW5kbGluZyAgKG9wdGlvbmFsKSwKICAgICAqICAgICAgICAgICAgICAiY29ubmVjdG9yIjoge0FscGFjYS5Db25uZWN0b3J9IGNvbm5lY3RvciBmb3IgcmV0cmlldmluZyBvciBzdG9yaW5nIGRhdGEsIHNjaGVtYSwgb3B0aW9ucywgdmlldyBhbmQgdGVtcGxhdGVzLiAob3B0aW9uYWwpCiAgICAgKiAgICAgICAgIH0pOwogICAgICogICAgIDwvcHJlPgogICAgICogPC9jb2RlPgogICAgICoKICAgICAqIEByZXR1cm5zIHsqfQogICAgICovCiAgICB2YXIgQWxwYWNhID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBpbGxlZ2FsCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYSBET00gZWxlbWVudCBhZ2FpbnN0IHdoaWNoIEFscGFjYSB3aWxsIGdlbmVyYXRlIGEgZm9ybSBvciBpdCBjYW4gYmUgYSBmdW5jdGlvbiBuYW1lLiAgU2VlIGh0dHA6Ly93d3cuYWxwYWNhanMub3JnIGZvciBtb3JlIGRldGFpbHMuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSBmaXJzdCBhcmd1bWVudCAoZWl0aGVyIGEgc3RyaW5nIG9yIGEgRE9NIGVsZW1lbnQpCiAgICAgICAgdmFyIGVsID0gYXJnc1swXTsKICAgICAgICBpZiAoZWwgJiYgQWxwYWNhLmlzU3RyaW5nKGVsKSkgewogICAgICAgICAgICBlbCA9ICQoIiMiICsgZWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHdlIG1heSB3YW50IHRvIGZpZ3VyZSBvdXQKICAgICAgICB2YXIgZGF0YSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgIHZhciB2aWV3ID0gbnVsbDsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHZhciByZW5kZXJlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG51bGw7CiAgICAgICAgdmFyIGNvbm5lY3RvciA9IG51bGw7CiAgICAgICAgdmFyIG5vdFRvcExldmVsID0gZmFsc2U7CiAgICAgICAgdmFyIGluaXRpYWxTZXR0aW5ncyA9IHt9OwoKICAgICAgICAvLyBpZiB0aGVzZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlbiBkYXRhLCBzY2hlbWEsIG9wdGlvbnMgYW5kIHNvdXJjZSBhcmUgbG9hZGVkIHZpYSBjb25uZWN0b3IKICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IG51bGw7CiAgICAgICAgdmFyIG9wdGlvbnNTb3VyY2UgPSBudWxsOwogICAgICAgIHZhciB2aWV3U291cmNlID0gbnVsbDsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgdGhlIEFscGFjYSBmaWVsZCBpbnN0YW5jZSBib3VuZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGaXJzdCBjb25zaWRlcnMgdGhlIGltbWVkaWF0ZSBkb20gZWxlbWVudCBhbmQgdGhlbiBsb29rcyAxIGxldmVsIGRlZXAgdG8gY2hpbGRyZW4gYW5kIHRoZW4gdXAgdG8gcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmRFeGlzdGluZ0FscGFjYUJpbmRpbmcgPSBmdW5jdGlvbihkb21FbGVtZW50LCBza2lwUGl2b3QpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBudWxsOwoKICAgICAgICAgICAgLy8gbG9vayBhdCAiZGF0YS1hbHBhY2EtZmllbGQtaWQiCiAgICAgICAgICAgIHZhciBhbHBhY2FGaWVsZElkID0gJChkb21FbGVtZW50KS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICBpZiAoYWxwYWNhRmllbGRJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFscGFjYUZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW2FscGFjYUZpZWxkSWRdOwogICAgICAgICAgICAgICAgaWYgKGFscGFjYUZpZWxkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gYWxwYWNhRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgbG9vayBhdCAiZGF0YS1hbHBhY2EtZm9ybS1pZCIKICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZvcm1JZCA9ICQoZG9tRWxlbWVudCkuYXR0cigiZGF0YS1hbHBhY2EtZm9ybS1pZCIpOwogICAgICAgICAgICAgICAgaWYgKGZvcm1JZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRWxlbWVudHMgPSAkKGRvbUVsZW1lbnQpLmZpbmQoIjpmaXJzdCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWJFbGVtZW50cy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkSWQgPSAkKHN1YkVsZW1lbnRzWzBdKS5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1pZCIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkZpZWxkID0gQWxwYWNhLmZpZWxkSW5zdGFuY2VzW3N1YkZpZWxkSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3ViRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgY2hlY2sgZm9yIGNoaWxkcmVuIDB0aCBlbGVtZW50CiAgICAgICAgICAgIGlmICghZXhpc3RpbmcgJiYgIXNraXBQaXZvdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkRG9tRWxlbWVudHMgPSAkKGVsKS5maW5kKCI6Zmlyc3QiKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZERvbUVsZW1lbnRzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGNoaWxkRG9tRWxlbWVudHNbMF0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpZWxkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBjaGVjayBwYXJlbnQKICAgICAgICAgICAgaWYgKCFleGlzdGluZyAmJiAhc2tpcFBpdm90KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWwgPSAkKGVsKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGQgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKHBhcmVudEVsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IHBhcmVudEZpZWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICAgIH07CgogICAgICAgIHZhciBzcGVjaWFsRnVuY3Rpb25OYW1lcyA9IFsiZ2V0IiwgImV4aXN0cyIsICJkZXN0cm95Il07CiAgICAgICAgdmFyIGlzU3BlY2lhbEZ1bmN0aW9uID0gKGFyZ3MubGVuZ3RoID4gMSAmJiBBbHBhY2EuaXNTdHJpbmcoYXJnc1sxXSkgJiYgKHNwZWNpYWxGdW5jdGlvbk5hbWVzLmluZGV4T2YoYXJnc1sxXSkgPiAtMSkpOwoKICAgICAgICB2YXIgZXhpc3RpbmcgPSBmaW5kRXhpc3RpbmdBbHBhY2FCaW5kaW5nKGVsKTsKICAgICAgICBpZiAoZXhpc3RpbmcgfHwgaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNTcGVjaWFsRnVuY3Rpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgc3BlY2lhbCBmdW5jdGlvbiBuYW1lCiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbEZ1bmN0aW9uTmFtZSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICBpZiAoImdldCIgPT09IHNwZWNpYWxGdW5jdGlvbk5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXhpc3RzIiA9PT0gc3BlY2lhbEZ1bmN0aW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhpc3RpbmcgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImRlc3Ryb3kiID09PSBzcGVjaWFsRnVuY3Rpb25OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIlVua25vd24gc3BlY2lhbCBmdW5jdGlvbjogIiArIHNwZWNpYWxGdW5jdGlvbk5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25maWcgPSBudWxsOwoKICAgICAgICAgICAgLy8ganVzdCBhIGRvbSBlbGVtZW50LCBubyBvdGhlciBhcmdzPwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBlbGVtZW50IGFuZCB1c2UgdGhhdCBmb3IgY29uZmlnCiAgICAgICAgICAgICAgICB2YXIganNvblN0cmluZyA9ICQoZWwpLnRleHQoKTsKCiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpOwogICAgICAgICAgICAgICAgJChlbCkuaHRtbCgiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGFyZ3NbMV0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNGdW5jdGlvbihhcmdzWzFdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhcmdzWzFdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBBbHBhY2EgY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhID0gY29uZmlnLmRhdGE7CiAgICAgICAgICAgIHNjaGVtYSA9IGNvbmZpZy5zY2hlbWE7CiAgICAgICAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKICAgICAgICAgICAgdmlldyA9IGNvbmZpZy52aWV3OwogICAgICAgICAgICBjYWxsYmFjayA9IGNvbmZpZy5yZW5kZXI7CiAgICAgICAgICAgIGlmIChjb25maWcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBjb25maWcucG9zdFJlbmRlcjsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IGNvbmZpZy5lcnJvcjsKICAgICAgICAgICAgY29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKCiAgICAgICAgICAgIC8vIHNvdXJjZXMKICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGNvbmZpZy5kYXRhU291cmNlOwogICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSBjb25maWcuc2NoZW1hU291cmNlOwogICAgICAgICAgICBvcHRpb25zU291cmNlID0gY29uZmlnLm9wdGlvbnNTb3VyY2U7CiAgICAgICAgICAgIHZpZXdTb3VyY2UgPSBjb25maWcudmlld1NvdXJjZTsKCiAgICAgICAgICAgIC8vIG90aGVyCiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidWkiXSA9IGNvbmZpZy51aTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxTZXR0aW5nc1sidHlwZSJdID0gY29uZmlnLnR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWcubm90VG9wTGV2ZWwpKSB7CiAgICAgICAgICAgICAgICBub3RUb3BMZXZlbCA9IGNvbmZpZy5ub3RUb3BMZXZlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gaWYgbm8gZXJyb3IgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHdlIGZhbGwgYmFjayB0byBhIGJyb3dzZXIgYWxlcnQKICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkoZXJyb3JDYWxsYmFjaykpIHsKICAgICAgICAgICAgZXJyb3JDYWxsYmFjayA9IEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb25uZWN0b3IgKGlmIG5vdCBhbHJlYWR5IGluc3RhbnRpYXRlZCkKICAgICAgICAvLyBpZiBjb25maWcgaXMgcGFzc2VkIGluIChhcyBvYmplY3QpLCB3ZSBpbnN0YW50aWF0ZQogICAgICAgIGlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3IuY29ubmVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9ICJkZWZhdWx0IjsKICAgICAgICAgICAgdmFyIGNvbm5lY3RvckNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKGNvbm5lY3RvcikpIHsKICAgICAgICAgICAgICAgIGNvbm5lY3RvcklkID0gY29ubmVjdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChjb25uZWN0b3IpICYmIGNvbm5lY3Rvci5pZCkgewogICAgICAgICAgICAgICAgY29ubmVjdG9ySWQgPSBjb25uZWN0b3IuaWQ7CiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvckNvbmZpZyA9IGNvbm5lY3Rvci5jb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBDb25uZWN0b3JDbGFzcyA9IEFscGFjYS5nZXRDb25uZWN0b3JDbGFzcyhjb25uZWN0b3JJZCk7CiAgICAgICAgICAgIGlmICghQ29ubmVjdG9yQ2xhc3MpIHsKICAgICAgICAgICAgICAgIENvbm5lY3RvckNsYXNzID0gQWxwYWNhLmdldENvbm5lY3RvckNsYXNzKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIHNlY29uZCBvciBkZWVwZXIgbGV2ZWwgb2YgZmllbGRzLCBkZWZhdWx0IGxvYWRlciBzaG91bGQgYmUgdGhlIG9uZSB0byBkbyBsb2FkQWxsCiAgICAgICAgLy8gc2luY2Ugc2NoZW1hLCBkYXRhLCBvcHRpb25zIGFuZCB2aWV3IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuCiAgICAgICAgLy8gVW5sZXNzIHdlIHdhbnQgdG8gbG9hZCBpbmRpdmlkdWFsIGZpZWxkcyAob3RoZXIgdGhhbiB0aGUgdGVtcGxhdGVzKSB1c2luZyB0aGUgcHJvdmlkZWQKICAgICAgICAvLyBsb2FkZXIsIHRoaXMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiBUaGUgYmVuZWZpdCBpcyBzYXZpbmcgdGltZSBvbiBsb2FkZXIgZm9ybWF0IGNoZWNraW5nLgoKICAgICAgICB2YXIgbG9hZEFsbENvbm5lY3RvciA9IGNvbm5lY3RvcjsKCiAgICAgICAgaWYgKG5vdFRvcExldmVsKSB7CiAgICAgICAgICAgIHZhciBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICAgICAgbG9hZEFsbENvbm5lY3RvciA9IG5ldyBMb2FkQWxsQ29ubmVjdG9yQ2xhc3MoImRlZmF1bHQiKTsKICAgICAgICB9CgogICAgICAgIGlmICghb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyByZXNldHMgdGhlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGJhY2sgdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBmaXJzdCByZW5kZXIKICAgICAgICB2YXIgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgdGhlbiB3ZSBjYWxsIGZvciB2YWxpZGF0aW9uIHN0YXRlIHRvIGJlIHJlY2FsY3VsYXRlZCBhY3Jvc3MKICAgICAgICAgICAgLy8gYWxsIGNoaWxkIGZpZWxkcwogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluYWwgY2FsbCB0byB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBzdXNwZW5kIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICghZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmb3JjZSBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciB0byBmYWxzZSBmb3IgZmllbGQgYW5kIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZCwgZnVuY3Rpb24oZmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBhZnRlciBmaXJzdCB2YWxpZGF0aW9uIChldmVuIGlmIGluIENSRUFURSBtb2RlLCB3ZSBvbmx5IGZvcmNlIGluaXQgdmFsaWRhdGlvbiBlcnJvciBmYWxzZSBvbiBmaXJzdCByZW5kZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gd3JhcCByZW5kZXJlZCBjYWxsYmFjayB0byBhbGxvdyBmb3IgVUkgdHJlYXRtZW50IChkb20gZm9jdXMsIGV0YykKICAgICAgICB2YXIgX3JlbmRlcmVkQ2FsbGJhY2sgPSBmdW5jdGlvbihmaWVsZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCwgYXBwbHkgYSB1bmlxdWUgb2JzZXJ2YWJsZSBzY29wZSBpZAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQub2JzZXJ2YWJsZVNjb3BlID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgICAgIC8vIGZpcmUgInJlYWR5IiBldmVudCBvbiBldmVyeSBjb250cm9sCiAgICAgICAgICAgIC8vIGdvIGRvd24gZGVwdGggZmlyc3QgYW5kIGZpcmUgdG8gbG93ZXN0IGNvbnRyb2xzIGJlZm9yZSB0cmlja2xpbmcgYmFjayB1cAogICAgICAgICAgICBpZiAoIWZpZWxkLnBhcmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShmaWVsZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRvcCBsZXZlbCBhbmQgZm9jdXMgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCwgdGhlbiBhdXRvLXNldAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpICYmICFmaWVsZC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvLXNldCB0aGUgZm9jdXM/CiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9jdXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZG9Gb2N1cyA9IGZ1bmN0aW9uKF9fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLnN1c3BlbmRCbHVyRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBfX2ZpZWxkLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9fZmllbGQuc3VzcGVuZEJsdXJGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQ29udHJvbEZpZWxkICYmIGZpZWxkLmlzQXV0b0ZvY3VzYWJsZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvY3VzIG9uIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvY3VzKGZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0NvbnRhaW5lckZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb2N1cyA9IHRydWUsIHRoZW4gZm9jdXMgb24gdGhlIGZpcnN0IGNoaWxkIGNvbnRyb2wgaWYgaXQgaXMgYXV0by1mb2N1c2FibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3QgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlbiAmJiBmaWVsZC5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuW3pdLmlzQ29udHJvbEZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jaGlsZHJlblt6XS5pc0F1dG9Gb2N1c2FibGUoKSAmJiAhZmllbGQuY2hpbGRyZW5bel0ub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQuY2hpbGRyZW5bel0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoZmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihvcHRpb25zLmZvY3VzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgcGF0aCB0byB0aGUgY2hpbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRDb250cm9sQnlQYXRoKG9wdGlvbnMuZm9jdXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5pc0NvbnRyb2xGaWVsZCAmJiBjaGlsZC5pc0F1dG9Gb2N1c2FibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRm9jdXMoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc2V0SW5pdFZhbGlkYXRpb25FcnJvcihmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNldEluaXRWYWxpZGF0aW9uRXJyb3IoZmllbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVuZGVyZWRDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjayhmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBsb2FkQWxsQ29ubmVjdG9yLmxvYWRBbGwoewogICAgICAgICAgICAiZGF0YSI6IGRhdGEsCiAgICAgICAgICAgICJzY2hlbWEiOiBzY2hlbWEsCiAgICAgICAgICAgICJvcHRpb25zIjogb3B0aW9ucywKICAgICAgICAgICAgInZpZXciOiB2aWV3LAogICAgICAgICAgICAiZGF0YVNvdXJjZSI6IGRhdGFTb3VyY2UsCiAgICAgICAgICAgICJzY2hlbWFTb3VyY2UiOiBzY2hlbWFTb3VyY2UsCiAgICAgICAgICAgICJvcHRpb25zU291cmNlIjogb3B0aW9uc1NvdXJjZSwKICAgICAgICAgICAgInZpZXdTb3VyY2UiOiB2aWV3U291cmNlCiAgICAgICAgfSwgZnVuY3Rpb24obG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3KSB7CgogICAgICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHNvdXJjZSBsb2FkZXJzLCBmYWxsIGJhY2sgdG8gd2hhdCBtYXkgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAvLyBpbiBkaXJlY3RseSBhcyB2YWx1ZXMKCiAgICAgICAgICAgIGxvYWRlZERhdGEgPSBsb2FkZWREYXRhID8gbG9hZGVkRGF0YSA6IGRhdGE7CiAgICAgICAgICAgIGxvYWRlZFNjaGVtYSA9IGxvYWRlZFNjaGVtYSA/IGxvYWRlZFNjaGVtYTogc2NoZW1hOwogICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gbG9hZGVkT3B0aW9ucyA/IGxvYWRlZE9wdGlvbnMgOiBvcHRpb25zOwogICAgICAgICAgICBsb2FkZWRWaWV3ID0gbG9hZGVkVmlldyA/IGxvYWRlZFZpZXcgOiB2aWV3OwoKICAgICAgICAgICAgLy8gc29tZSBkZWZhdWx0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgZGF0YSBpcyBudWxsCiAgICAgICAgICAgIC8vIGlmIHNjaGVtYSArIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgd2UgYXNzdW1lIGEgdGV4dCBmaWVsZAoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGxvYWRlZERhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkU2NoZW1hKSAmJiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykgfHwgQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucy50eXBlKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YSA9ICIiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkobG9hZGVkT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRPcHRpb25zID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zICYmIEFscGFjYS5pc09iamVjdChvcHRpb25zKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZE9wdGlvbnMudHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2FkZWRPcHRpb25zLnZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvYWRlZFZpZXcgPSBsb2FkZWRPcHRpb25zLnZpZXc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGluaXQgYWxwYWNhCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EuaW5pdChlbCwgbG9hZGVkRGF0YSwgbG9hZGVkT3B0aW9ucywgbG9hZGVkU2NoZW1hLCBsb2FkZWRWaWV3LCBpbml0aWFsU2V0dGluZ3MsIGNhbGxiYWNrLCBfcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKCiAgICAgICAgfSwgZnVuY3Rpb24gKGxvYWRFcnJvcikgewogICAgICAgICAgICBlcnJvckNhbGxiYWNrKGxvYWRFcnJvcik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIEZpZWxkIENsYXNzIEltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgQWxwYWNhLkZpZWxkcyA9IHsgfTsKCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgTmFtZXNwYWNlIGZvciBhbGwgQWxwYWNhIENvbm5lY3RvciBDbGFzcyBJbXBsZW1lbnRhdGlvbnMuCiAgICAgKi8KICAgIEFscGFjYS5Db25uZWN0b3JzID0geyB9OwoKICAgIEFscGFjYS5FeHRlbmQgPSAkLmV4dGVuZDsKCiAgICBBbHBhY2EuQ3JlYXRlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBhcmdzLnVuc2hpZnQoe30pOwoKICAgICAgICByZXR1cm4gJC5leHRlbmQuYXBwbHkodGhpcywgYXJncyk7CiAgICB9OwoKICAgIC8vIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzCiAgICBBbHBhY2EuRXh0ZW5kKEFscGFjYSwKICAgIC8qKiBAbGVuZHMgQWxwYWNhICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FueX0gbm9uQXJyYXkgQSBub24tYXJyYXkgdmFyaWFibGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvdXQgb2YgdGhlIG5vbi1hcnJheSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBtYWtlQXJyYXkgOiBmdW5jdGlvbihub25BcnJheSkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uQXJyYXkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IG9iaiBUaGUgdmFyaWFibGUgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuICFBbHBhY2EuaXNVbmRlZmluZWQob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgd2hldGhlciB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIGlzIGEgcGxhaW4sIG5vbi1wcm90b3R5cGVkIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgcGxhaW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAkLmlzUGxhaW5PYmplY3Qob2JqKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgbnVtYmVyLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc051bWJlcjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gIm51bWJlciIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNBcnJheTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgYm9vbGVhbi4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQm9vbGVhbjogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gImJvb2xlYW4iKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSB7QW55fSBvYmogVGhlIHZhcmlhYmxlIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgYSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIG9iaiA9PSAidW5kZWZpbmVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RyaXBzIGFueSBleGNlc3Mgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHRleHQuCiAgICAgICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RyCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgdHJpbTogZnVuY3Rpb24odGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gdGV4dDsKCiAgICAgICAgICAgIGlmICh0cmltbWVkICYmIEFscGFjYS5pc1N0cmluZyh0cmltbWVkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJpbW1lZCA9IHRyaW1tZWQucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYSBzYWZlIGNvbnZlcnNpb24gb2YgYW4gSFRNTCB0ZXh0dWFsIHN0cmluZyBpbnRvIGEgRE9NIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB4CiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBzYWZlRG9tUGFyc2U6IGZ1bmN0aW9uKHgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoeCAmJiBBbHBhY2EuaXNTdHJpbmcoeCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHggPSBBbHBhY2EudHJpbSh4KTsKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGRvbQogICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSAkKHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhbm90aGVyIGF0dGVtcHQgdG8gYWNjb3VudCBmb3Igc2FmZXR5IGluIHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgICAgICAgICB4ID0gIjxkaXY+IiArIHggKyAiPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gJCh4KS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHBhcmFtIFtib29sZWFuXSBpbmNsdWRlRnVuY3Rpb25zIHdoZXRoZXIgdG8gaW5jbHVkZSBmdW5jdGlvbnMgaW4gYW55IGNvdW50cwogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKG9iaiwgaW5jbHVkZUZ1bmN0aW9ucykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmogPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2JqICYmIEFscGFjYS5pc09iamVjdChvYmopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBzZWxmLmNvdW50UHJvcGVydGllcyhvYmosIGluY2x1ZGVGdW5jdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqCiAgICAgICAgICogQHBhcmFtIGluY2x1ZGVGdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgY291bnRQcm9wZXJ0aWVzOiBmdW5jdGlvbihvYmosIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChvYmogJiYgQWxwYWNhLmlzT2JqZWN0KG9iaikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZ1bmN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob2JqW2tdKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIGNvcHkgb2YgdGhlIGdpdmVuIEpTIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHZhbHVlIGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc2ltcGxlIG9iamVjdCwgdGhlbiBhIHB1cmUgY29weSBpcyBwcm9kdWNlZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGl0J3MgYSBjb21wbGV4IG9iamVjdCBvciBhIGZ1bmN0aW9uLCB0aGVuIHRoZSByZWZlcmVuY2UgaXMgY29waWVkIChpLmUuIG5vdCB0cnVseSBhIGNvcHkpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRoaW5nCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBjb3B5T2Y6IGZ1bmN0aW9uKHRoaW5nKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvcHkgPSB0aGluZzsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaW5nLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChBbHBhY2EuY29weU9mKHRoaW5nW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHRoaW5nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaW5nLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZyBpbnN0YW5jZW9mIFJlZ0V4cCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGluZy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBET00gbm9kZQogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB0aGluZy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodGhpbmcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGluZykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGluZy5oYXNPd25Qcm9wZXJ0eShrKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrXSA9IEFscGFjYS5jb3B5T2YodGhpbmdba10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBzb21lIG90aGVyIGtpbmQgb2Ygb2JqZWN0IHNvIHdlIGp1c3QgZG8gYSByZWZlcmVudGlhbCBjb3B5CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3RoZXIgd29yZHMsIG5vdCBhIGNvcHkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgfSwKCiAgICAgICAgY29weUludG86IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoaSkgJiYgIXRoaXMuaXNGdW5jdGlvbih0aGlzW2ldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBzb3VyY2VbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIEFsaWFzIGZvciBjb3B5T2YoKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBjbG9uZU9iamVjdDogZnVuY3Rpb24ob2JqZWN0KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5jb3B5T2Yob2JqZWN0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpY2VzIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBTb3VyY2Ugc3RyaW5nIHRvIGJlIHNwbGljZWQuCiAgICAgICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VQb2ludCBTcGxpY2UgbG9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHNwbGljZSBTdHJpbmcgdG8gYmUgc3BsaWNlZCBpbi4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTcGxpY2VkIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHNwbGljZUluOiBmdW5jdGlvbihzb3VyY2UsIHNwbGljZVBvaW50LCBzcGxpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoMCwgc3BsaWNlUG9pbnQpICsgc3BsaWNlICsgc291cmNlLnN1YnN0cmluZyhzcGxpY2VQb2ludCwgc291cmNlLmxlbmd0aCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFjdHMgYW4gYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgU291cmNlIGFycmF5IHRvIGJlIGNvbXBhY3RlZC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IENvbXBhY3RlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBjb21wYWN0QXJyYXk6IGZ1bmN0aW9uKGFycikgewogICAgICAgICAgICB2YXIgbiA9IFtdLCBsID0gYXJyLmxlbmd0aCxpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxhbmcuaXNOdWxsKGFycltpXSkgJiYgIWxhbmcuaXNVbmRlZmluZWQoYXJyW2ldKSkgewogICAgICAgICAgICAgICAgICAgIG4ucHVzaChhcnJbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWNjZW50cyBmcm9tIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTb3VyY2Ugc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENsZWFuZWQgc3RyaW5nIHdpdGhvdXQgYWNjZW50cy4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBY2NlbnRzOiBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bw6DDocOiw6PDpMOlXS9nLCAiYSIpLnJlcGxhY2UoL1vDqMOpw6rDq10vZywgImUiKS5yZXBsYWNlKC9bw6zDrcOuw69dL2csICJpIikucmVwbGFjZSgvW8Oyw7PDtMO1w7ZdL2csICJvIikucmVwbGFjZSgvW8O5w7rDu8O8XS9nLCAidSIpLnJlcGxhY2UoL1vDvcO/XS9nLCAieSIpLnJlcGxhY2UoL1vDsV0vZywgIm4iKS5yZXBsYWNlKC9bw6ddL2csICJjIikucmVwbGFjZSgvW8WTXS9nLCAib2UiKS5yZXBsYWNlKC9bw6ZdL2csICJhZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIGVsCiAgICAgICAgICogQHBhcmFtIGFycgogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqLwogICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBhcnIsIGZuKSB7CiAgICAgICAgICAgIHZhciBsID0gYXJyLmxlbmd0aCxpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNGdW5jdGlvbihmbikpIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQGlnbm9yZQogICAgICAgICAgICAgICAgICogQHBhcmFtIGVsdAogICAgICAgICAgICAgICAgICogQHBhcmFtIGFyckVsdAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGVsdCwgYXJyRWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdCA9PT0gYXJyRWx0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwoe30sIGVsLCBhcnJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTdGF0aWMgY291bnRlciBmb3IgZ2VuZXJhdGluZyBhIHVuaXF1ZSBJRC4KICAgICAgICAgKi8KICAgICAgICB1bmlxdWVJZENvdW50ZXI6IDAsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgTG9jYWxlLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRMb2NhbGU6ICJlbl9VUyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gc2V0IGZvY3VzIGJ5IGRlZmF1bHQKICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9jdXM6IHRydWUsCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24gdG8gdXNlIGZvciBlbnVtZXJhdGlvbnMuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFNvcnQ6IGZ1bmN0aW9uKGEsIGIpIHsKCiAgICAgICAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEudGV4dCA8IGIudGV4dCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IExvY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgTmV3IGRlZmF1bHQgbG9jYWxlLgogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRMb2NhbGU6IGZ1bmN0aW9uKGxvY2FsZSkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmllbGQgVHlwZSB0byBTY2hlbWEgVHlwZSBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZGF0YSB0eXBlIG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2NoZW1hVHlwZSBTY2hlbWEgZGF0YSB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmc6IGZ1bmN0aW9uKHNjaGVtYVR5cGUsIGZpZWxkVHlwZSkgewogICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNjaGVtYUZpZWxkTWFwcGluZ1tzY2hlbWFUeXBlXSA9IGZpZWxkVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpZWxkIFR5cGUgdG8gU2NoZW1hIEZvcm1hdCBNYXBwaW5ncy4KICAgICAgICAgKi8KICAgICAgICBkZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZmllbGQgdHlwZSB0byBzY2hlbWEgZm9ybWF0IG1hcHBpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFNjaGVtYSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkVHlwZSBGaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZzogZnVuY3Rpb24oZm9ybWF0LCBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdCAmJiBmaWVsZFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tmb3JtYXRdID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBzY2hlbWEgdHlwZSBvZiBhIHZhcmlhYmxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgVGhlIHZhcmlhYmxlLgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFUeXBlOiBmdW5jdGlvbihkYXRhKSB7CgogICAgICAgICAgICB2YXIgc2NoZW1hVHlwZSA9IG51bGw7CgogICAgICAgICAgICAvLyBtYXAgZGF0YSB0eXBlcyB0byBkZWZhdWx0IGZpZWxkIHR5cGVzCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShkYXRhKSkgewogICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9ICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImFycmF5IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAib2JqZWN0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNOdW1iZXIoZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNCb29sZWFuKGRhdGEpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gImJvb2xlYW4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3QgY2hlY2sgZm9yIGRhdGEgdGhhdCBjYXJyaWVzIGZ1bmN0aW9ucyAtLSBHaXRhbmFDb25uZWN0b3IgY2FzZS4KICAgICAgICAgICAgaWYgKCFzY2hlbWFUeXBlICYmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gIm9iamVjdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzY2hlbWFUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIGEgYmVzdCBndWVzcyBhdCB0aGUgb3B0aW9ucyBmaWVsZCB0eXBlIGlmIG5vbmUgcHJvdmlkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZpZWxkIHR5cGUKICAgICAgICAgKi8KICAgICAgICBndWVzc09wdGlvbnNUeXBlOiBmdW5jdGlvbihzY2hlbWEpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAoc2NoZW1hICYmIHR5cGVvZihzY2hlbWFbImVudW0iXSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hWyJlbnVtIl0ubGVuZ3RoID4gMykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlID0gQWxwYWNhLmRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmdbc2NoZW1hLnR5cGVdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgZm9ybWF0IGRlZmluZWQKICAgICAgICAgICAgaWYgKHNjaGVtYS5mb3JtYXQgJiYgQWxwYWNhLmRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmdbc2NoZW1hLmZvcm1hdF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBBbHBhY2EuZGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZ1tzY2hlbWEuZm9ybWF0XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWxwYWNhIFZpZXdzLgogICAgICAgICAqLwogICAgICAgIHZpZXdzOiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdmFsaWQgdmlldyBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgdmFsaWQgdW5pcXVlIHZpZXcgaWQuCiAgICAgICAgICovCiAgICAgICAgZ2VuZXJhdGVWaWV3SWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAidmlldy0iICsgdGhpcy5nZW5lcmF0ZUlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgdmlldyB3aXRoIHRoZSBmcmFtZXdvcmsuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld09iamVjdAogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVmlldzogZnVuY3Rpb24odmlld09iamVjdCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2aWV3SWQgPSB2aWV3T2JqZWN0LmlkOwoKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IoIkNhbm5vdCByZWdpc3RlciB2aWV3IHdpdGggbWlzc2luZyB2aWV3IGlkOiAiICsgdmlld0lkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlldyA9IHRoaXMudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KGV4aXN0aW5nVmlldywgdmlld09iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB2aWV3T2JqZWN0OwoKICAgICAgICAgICAgICAgIGlmICghdmlld09iamVjdC50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlld09iamVjdC50ZW1wbGF0ZXMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBwcmVjb21waWxlZCB2aWV3cywgZmxhZyB0aGVtCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNrIHRoZSBlbmdpbmUgaWYgaXQgaGFzIGFueSBjYWNoZSBrZXlzIGZvciB2aWV3IHRlbXBsYXRlcyBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleXMgPSBlbmdpbmUuZmluZENhY2hlS2V5cyh2aWV3SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IGNhY2hlS2V5cy5sZW5ndGg7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gQWxwYWNhLnNwbGl0Q2FjaGVLZXkoY2FjaGVLZXlzW3pdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHByZWNvbXBpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqZWN0LnRlbXBsYXRlc1twYXJ0cy50ZW1wbGF0ZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IGVuZ2luZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogY2FjaGVLZXlzW3pdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGEgbm9ybWFsaXplZCB2aWV3IGJ5IHZpZXcgaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdmlld0lkCiAgICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROb3JtYWxpemVkVmlldzogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb2x2ZXMgd2hpY2ggdmlldyBoYW5kbGVzIGEgZ2l2ZW4gdGhlbWUgYW5kIHR5cGUgb2Ygb3BlcmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHVpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICovCiAgICAgICAgbG9va3VwTm9ybWFsaXplZFZpZXc6IGZ1bmN0aW9uKHVpLCB0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRoZVZpZXdJZCA9IG51bGw7CgogICAgICAgICAgICBmb3IgKHZhciB2aWV3SWQgaW4gdGhpcy5ub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICBpZiAodmlldy51aSA9PT0gdWkgJiYgdmlldy50eXBlID09PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoZVZpZXdJZCA9IHZpZXdJZDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoZVZpZXdJZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVJZCBUZW1wbGF0ZSBpZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHRlbXBsYXRlIEVpdGhlciB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeyAidHlwZSI6ICI8dGVtcGxhdGVFbmdpbmVJZGVudGlmaWVyPiIsICJ0ZW1wbGF0ZSI6ICI8bWFya3VwPiIgfQogICAgICAgICAqIEBwYXJhbSBbU3RyaW5nXSB2aWV3SWQgdGhlIG9wdGlvbmFsIHZpZXcgaWQuICBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGVuIGFsbCByZWdpc3RyYXRpb25zIGFyZSB0byB0aGUgZGVmYXVsdCB2aWV3LgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHNwZWNpZmllZCwgZmFsbCBiYWNrIHRvIHRoZSBiYXNlIHZpZXcgd2hpY2ggaXMgImJhc2UiCiAgICAgICAgICAgIGlmICghdmlld0lkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aWV3SWQgPSAiYmFzZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3c1t2aWV3SWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0gPSB7fTsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5pZCA9IHZpZXdJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW3ZpZXdJZF0udGVtcGxhdGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0gPSB0ZW1wbGF0ZTsKCiAgICAgICAgICAgIC8vIGlmIG5vcm1hbGl6ZWQgdmlld3MgaGF2ZSBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHRoZW4gd2lwZSB0aGVtIGRvd24KICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlbSB0byBiZSByZS1jb21wdXRlZCBvbiB0aGUgbmV4dCByZW5kZXIgYW5kIGFsbG93cyB0aGlzIHRlbXBsYXRlIHRvIHBhcnRpY2lwYXRlCiAgICAgICAgICAgIGlmIChBbHBhY2EuY291bnRQcm9wZXJ0aWVzKEFscGFjYS5ub3JtYWxpemVkVmlld3MpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGxpc3Qgb2YgdGVtcGxhdGVzIHRvIGEgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRlbXBsYXRlcyBUZW1wbGF0ZXMgYmVpbmcgcmVnaXN0ZXJlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgdGVtcGxhdGVzIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJUZW1wbGF0ZXM6IGZ1bmN0aW9uKHRlbXBsYXRlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIHRlbXBsYXRlSWQgaW4gdGVtcGxhdGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVGVtcGxhdGUodGVtcGxhdGVJZCwgdGVtcGxhdGVzW3RlbXBsYXRlSWRdLCB2aWV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgbWVzc2FnZSB0byBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCBJZCBvZiB0aGUgdmlldyB0aGF0IHRoZSBtZXNzYWdlIGJlaW5nIHJlZ2lzdGVyZWQgdG8uCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlSWQsIG1lc3NhZ2UsIHZpZXdJZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIG5vIHZpZXcgc3BlY2lmaWVkLCBmYWxsIGJhY2sgdG8gdGhlIGJhc2UgdmlldyB3aGljaCBpcyAiYmFzZSIKICAgICAgICAgICAgaWYgKCF2aWV3SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpZXdJZCA9ICJiYXNlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXSA9IHt9OwogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLmlkID0gdmlld0lkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy52aWV3c1t2aWV3SWRdLm1lc3NhZ2VzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudmlld3Nbdmlld0lkXS5tZXNzYWdlc1ttZXNzYWdlSWRdID0gbWVzc2FnZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgbWVzc2FnZXMgd2l0aCBhIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyBNZXNzYWdlcyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aWV3SWQgSWQgb2YgdGhlIHZpZXcgdGhhdCB0aGUgbWVzc2FnZXMgYmVpbmcgcmVnaXN0ZXJlZCB0by4KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck1lc3NhZ2VzOiBmdW5jdGlvbihtZXNzYWdlcywgdmlld0lkKSB7CiAgICAgICAgICAgIGZvciAodmFyIG1lc3NhZ2VJZCBpbiBtZXNzYWdlcykgewogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmhhc093blByb3BlcnR5KG1lc3NhZ2VJZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZShtZXNzYWdlSWQsIG1lc3NhZ2VzW21lc3NhZ2VJZF0sIHZpZXdJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZhdWx0IGRhdGUgZm9ybWF0LgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHREYXRlRm9ybWF0OiAiTU0vREQvWVlZWSIsCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgdGltZSBmb3JtYXQuCiAgICAgICAgICovCiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6ICJISDptbTpzcyIsCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGZpZWxkcy4KICAgICAgICAgKi8KICAgICAgICByZWdleHBzOgogICAgICAgIHsKICAgICAgICAgICAgImVtYWlsIjogL15bYS16MC05IVwjXCQlJidcKlwtXC89XD9cK1wtXF5fYFx7XHxcfX5dKyg/OlwuW2EtejAtOSFcI1wkJSYnXCpcLVwvPVw/XCtcLVxeX2Bce1x8XH1+XSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XC4pK1thLXpdezIsNn0kL2ksCiAgICAgICAgICAgICJ1cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKlwuW2Etel17Miw1fShcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJpbnRyYW5ldC11cmwiOiAvXihodHRwfGh0dHBzfGZ0cCk6XC9cL1thLXowLTldKyhbXC1cLl17MX1bYS16MC05XSspKihcOlswLTldezEsNX0pPyhcLy4qKT8kL2ksCiAgICAgICAgICAgICJwYXNzd29yZCI6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC8sCiAgICAgICAgICAgICJkYXRlIjogL14oMFsxLTldfDFbMDEyXSlbLSAvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSAvLl1cZFxkJC8sCiAgICAgICAgICAgICJpbnRlZ2VyIjogL14oW1wrXC1dPyhbMS05XVxkKil8MCkkLywKICAgICAgICAgICAgIm51bWJlciI6L14oW1wrXC1dPygoKFswLTldKyhcLik/KXwoWzAtOV0qXC5bMC05XSspKShbZUVdWystXT9bMC05XSspPykpJC8sCiAgICAgICAgICAgICJwaG9uZSI6L14oXEQ/KFxkezN9KVxEP1xEPyhcZHszfSlcRD8oXGR7NH0pKT8kLywKICAgICAgICAgICAgImlwdjQiOi9eKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSg/OlwuKD86MVxkP1xkP3wyKD86WzAtNF1cZD98WzY3ODldfDVbMC01XT8pP3xbMy05XVxkP3wwKSl7M30kLywKICAgICAgICAgICAgInppcGNvZGUtZml2ZSI6IC9eKFxkezV9KT8kLywKICAgICAgICAgICAgInppcGNvZGUtbmluZSI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLywKICAgICAgICAgICAgIndoaXRlc3BhY2UiOiAvXlxzKyQvCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIGluc3RhbnRpYXRlZCBmaWVsZHMuCiAgICAgICAgICovCiAgICAgICAgZmllbGRJbnN0YW5jZXM6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNYXBzIG9mIGZpZWxkIHR5cGVzIHRvIGZpZWxkIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBmaWVsZENsYXNzUmVnaXN0cnk6IHt9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgdHlwZSBvZiBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEZpZWxkIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuRmllbGR9IGZpZWxkQ2xhc3MgRmllbGQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJGaWVsZENsYXNzOiBmdW5jdGlvbih0eXBlLCBmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdID0gZmllbGRDbGFzczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgRmllbGQgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNsYXNzIG1hcHBlZCB0byBmaWVsZCB0eXBlLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3M6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpZWxkIHR5cGUgaWQgZm9yIGEgZ2l2ZW4gZmllbGQgaW1wbGVtZW50YXRpb24gY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5GaWVsZH0gZmllbGRDbGFzcyBGaWVsZCBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZpZWxkIHR5cGUgb2YgdGhlIGZpZWxkIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkQ2xhc3NUeXBlOiBmdW5jdGlvbihmaWVsZENsYXNzKSB7CiAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5maWVsZENsYXNzUmVnaXN0cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkQ2xhc3NSZWdpc3RyeVt0eXBlXSA9PT0gZmllbGRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFwcyBvZiBjb25uZWN0b3IgdHlwZXMgdG8gY29ubmVjdG9yIGNsYXNzIGltcGxlbWVudGF0aW9ucy4KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0b3JDbGFzc1JlZ2lzdHJ5OiB7fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgY0Nvbm5lY3QgdHlwZQogICAgICAgICAqIEBwYXJhbSB7QWxwYWNhLkNvbm5lY3Rvcn0gY29ubmVjdG9yQ2xhc3MgQ29ubmVjdG9yIGNsYXNzLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQ29ubmVjdG9yQ2xhc3M6IGZ1bmN0aW9uKHR5cGUsIGNvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yQ2xhc3NSZWdpc3RyeVt0eXBlXSA9IGNvbm5lY3RvckNsYXNzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGNvbm5lY3RvciB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQ29ubmVjdCB0eXBlLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuQ29ubmVjdG9yfSBDb25uZWN0b3IgY2xhc3MgbWFwcGVkIHRvIGNvbm5lY3QgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0b3JDbGFzczogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JDbGFzc1JlZ2lzdHJ5W3R5cGVdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGVhY2ggc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU291cmNlIHN0cmluZyBiZWluZyByZXBsYWNlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVwbGFjZSBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJlcGxhY2luZy4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gd2l0aF90aGlzIFJlcGxhY2VtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VBbGw6IGZ1bmN0aW9uKHRleHQsIHJlcGxhY2UsIHdpdGhfdGhpcykgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZSwgJ2cnKSwgd2l0aF90aGlzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lLCBkb20vc3R5bGUgYXR0cmlidXRlcyBhbmQgY2xhc3MgbmFtZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIFRhZyBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGRvbUF0dHJpYnV0ZXMgRE9NIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGVBdHRyaWJ1dGVzIFN0eWxlIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NOYW1lcyBDbGFzcyBuYW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBlbGVtZW50IHdpdGggdGhlIHRhZyBuYW1lIGFuZCBhbGwgb3RoZXIgcHJvdmlkZWQgYXR0cmlidXRlcy4KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50OiBmdW5jdGlvbih0YWcsIGRvbUF0dHJpYnV0ZXMsIHN0eWxlQXR0cmlidXRlcywgY2xhc3NOYW1lcykgewogICAgICAgICAgICB2YXIgZWwgPSAkKCI8IiArIHRhZyArICIvPiIpOwoKICAgICAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIGVsLmF0dHIoZG9tQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0eWxlQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgZWwuY3NzKHN0eWxlQXR0cmlidXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2VzIGEgdGVtcGxhdGUgd2l0aCBsaXN0IG9mIHJlcGxhY2VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBUZW1wbGF0ZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnN0aXR1dGlvbnMgTGlzdCBvZiBzdWJzdGl0dXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmVwbGFjZWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEZyb21UZW1wbGF0ZTogZnVuY3Rpb24odGVtcGxhdGUsIHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGlvbnMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gc3Vic3RpdHV0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSBBbHBhY2EucmVwbGFjZUFsbChodG1sLCAiJHsiICsgeCArICJ9Iiwgc3Vic3RpdHV0aW9uc1t4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQoaHRtbCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGFscGFjYSBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB1bmlxdWUgYWxwYWNhIGlkLgogICAgICAgICAqLwogICAgICAgIGdlbmVyYXRlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBbHBhY2EudW5pcXVlSWRDb3VudGVyKys7CiAgICAgICAgICAgIHJldHVybiAiYWxwYWNhIiArIEFscGFjYS51bmlxdWVJZENvdW50ZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb3ZpZGUgWUFIT08gbGF0ZXIgbGlrZSBjYXBhYmlsaXRpZXMuCiAgICAgICAgICovCiAgICAgICAgbGF0ZXI6IGZ1bmN0aW9uKHdoZW4sIG8sIGZuLCBkYXRhLCBwZXJpb2RpYykgewogICAgICAgICAgICB3aGVuID0gd2hlbiB8fCAwOwogICAgICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICAgICAgdmFyIG0gPSBmbiwgZCA9ICQubWFrZUFycmF5KGRhdGEpLCBmLCByOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIG0gPSBvW2ZuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBhYm91dCB0aGUgbWV0aG9kCiAgICAgICAgICAgICAgICB0aHJvdyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlRoZSBmdW5jdGlvbiBpcyB1bmRlZmluZWQuIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBpZ25vcmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG0uYXBwbHkobywgZCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByID0gKHBlcmlvZGljKSA/IHNldEludGVydmFsKGYsIHdoZW4pIDogc2V0VGltZW91dChmLCB3aGVuKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgIGludGVydmFsOiBwZXJpb2RpYywKICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBlbmRzIHdpdGggYSBnaXZlbiBzdWZmaXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIGJlaW5nIGV2YWx1YXRlZC4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4IFN1ZmZpeC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZW5kc1dpdGggOiBmdW5jdGlvbih0ZXh0LCBzdWZmaXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuaW5kZXhPZihzdWZmaXgsIHRleHQubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGFuIHN0cmluZyBzdGFydHMgd2l0aCBhIGdpdmVuIHByZWZpeC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBzdHJpbmcgYmVpbmcgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXggUHJlZml4CiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhcnRzV2l0aCA6IGZ1bmN0aW9uKHRleHQsIHByZWZpeCkgewogICAgICAgICAgICAvL3JldHVybiAodGV4dC5tYXRjaCgiXiIgKyBwcmVmaXgpID09IHByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIGEgdmFyaWFibGUgaXMgYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSB2YXJpYWJsZSBiZWluZyBldmFsdWF0ZWQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgVVJJLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaXNVcmkgOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc1N0cmluZyhvYmopICYmIChBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwOi8vIikgfHwKICAgICAgICAgICAgICAgICAgICBBbHBhY2Euc3RhcnRzV2l0aChvYmosICJodHRwczovLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLyIpIHx8CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnN0YXJ0c1dpdGgob2JqLCAiLi8iKSB8fAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5zdGFydHNXaXRoKG9iaiwgIi4uLyIpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQaWNrcyBhIHN1Yi1lbGVtZW50IGZyb20gYW4gb2JqZWN0IHVzaW5nIGEga2V5cyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIHRyYXZlcnNlZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBrZXlzIEVpdGhlciBhbiBhcnJheSBvZiB0b2tlbnMgb3IgYSBkb3QtZGVsaW1pdGVkIHN0cmluZyAoaS5lLiAiZGF0YS51c2VyLmZpcnN0bmFtZSIpCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YnByb3AgT3B0aW9uYWwgc3VicHJvcGVydHkgdG8gdHJhdmVyc2UgKGkuZS4uICJkYXRhLnByb3BlcnRpZXMudXNlci5wcm9wZXJ0aWVzLmZpcnN0bmFtZSIpCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdWIgZWxlbWVudCBtYXBwZWQgdG8gdGhlIGdpdmVuIGtleSBwYXRoCiAgICAgICAgICovCiAgICAgICAgdHJhdmVyc2VPYmplY3QgOiBmdW5jdGlvbihvYmplY3QsIGtleXMsIHN1YnByb3ApIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhrZXlzKSkgewogICAgICAgICAgICAgICAga2V5cyA9IGtleXMuc3BsaXQoIi4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB2YXIgY3VycmVudCA9IG9iamVjdDsKCiAgICAgICAgICAgIHZhciBrZXkgPSBudWxsOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3VicHJvcCAmJiBrZXkgPT09IHN1YnByb3ApIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGN1cnJlbnRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGtleXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGggPiAwKTsKCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB1cG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKICAgICAgICAgKiBUaGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgYmVjb21lcyB0aGUgInRoaXMiIHZhcmlhYmxlIGluIHRoZSBmdW5jdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGRhdGEgRWl0aGVyIGFuIGFycmF5IG9yIGFuIG9iamVjdAogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICovCiAgICAgICAgZWFjaCA6IGZ1bmN0aW9uKGRhdGEsIGZ1bmMpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKEFscGFjYS5pc09iamVjdChkYXRhKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGRhdGFba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMganNvbiBvYmoyIGludG8gb2JqMSB1c2luZyBhIHJlY3Vyc2l2ZSBhcHByb2FjaC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIERlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMiBTb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkS2V5RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIGEgZ2l2ZW4ga2V5IG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgbWVyZ2UgOiBmdW5jdGlvbihvYmoxLCBvYmoyLCB2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGlmICghb2JqMSkgewogICAgICAgICAgICAgICAgb2JqMSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmoyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh2YWxpZEtleUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZEtleUZ1bmN0aW9uKGtleSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG9iajJba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3Qob2JqMltrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmoxW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IEFscGFjYS5tZXJnZShvYmoxW2tleV0sIG9iajJba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvYmoxOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1lcmdlcyBqc29uICJzb3VyY2UiIGludG8gInRhcmdldCIgdXNpbmcgYSByZWN1cnNpdmUgYXBwcm9hY2guIFRoZSBtZXJnZSB3aWxsIGluY2x1ZGUgZW1wdHkgdmFsdWVzCiAgICAgICAgICogb2Ygb2JqMiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1lcmdlZCBvYmplY3QKICAgICAgICAgKi8KICAgICAgICBtZXJnZU9iamVjdCA6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5tZXJnZU9iamVjdDIoc291cmNlLCB0YXJnZXQpOwoKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9LAoKICAgICAgICBtZXJnZU9iamVjdDI6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSBBbHBhY2EuaXNBcnJheTsKICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gQWxwYWNhLmlzT2JqZWN0OwogICAgICAgICAgICB2YXIgaXNVbmRlZmluZWQgPSBBbHBhY2EuaXNVbmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBjb3B5T2YgPSBBbHBhY2EuY29weU9mOwoKICAgICAgICAgICAgdmFyIF9tZXJnZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhcnJheSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weU9mKHNvdXJjZVtpbmRleF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgdGhhdCBpc24ndCBhbiBBUlJBWQogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIG9iamVjdCBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKGtleSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvcHlPZihzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gX21lcmdlKHNvdXJjZVtrZXldLCB0YXJnZXRba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCB0aGF0IGlzbid0IGFuIE9CSkVDVAogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0J3MgYSBzY2FsYXIsIGFsd2F5cyBvdmVyd3JpdGUKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb3B5T2Yoc291cmNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgX21lcmdlKHNvdXJjZSwgdGFyZ2V0KTsKCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3Vic3RpdHV0ZXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgdG9rZW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQgU291cmNlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gYXJncyBMaXN0IG9mIHRva2Vucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIFN1YnN0aXR1dGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBzdWJzdGl0dXRlVG9rZW5zIDogZnVuY3Rpb24odGV4dCwgYXJncykgewoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gInsiICsgaSArICJ9IjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB0ZXh0LmluZGV4T2YodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gdGV4dC5zdWJzdHJpbmcoMCwgeCkgKyBhcmdzW2ldICsgdGV4dC5zdWJzdHJpbmcoeCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGV4dCA9IEFscGFjYS5yZXBsYWNlQWxsKHRleHQsIHRva2VuLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGFyZXMgdHdvIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqMSBGaXJzdCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iajIgU2Vjb25kIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHR3byBvYmplY3RzIGFyZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZU9iamVjdCA6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHsKICAgICAgICAgICAgcmV0dXJuIGVxdWl2KG9iajEsIG9iajIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIGNvbnRlbnQgb2YgdHdvIGFycmF5cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8xIEZpcnN0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycl8yIFNlY29uZCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0d28gYXJyYXlzIGhhdmUgc2FtZSBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZUFycmF5Q29udGVudCA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGVxdWFsID0gYSAmJiBiICYmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpOwoKICAgICAgICAgICAgaWYgKGVxdWFsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KHYsIGIpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZXF1YWw7CiAgICAgICAgfSwKCiAgICAgICAgdGVzdFJlZ2V4OiBmdW5jdGlvbihleHByZXNzaW9uLCB0ZXh0VmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKGV4cHJlc3Npb24pOwoKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dFZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyB3aGV0aGVyIGEgdmFyaWFibGUgaGFzIGVtcHR5IHZhbHVlIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWwgVmFyaWFibGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAqIEBwYXJhbSBbYm9vbGVhbl0gaW5jbHVkZUZ1bmN0aW9ucyB3aGV0aGVyIHRvIGluY2x1ZGUgZnVuY3Rpb24gaW4gYW55IGNvdW50cwogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZhcmlhYmxlIGhhcyBlbXB0eSB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzVmFsRW1wdHkgOiBmdW5jdGlvbih2YWwsIGluY2x1ZGVGdW5jdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwsIGluY2x1ZGVGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbCkgJiYgdmFsID09PSAiIikgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodmFsKSAmJiAkLmlzRW1wdHlPYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1wdHk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBmaWVsZCBpbnN0YW5jZSBhbmQgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgQ29udGFpbmVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgRmllbGQgZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBGaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgRmllbGQgc2NoZW1hLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmlldyBGaWVsZCB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsU2V0dGluZ3MgYW55IGFkZGl0aW9uYWwgc2V0dGluZ3MgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBBbHBhY2Egb2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUmVuZGVyIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmVkQ2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QWxwYWNhLkZpZWxkfSBOZXcgZmllbGQgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgaW5pdDogZnVuY3Rpb24oZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBpZiB0aGV5IHByb3ZpZGVkIGFuIGlubGluZSB2aWV3IG9iamVjdCwgd2UgYXNzaWduIGFuIGlkIGFuZCBzdG9yZSBvbnRvIHZpZXdzIG1hcAogICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgY29tcGlsZWQgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHZpZXcpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlld0lkID0gdmlldy5pZDsKICAgICAgICAgICAgICAgIGlmICghdmlld0lkKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5pZCA9IHRoaXMuZ2VuZXJhdGVWaWV3SWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IHZpZXcucGFyZW50OwogICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3LnBhcmVudCA9ICJib290c3RyYXAtZWRpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyh2aWV3KTsKICAgICAgICAgICAgICAgIHZpZXcgPSB2aWV3LmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb21waWxlIGFsbCBvZiB0aGUgdmlld3MgYW5kIHRlbXBsYXRlcwogICAgICAgICAgICB0aGlzLmNvbXBpbGUoY29ubmVjdG9yLCBmdW5jdGlvbihyZXBvcnQpIHsKCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmVycm9ycyAmJiByZXBvcnQuZXJyb3JzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0LmVycm9ycy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3SWQgPSByZXBvcnQuZXJyb3JzW2ldLnZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHJlcG9ydC5lcnJvcnNbaV0uY2FjaGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcG9ydC5lcnJvcnNbaV0uZXJyOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAiVGhlIHRlbXBsYXRlIHdpdGggY2FjaGUga2V5OiAiICsgY2FjaGVLZXkgKyAiIGZvciB2aWV3OiAiICsgdmlld0lkICsgIiBmYWlsZWQgdG8gY29tcGlsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgbWVzc2FnZTogIiArIGVyci5tZXNzYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goZXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiwgZXJyOiAiICsgSlNPTi5zdHJpbmdpZnkoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IodGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5ub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYudmlld3Nbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVmlldyBjb21waWxhdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIiArIG1lc3NhZ2VzLmpvaW4oIiwgIiksIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXQoZWwsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgaW5pdGlhbFNldHRpbmdzLCBjYWxsYmFjaywgcmVuZGVyZWRDYWxsYmFjaywgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXQ6IGZ1bmN0aW9uKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGluaXRpYWxTZXR0aW5ncywgY2FsbGJhY2ssIHJlbmRlcmVkQ2FsbGJhY2ssIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBWSUVXIFJFU09MVVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgLy8gbWFrZSBzb21lIGludGVsbGlnZW50IGd1ZXNzZXMgYWJvdXQgd2hhdCB2aWV3IGlkIHdlIG1pZ2h0IGRlZmF1bHQgdG8gaW4gY2FzZSB0aGV5IHdhbnQgdG8gdXNlCiAgICAgICAgICAgIC8vIGF1dG8tdmlldyBzZWxlY3Rpb24uICBXZSBkZXRlY3QganF1ZXJ5LXVpLCBib290c3RyYXAgYW5kIGpxdWVyeW1vYmlsZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRldGVjdGVkLAogICAgICAgICAgICAvLyB3ZSBmYWxsIGJhY2sgdG8gc3RyYWlnaHQgd2ViIHZpZXdzLgogICAgICAgICAgICB2YXIgZmFsbGJhY2tVSSAgID0gQWxwYWNhLmRlZmF1bHRWaWV3IHx8IG51bGw7CiAgICAgICAgICAgIHZhciBmYWxsYmFja1R5cGUgPSBudWxsOwoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpRdWVyeSBNb2JpbGUKICAgICAgICAgICAgaWYgKCQubW9iaWxlICYmICFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja1VJID0gImpxdWVyeW1vYmlsZSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVjdCB0d2l0dGVyIGJvb3RzdHJhcAogICAgICAgICAgICB2YXIgYm9vdHN0cmFwRGV0ZWN0ZWQgPSAodHlwZW9mICQuZm4ubW9kYWwgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoYm9vdHN0cmFwRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAiYm9vdHN0cmFwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGV0ZWN0IGpxdWVyeSB1aQogICAgICAgICAgICB2YXIgalF1ZXJ5VUlEZXRlY3RlZCA9ICh0eXBlb2YoJC51aSkgIT09ICJ1bmRlZmluZWQiKTsKICAgICAgICAgICAgaWYgKGpRdWVyeVVJRGV0ZWN0ZWQgJiYgIWZhbGxiYWNrVUkpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSAianF1ZXJ5dWkiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1R5cGUgPSAiZWRpdCI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVHlwZSA9ICJjcmVhdGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBubyB2aWV3IHByb3ZpZGVkLCBidXQgdGhleSBwcm92aWRlZCAidWkiIGFuZCBvcHRpb25hbGx5ICJ0eXBlIiwgdGhlbiB3ZSB0cnkgdG8gYXV0by1zZWxlY3QgdGhlIHZpZXcKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdWkgPSBpbml0aWFsU2V0dGluZ3MudWk7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGluaXRpYWxTZXR0aW5ncy50eXBlOwoKICAgICAgICAgICAgICAgIGlmICghdWkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsYmFja1VJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVUkgPSBBbHBhY2EuZGVmYXVsdFVJOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tVSSkgewogICAgICAgICAgICAgICAgICAgICAgICB1aSA9IGZhbGxiYWNrVUk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmFsbGJhY2tUeXBlID8gZmFsbGJhY2tUeXBlIDogImVkaXQiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJObyB2aWV3IHByb3ZpZGVkIGJ1dCBmb3VuZCByZXF1ZXN0IGZvciBVSTogIiArIHVpICsgIiBhbmQgdHlwZTogIiArIHR5cGUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGF1dG8tc2VsZWN0IGEgdmlldwogICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvb2t1cE5vcm1hbGl6ZWRWaWV3KHVpLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmlldykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZvdW5kIHZpZXc6ICIgKyB2aWV3KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIk5vIHZpZXcgZm91bmQgZm9yIFVJOiAiICsgdWkgKyAiIGFuZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IHZpZXcgaXMgYSBzdHJpbmcgKHRoZSB2aWV3IGlkKSBvciBpdCBpcyBlbXB0eS9udWxsCgogICAgICAgICAgICAvLyBpZiBzdGlsbCBubyB2aWV3LCB0aGVuIGRlZmF1bHQgZmFsbGJhY2sgdG8gb3VyIGRldGVjdGVkIHZpZXcgb3IgdGhlIGRlZmF1bHQKICAgICAgICAgICAgaWYgKCF2aWV3KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkEgdmlldyB3YXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2luZzogaWYgdGhlIHZpZXcgaXNuJ3QgYXZhaWxhYmxlLCB3ZSB3YW50IHRvIHJlcG9ydCBpdCByaWdodCBhd2F5CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZpZXcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub3JtYWxpemVkVmlld3Nbdmlld10pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlRoZSBkZXNpcmVkIHZpZXc6ICIgKyB2aWV3ICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBsb2FkZWQgYW5kIG5vdCBtaXNzcGVsbGVkLiIsIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gRklFTEQgSU5TVEFOVElBVElPTgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgIC8vIHN3YXAgZWwgLT4gcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgIC8vdmFyIHRlbXBIb2xkZXIgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgLy8kKGVsKS5iZWZvcmUodGVtcEhvbGRlcik7CiAgICAgICAgICAgICAgICAvLyQoZWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEFscGFjYS5jcmVhdGVGaWVsZEluc3RhbmNlKGVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXcsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWVsZCB3aGlsZSByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICQoZWwpLmFkZENsYXNzKCJhbHBhY2EtaGlkZGVuIik7CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEluc3RhbmNlc1tmaWVsZC5nZXRJZCgpXSA9IGZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIGxvb2tpbmcgdXAgZmllbGQgaW5zdGFuY2VzIGJ5IGlkCiAgICAgICAgICAgICAgICAgICAgZmllbGQuYWxsRmllbGRJbnN0YW5jZXMgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmZpZWxkSW5zdGFuY2VzOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGNhbGxiYWNrcyBkZWZpbmVkIHRocm91Z2ggdmlldwogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmaWVsZC52aWV3LnJlbmRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHJlbmRlcmVkQ2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2sgPSBmaWVsZC52aWV3LnBvc3RSZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgZmluID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgYXBwbHkgc29tZSBhZGRpdGlvbmFsIENTUyBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS0iICsgc2VsZi5nZXROb3JtYWxpemVkVmlldyh2aWV3KS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGFscGFjYSBmaWVsZCwgd2UgbWFyayBhcyB0b3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5wYXJlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZpZWxkRWwoKS5hZGRDbGFzcygiYWxwYWNhLXRvcCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgYWxwYWNhIGZpZWxkLCB0aGVuIHdlIGNhbGwgZm9yIHZhbGlkYXRpb24gc3RhdGUgdG8gYmUgcmVjYWxjdWxhdGVkIGFjcm9zcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY2hpbGQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBjYWxsIHRvIHVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIHN1c3BlbmQgaW5pdGlhbCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIHRvIGZhbHNlIGZvciBmaWVsZCBhbmQgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudmlldy50eXBlICE9PSAndmlldycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuKGZpZWxkLCBmdW5jdGlvbihmaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGFmdGVyIGZpcnN0IHZhbGlkYXRpb24gKGV2ZW4gaWYgaW4gQ1JFQVRFIG1vZGUsIHdlIG9ubHkgZm9yY2UgaW5pdCB2YWxpZGF0aW9uIGVycm9yIGZhbHNlIG9uIGZpcnN0IHJlbmRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRFU1QgLSBzd2FwIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCBwbGFjZWhvbGRlciAtPiBlbAogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGVtcEhvbGRlcikuYmVmb3JlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8kKHRlbXBIb2xkZXIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZWFsIGZpZWxkIGFmdGVyIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLXJlbmRlcmluZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWhpZGRlbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmllbGQgdGhhdCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCBkbyBzbyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9vbGRGaWVsZEVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpZWxkLl9vbGRGaWVsZEVsKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkQ2FsbGJhY2soZmllbGQpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZpZWxkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZW5kZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmaWVsZC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlbmRlcmVkQ2FsbGJhY2sgPSByZW5kZXJlZENhbGxiYWNrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIHdhcyB0aHJvd24gb3IgaWYgYSB2aWV3IHdhc24ndCBmb3VuZAogICAgICAgICAgICAvLyBBY3R1YWxseSBpdCdkIGFsd2F5cyBiZSB1bmRlZmluZWQgYmVjYXVzZSBmaWVsZCBpcyBpbiBhbm90aGVyIHNjb3BlLgogICAgICAgICAgICAvLyByZXR1cm4gZmllbGQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBmaWVsZCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbCBUaGUgZG9tIGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBjb250YWluZXIgb2YgdGhlIGNvbnN0cnVjdGVkIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGJlIGJvdW5kIGludG8gdGhlIGZpZWxkLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFRoZSB2aWV3IGZvciB0aGUgZmllbGQuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuY29ubmVjdG9yfSBjb25uZWN0b3IgVGhlIGZpZWxkIGNvbm5lY3RvciB0byBiZSBib3VuZCBpbnRvIHRoZSBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIEVycm9yIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FscGFjYS5GaWVsZH0gTmV3IGZpZWxkIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUZpZWxkSW5zdGFuY2UgOiBmdW5jdGlvbihlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKCiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcHRpb25zIGFuZCBzY2hlbWEgYXJlIG5vdCBlbXB0eQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkoc2NoZW1hLCB0cnVlKSkgewogICAgICAgICAgICAgICAgc2NoZW1hID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9wdGlvbnMgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBmaWVsZCB0byBjb25zdHJ1Y3QgKGkuZS4gInRleHQiKQogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBBbHBhY2EuaXNTdHJpbmcob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gZmllbGRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIHBhc3NlZCBpbiwgd2UgY2FuIHRyeSB0byBtYWtlIGEgZ3Vlc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgZGF0YQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudHlwZSkgewogICAgICAgICAgICAgICAgICAgIHNjaGVtYS50eXBlID0gQWxwYWNhLmdldFNjaGVtYVR5cGUoZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgQWxwYWNhLmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLnR5cGUgPSAib2JqZWN0IjsgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdXNpbmcgd2hhdCB3ZSBub3cgYWJvdXQgc2NoZW1hLCB0cnkgdG8gZ3Vlc3MgdGhlIHR5cGUKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IEFscGFjYS5ndWVzc09wdGlvbnNUeXBlKHNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmluZCB0aGUgZmllbGQgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBmaWVsZCB0eXBlCiAgICAgICAgICAgIHZhciBGaWVsZENsYXNzID0gQWxwYWNhLmdldEZpZWxkQ2xhc3Mob3B0aW9ucy50eXBlKTsKICAgICAgICAgICAgaWYgKCFGaWVsZENsYXNzKSB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IlVuYWJsZSB0byBmaW5kIGZpZWxkIGNsYXNzIGZvciB0eXBlOiAiICsgb3B0aW9ucy50eXBlLAogICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiAiRklFTERfSU5TVEFOVElBVElPTl9FUlJPUiIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBkYXRhLCBiaW5kIGl0IGluCiAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDbGFzcyhlbCwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiB0aGUgZm9ybWVyIGpRdWVyeSAxLjguMyBwYXJzZUpTT04gZnVuY3Rpb24gKHRoaXMgd2FzIGNoYW5nZWQKICAgICAgICAgKiBmb3IgalF1ZXJ5IDEuOS4wIGFuZCBpbnRyb2R1Y2VzIGFsbCBraW5kcyBvZiBpc3N1ZXMpLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRleHQKICAgICAgICAgKi8KICAgICAgICBwYXJzZUpTT046IGZ1bmN0aW9uKHRleHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5wYXJzZUpTT04odGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgYWxsIG9mIHRoZSB2aWV3cywgbm9ybWFsaXppbmcgdGhlbSBmb3IgdXNlIGJ5IEFscGFjYS4KICAgICAgICAgKiBBbHNvIGNvbXBpbGVzIGFueSB0ZW1wbGF0ZXMgdGhhdCB0aGUgdmlld3MgbWF5IHJlZmVyZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IgdGhlIGNvbm5lY3RvcgogICAgICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdGhhdCBnZXRzIGZpcmVkIG9uY2UgY29tcGlsYXRpb24gaGFzIGVuZGVkCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgZmlyZWQgaWYgdGhlIGNvbXBpbGUgZmFpbHMgZm9yIGFueSByZWFzb24KICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjb25uZWN0b3IsIGNiLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gdmFyIHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICB2YXIgcmVwb3J0ID0gewogICAgICAgICAgICAgICAgImVycm9ycyI6IFtdLAogICAgICAgICAgICAgICAgImNvdW50IjogMCwKICAgICAgICAgICAgICAgICJzdWNjZXNzQ291bnQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFyIHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQ29tcGlsYXRpb24gRXhpdGVkIHdpdGggIiArIHJlcG9ydC5lcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgaW46ICIgKyAodDItdDEpKyAiIG1zIik7CgogICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MhCgogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3VyIHZpZXdzIGludG8gdGhlIG5vcm1hbGl6ZWQgc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRWaWV3c1trXSA9IG5vcm1hbGl6ZWRWaWV3c1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2IocmVwb3J0KTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFZJRVcgVEVNUExBVEUgQ09NUElMQVRJT04KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAvLyBmb3IgYWxsIG9mIHRoZSB2aWV3cyAodGhlIG9yaWdpbmFsIG9uZXMsIG5vdCB0aGUgY29tcGlsZWQgb25lcyksIHdhbGsgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFueQogICAgICAgICAgICAvLyBhbmQgYWxsIHRlbXBsYXRlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQsIGNvbXBpbGUgdGhlbSwgZXRjLgoKICAgICAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIGEgY29tcGlsYXRpb24gZWl0aGVyIGZhaWxzIG9yIHN1Y2NlZWRzCiAgICAgICAgICAgIC8vIGlmIGl0IGZhaWxzLCBlcnIgaXMgc2V0LCBvdGhlcndpc2UgY2FjaGVLZXkgaGFzIHRoZQogICAgICAgICAgICB2YXIgdmlld0NvbXBpbGVDYWxsYmFjayA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgZXJyLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZpZXdJZCA9IHZpZXcuaWQ7CgogICAgICAgICAgICAgICAgcmVwb3J0LmNvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5lcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogdmlld0lkLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGVLZXkiOiBjYWNoZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgImVyciI6IGVycgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5zdWNjZXNzQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocmVwb3J0LmNvdW50ID09IHRvdGFsQ2FsbHMpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjb21waWxlVmlld1RlbXBsYXRlID0gZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCk7CgogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGhhbmRsZWJhcnMgYXMgdGhlIGVuZ2luZSB3ZSdsbCB1c2UKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gInRleHQveC1oYW5kbGViYXJzLXRlbXBsYXRlIjsKCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIG9iamVjdCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgdHlwZSBvZiBlbmdpbmUgdG8gdXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgQWxwYWNhLmlzT2JqZWN0KHRlbXBsYXRlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVUeXBlID0gdGVtcGxhdGUudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHByZWNvbXBpbGVkIHRlbXBsYXRlLCBzd2FwIGNhY2hlIGtleXMKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2FjaGVLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSB0ZW1wbGF0ZS5jYWNoZUtleTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBJZiB0ZW1wbGF0ZSBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBlaXRoZXIgc29tZSB0ZXh0IHRoYXQgd2UgY2FuIHRyZWF0IGFzIGEgdGVtcGxhdGUgb3IgaXQgaXMKICAgICAgICAgICAgICAgICAqIGEgVVJMIHRoYXQgd2Ugc2hvdWxkIGR5bmFtaWNhbGx5IGxvYWQgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMgYSB0ZW1wbGF0ZS4gIEl0IG1heSBhbHNvIGJlIGEKICAgICAgICAgICAgICAgICAqIENTUyBzZWxlY3RvciB1c2VkIHRvIGxvY2F0ZSBzb21ldGhpbmcgd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IHdlIHNob3VsZCBsb2FkIHRleHQgZnJvbS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlICYmIHR5cGVvZih0ZW1wbGF0ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gdGVtcGxhdGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzVXJpKHgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoaXMgaXMgYSBVUkwgYW5kIGxldCB0aGUgdGVtcGxhdGUgZW5naW5lIGRlYWwgd2l0aCBpdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSAmJiAoKHRlbXBsYXRlLmluZGV4T2YoIiMiKSA9PT0gMCkgfHwgKHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgalF1ZXJ5IHNlbGVjdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKHRlbXBsYXRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZVR5cGUgPSAkKGRvbUVsKS5hdHRyKCJ0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gJChkb21FbCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGFuIGV4aXN0aW5nIHRlbXBsYXRlIHJlZmVyZW5jZWQgYnkgdGVtcGxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUZW1wbGF0ZSA9IHZpZXcudGVtcGxhdGVzW3RlbXBsYXRlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gZXhpc3RpbmdUZW1wbGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGFuIGVuZ2luZSB0eXBlIGhlcmUsIHRocm93CiAgICAgICAgICAgICAgICBpZiAoIWVuZ2luZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJFbmdpbmUgdHlwZSB3YXMgZW1wdHkiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRW5naW5lIHR5cGUgd2FzIGVtcHR5Iik7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbG9vayB1cCB0aGUgZW5naW5lCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuZmluZChlbmdpbmVUeXBlKTsKICAgICAgICAgICAgICAgIGlmICghZW5naW5lKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgdHlwZSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHRlbXBsYXRlIGVuZ2luZSBmb3IgdHlwZTogIiArIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBlcnIsIHZpZXcsIGNhY2hlS2V5LCB0b3RhbENhbGxzKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRlbXBsYXRlID09PSB0cnVlLCB0aGVuIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBsYXRlIGlzIHByZS1jb21waWxlZC4KICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKGNhY2hlS2V5KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBnb29kCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWggb2gsIGNsYWltcyB0byBiZSBwcmVjb21waWxlZCwgYnV0IHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0cmluZyA9ICJWaWV3IGNvbmZpZ3VyYXRpb24gZm9yIHZpZXc6ICIgKyB2aWV3LmlkICsgIiBjbGFpbXMgdG8gaGF2ZSBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY2FjaGVLZXk6ICIgKyBjYWNoZUtleSArICIgYnV0IGl0IGNvdWxkIG5vdCBiZSBmb3VuZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihlcnJTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIG5ldyBFcnJvcihlcnJTdHJpbmcpLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVuZ2luZSBhbHJlYWR5IGhhcyB0aGlzIGNhY2hlZAogICAgICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gc3RlcAogICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc0NhY2hlZChjYWNoZUtleSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb21waWxlZCwgc28gc2tpcAogICAgICAgICAgICAgICAgICAgIHZpZXdDb21waWxlQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzLCBudWxsLCB2aWV3LCBjYWNoZUtleSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBlbmdpbmUuY29tcGlsZShjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbXBpbGVDYWxsYmFjayhub3JtYWxpemVkVmlld3MsIGVyciwgdmlldywgY2FjaGVLZXksIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29tcGlsZVRlbXBsYXRlcyA9IGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBub3JtYWxpemVkIHZpZXdzIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbiBhbmQgY29tcGlsZSB0aGUgdGVtcGxhdGVzIHdpdGhpbgogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBub3JtYWxpemVkVmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBub3JtYWxpemVkVmlld3Nbdmlld0lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdmlldyB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXcudGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxldmVsIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGggaW4gdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdGVtcGxhdGVJZCBpbiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFycmF5LnB1c2goKGZ1bmN0aW9uKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRvdGFsQ2FsbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVmlld1RlbXBsYXRlKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgc2NvcGVUeXBlLCBzY29wZUlkLCB0ZW1wbGF0ZUlkLCB0ZW1wbGF0ZSwgdG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShub3JtYWxpemVkVmlld3MsIHZpZXcsICJmaWVsZCIsIHBhdGgsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgdGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5sYXlvdXQgJiYgdmlldy5sYXlvdXQudGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3LmxheW91dC50ZW1wbGF0ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXkucHVzaCgoZnVuY3Rpb24obm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odG90YWxDYWxscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVWaWV3VGVtcGxhdGUobm9ybWFsaXplZFZpZXdzLCB2aWV3LCBzY29wZVR5cGUsIHNjb3BlSWQsIHRlbXBsYXRlSWQsIHRlbXBsYXRlLCB0b3RhbENhbGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG5vcm1hbGl6ZWRWaWV3cywgdmlldywgImxheW91dCIsICJsYXlvdXQiLCAibGF5b3V0VGVtcGxhdGUiLCB0ZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2xvYmFsVGVtcGxhdGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3Lmdsb2JhbFRlbXBsYXRlOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcnJheS5wdXNoKChmdW5jdGlvbihub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0b3RhbENhbGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVZpZXdUZW1wbGF0ZShub3JtYWxpemVkVmlld3MsIHZpZXcsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCwgdGVtcGxhdGUsIHRvdGFsQ2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobm9ybWFsaXplZFZpZXdzLCB2aWV3LCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIsIHRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBpbnZva2UgYWxsIG9mIHRoZSBmdW5jdGlvbnMKICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVsbHMgZWFjaCB0ZW1wbGF0ZSB0byBjb21waWxlCiAgICAgICAgICAgICAgICB2YXIgdG90YWxDYWxscyA9IGZ1bmN0aW9uQXJyYXkubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbkFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJyYXlbaV0odG90YWxDYWxscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbm9ybWFsaXplVmlld3MgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3cyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3Q291bnQgPSAwOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgaW5pdGlhbCBzZWxmLWFzc3VyYW5jZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbm9ybWFsaXplZFZpZXdzIG1hcCBzZXQgdXAKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLm5vcm1hbGl6ZWRWaWV3cykgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5ub3JtYWxpemVkVmlld3MgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYubm9ybWFsaXplZFZpZXdzID0gQWxwYWNhLm5vcm1hbGl6ZWRWaWV3czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIG91ciB2aWV3cwogICAgICAgICAgICAgICAgZm9yICh2YXIgdmlld0lkIGluIHNlbGYudmlld3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBub3JtYWxpemVkIG9uIHRoZSBBbHBhY2EgZ2xvYmFsLCB3ZSBkbyBub3QgYm90aGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2Eubm9ybWFsaXplZFZpZXdzW3ZpZXdJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFZpZXcgPSBuZXcgQWxwYWNhLk5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmlldy5ub3JtYWxpemUoc2VsZi52aWV3cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWaWV3c1t2aWV3SWRdID0gbm9ybWFsaXplZFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmlld0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlZpZXcgbm9ybWFsaXphdGlvbiBmYWlsZWQsIGNhbm5vdCBpbml0aWFsaXplIEFscGFjYS4gIFBsZWFzZSBjaGVjayB0aGUgZXJyb3IgbG9ncy4iLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZpZXdDb3VudCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGlsZVRlbXBsYXRlcyhub3JtYWxpemVkVmlld3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpbmFsQ2FsbGJhY2sobm9ybWFsaXplZFZpZXdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5vcm1hbGl6ZVZpZXdzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9va3MgdXAgdGhlIHByb3BlciB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBhIHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZCBmb3IgYSB2aWV3IGFuZCBhIGZpZWxkLgogICAgICAgICAqIFBlcmZvcm1zIGFuIG92ZXJyaWRlIGxvb2t1cCB0byBmaW5kIHRoZSBwcm9wZXIgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBIYW5kcyBiYWNrIGEgZGVzY3JpcHRvciBvZiBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHJlc29sdmVkIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHZpZXcKICAgICAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZAogICAgICAgICAqIEBwYXJhbSBmaWVsZAogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHZpZXcsIHRlbXBsYXRlSWQsIGZpZWxkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBudWxsOwoKICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRklHVVJFIE9VVCBXSEVSRSBUSEUgVEVNUExBVEUgSVMgSU4gVEhFIFZJRVcgQ09ORklHVVJBVElPTiAoUkVTUEVDVElORyBGSUVMRCBPVkVSUklERVMpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICB2YXIgX2VuZ2luZUlkID0gbnVsbDsKICAgICAgICAgICAgdmFyIF9jYWNoZUtleSA9IG51bGw7CgogICAgICAgICAgICAvLyBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIHZpZXcgbGV2ZWw/CiAgICAgICAgICAgIGlmICh2aWV3LnRlbXBsYXRlcyAmJiB2aWV3LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAidmlldyIsIHZpZXcuaWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSBwcmVjb21waWxlZCB0ZW1wbGF0ZT8KICAgICAgICAgICAgICAgIHZhciB0ID0gdmlldy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHQpICYmIHQuY2FjaGVLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gdC5jYWNoZUtleTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgb3ZlcnJpZGRlbiBhdCB0aGUgZmllbGQgbGV2ZWw/CiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGZpZWxkLnBhdGg7CgogICAgICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy5maWVsZHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBwZXJtdXRhdGVkIGFuZCBnZW5lcmFsaXplZCBsb29rdXBzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJlc3QgZml0CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhleSBwYXRoIGlzOiAvZmlyc3RbMV0vc2Vjb25kWzJdL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbGl6ZWQgcGVybXV0YXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgYXBwbGljYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdFsxXS9zZWNvbmRbMl0vdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLyAgICAvZmlyc3RbMV0vc2Vjb25kL3RoaXJkCiAgICAgICAgICAgICAgICAgICAgLy8gICAgL2ZpcnN0L3NlY29uZFsyXS90aGlyZAogICAgICAgICAgICAgICAgICAgIC8vICAgIC9maXJzdC9zZWNvbmQvdGhpcmQKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKHRva2VucywgaW5kZXgsIG1hdGNoZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgd2UncmUgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRva2VucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2Vucy5zbGljZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgaW4gdGhlIHBhdGggYXQgdGhpcyBlbGVtZW50LCB1cGRhdGUgbmV3VG9rZW5zIHRvIHJlZmxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0gdG9rZW4uaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgeDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG9rZW5zW2luZGV4XSA9IHRva2VuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoIGZvciB0aGlzIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aCA9IG5ld1Rva2Vucy5qb2luKCIvIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZmllbGRzW19wYXRoXSAmJiB2aWV3LmZpZWxkc1tfcGF0aF0udGVtcGxhdGVzICYmIHZpZXcuZmllbGRzW19wYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9jayA9IEFscGFjYS5tYWtlQ2FjaGVLZXkodmlldy5pZCwgImZpZWxkIiwgX3BhdGgsIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZUtleSI6IF9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCBkb3duIHRoZSB0b2tlbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHRvZ2dsZWQsIHByb2NlZWQgd2l0aCB0aGF0IGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXMobmV3VG9rZW5zLCBpbmRleCArIDEsIG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHBhdGguc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdE1hdGNoZXModG9rZW5zLCAwLCBtYXRjaGVzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWNoZUtleSA9IG1hdGNoZXNbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIC8vIE9WRVJSSURFOiBpcyB0aGlzIHRlbXBsYXRlIGRlZmluZWQgYXQgdGhlIGZpZWxkIGxldmVsPwogICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQucGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBmaWVsZC5wYXRoOwoKICAgICAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXcuZmllbGRzICYmIHZpZXcuZmllbGRzW3BhdGhdICYmIHZpZXcuZmllbGRzW3BhdGhdLnRlbXBsYXRlcyAmJiB2aWV3LmZpZWxkc1twYXRoXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZmllbGQiLCBwYXRoLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgLy8gT1ZFUlJJREU6IGlzIHRoaXMgdGVtcGxhdGUgZGVmaW5lZCBhdCB0aGUgZ2xvYmFsIGxldmVsPwogICAgICAgICAgICBpZiAodGVtcGxhdGVJZCA9PT0gImdsb2JhbFRlbXBsYXRlIiB8fCB0ZW1wbGF0ZUlkID09PSAiZ2xvYmFsIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2NhY2hlS2V5ID0gQWxwYWNhLm1ha2VDYWNoZUtleSh2aWV3LmlkLCAiZ2xvYmFsIiwgImdsb2JhbCIsICJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPVkVSUklERTogaXMgdGhpcyB0ZW1wbGF0ZSBkZWZpbmVkIGF0IHRoZSBsYXlvdXQgbGV2ZWw/CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSAibGF5b3V0VGVtcGxhdGUiIHx8IHRlbXBsYXRlSWQgPT09ICJsYXlvdXQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXcuaWQsICJsYXlvdXQiLCAibGF5b3V0IiwgImxheW91dFRlbXBsYXRlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2FjaGVLZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggZW5naW5lIGhhcyB0aGlzCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWRzID0gQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkuaWRzKCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZ2luZUlkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5naW5lSWQgPSBlbmdpbmVJZHNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmlzQ2FjaGVkKF9jYWNoZUtleSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBfZW5naW5lSWQgPSBlbmdpbmVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChfZW5naW5lSWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgImVuZ2luZSI6IF9lbmdpbmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlS2V5IjogX2NhY2hlS2V5CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgYSB0ZW1wbGF0ZSBhbmQgcmV0dXJucyBhIERPTSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRGVzY3JpcHRvcgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqLwogICAgICAgIHRtcGw6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvciwgbW9kZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaHRtbCA9IEFscGFjYS50bXBsSHRtbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIG1vZGVsKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Euc2FmZURvbVBhcnNlKGh0bWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgdGVtcGxhdGUgYW5kIHJldHVybnMgSFRNTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZURlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKi8KICAgICAgICB0bXBsSHRtbDogZnVuY3Rpb24odGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbW9kZWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vZGVsID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmdpbmVUeXBlID0gdGVtcGxhdGVEZXNjcmlwdG9yLmVuZ2luZTsKCiAgICAgICAgICAgIHZhciBlbmdpbmUgPSBBbHBhY2EuVGVtcGxhdGVFbmdpbmVSZWdpc3RyeS5maW5kKGVuZ2luZVR5cGUpOwogICAgICAgICAgICBpZiAoIWVuZ2luZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0RlZmF1bHRFcnJvcigiQ2Fubm90IGZpbmQgdGVtcGxhdGUgZW5naW5lIGZvciB0eXBlOiAiICsgZW5naW5lVHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlRGVzY3JpcHRvci5jYWNoZUtleTsKICAgICAgICAgICAgdmFyIGh0bWwgPSBlbmdpbmUuZXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShlcnIpOwogICAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RGVmYXVsdEVycm9yKCJUaGUgY29tcGlsZWQgdGVtcGxhdGU6ICIgKyBjYWNoZUtleSArICIgZmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzdHIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KCiAgICB9KTsKCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8KICAgIC8vIExPR0dFUgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuREVCVUcgPSAwOwogICAgQWxwYWNhLklORk8gPSAxOwogICAgQWxwYWNhLldBUk4gPSAyOwogICAgQWxwYWNhLkVSUk9SID0gMzsKCiAgICAvLyBieSBkZWZhdWx0LCBsb2dnaW5nIG9ubHkgc2hvd3Mgd2FybmluZ3MgYW5kIGFib3ZlCiAgICAvLyB0byBkZWJ1Zywgc2V0IEFscGFjYS5sb2dMZXZlbCA9IEFscGFjYS5ERUJVRwogICAgQWxwYWNhLmxvZ0xldmVsID0gQWxwYWNhLldBUk47CgogICAgQWxwYWNhLmxvZ0RlYnVnID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuREVCVUcsIG9iaik7CiAgICB9OwogICAgQWxwYWNhLmxvZ0luZm8gPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5JTkZPLCBvYmopOwogICAgfTsKICAgIEFscGFjYS5sb2dXYXJuID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgQWxwYWNhLmxvZyhBbHBhY2EuV0FSTiwgb2JqKTsKICAgIH07CiAgICBBbHBhY2EubG9nRXJyb3IgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICBBbHBhY2EubG9nKEFscGFjYS5FUlJPUiwgb2JqKTsKICAgIH07CgogICAgQWxwYWNhLkxPR19NRVRIT0RfTUFQID0gewogICAgICAgIDA6ICdkZWJ1ZycsCiAgICAgICAgMTogJ2luZm8nLAogICAgICAgIDI6ICd3YXJuJywKICAgICAgICAzOiAnZXJyb3InCiAgICB9OwoKICAgIEFscGFjYS5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7CgogICAgICAgIGlmIChBbHBhY2EubG9nTGV2ZWwgPD0gbGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWV0aG9kID0gQWxwYWNhLkxPR19NRVRIT0RfTUFQW2xldmVsXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoImRlYnVnIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8ob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ3YXJuIiA9PT0gbWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgiZXJyb3IiID09PSBtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuY2hlY2tlZCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKGVsLCAiY2hlY2tlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmRpc2FibGVkID0gZnVuY3Rpb24oZWwsIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBBbHBhY2EuYXR0clByb3AoZWwsICJkaXNhYmxlZCIsIHZhbHVlKTsKICAgIH07CgogICAgQWxwYWNhLmF0dHJQcm9wID0gZnVuY3Rpb24oZWwsIG5hbWUsIHZhbHVlKQogICAgewogICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgICAgIGlmICgkKGVsKS5wcm9wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKGVsKS5wcm9wKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5yZW1vdmVBdHRyKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlCgogICAgICAgIC8vIGpRdWVyeSAxLjYrCiAgICAgICAgaWYgKCQoZWwpLnByb3ApIHsKICAgICAgICAgICAgcmV0dXJuICQoZWwpLnByb3AobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJChlbCkuYXR0cihuYW1lKTsKICAgIH07CgogICAgQWxwYWNhLmxvYWRSZWZTY2hlbWFPcHRpb25zID0gZnVuY3Rpb24odG9wRmllbGQsIHNjaGVtYVJlZmVyZW5jZUlkLCBvcHRpb25zUmVmZXJlbmNlSWQsIGNhbGxiYWNrKQogICAgewogICAgICAgIHZhciBmbnMgPSBbXTsKCiAgICAgICAgLy8gaG9sZHMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgogICAgICAgIHZhciByZXNvbHV0aW9uID0ge307CgogICAgICAgIC8vIHNjaGVtYSBsb2FkaW5nIGZ1bmN0aW9uCiAgICAgICAgdmFyIGZuMSA9IGZ1bmN0aW9uKHNjaGVtYSwgc2NoZW1hUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFSZWZlcmVuY2VJZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZCA9PT0gIiMiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjdXJyZW50IHNjaGVtYQogICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlZmVyZW5jZUlkID0gc2NoZW1hUmVmZXJlbmNlSWQuc3Vic3RyaW5nKDIpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCBpbnRvIHRva2VucwogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY2hlbWFSZWZlcmVuY2VJZC5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmU2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZTY2hlbWFbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWFbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5wcm9wZXJ0aWVzICYmIGRlZlNjaGVtYS5wcm9wZXJ0aWVzW3Rva2VuXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gZGVmU2NoZW1hLnByb3BlcnRpZXNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZlNjaGVtYS5kZWZpbml0aW9ucyAmJiBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTY2hlbWEgPSBkZWZTY2hlbWEuZGVmaW5pdGlvbnNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU2NoZW1hID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IGRlZlNjaGVtYTsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hUmVmZXJlbmNlSWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIElEIG9mIGEgbm9kZSBpbiB0aGUgY3VycmVudCBzY2hlbWEgZG9jdW1lbnQKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgY3VycmVudCBkb2N1bWVudCBzY2hlbWEgdW50aWwgd2UgZmluZCB0aGUgcmVmZXJlbmNlZCBub2RlICh1c2luZyBpZCBwcm9wZXJ0eSkKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRTY2hlbWEgPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzY2hlbWEsIHNjaGVtYVJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHJlc29sdmVkU2NoZW1hOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMoc2NoZW1hUmVmZXJlbmNlSWQpOwoKICAgICAgICAgICAgICAgICAgICB0b3BGaWVsZC5jb25uZWN0b3IubG9hZFJlZmVyZW5jZVNjaGVtYShyZWZlcmVuY2VQYXJ0cy5wYXRoLCBmdW5jdGlvbiAoc2NoZW1hKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHNjaGVtYSwgcmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24uc2NoZW1hID0gcmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmbnMucHVzaChmbjEodG9wRmllbGQuc2NoZW1hLCBzY2hlbWFSZWZlcmVuY2VJZCwgcmVzb2x1dGlvbikpOwoKICAgICAgICB2YXIgZm4yID0gZnVuY3Rpb24ob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkLCByZXNvbHV0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1JlZmVyZW5jZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkID09PSAiIyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9uc1JlZmVyZW5jZUlkLmluZGV4T2YoIiMvIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGN1cnJlbnQgc2NoZW1hCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1JlZmVyZW5jZUlkID0gb3B0aW9uc1JlZmVyZW5jZUlkLnN1YnN0cmluZygyKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgaW50byB0b2tlbnMKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gb3B0aW9uc1JlZmVyZW5jZUlkLnNwbGl0KCIvIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWZPcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZk9wdGlvbnNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9uc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmT3B0aW9ucy5maWVsZHMgJiYgZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPcHRpb25zID0gZGVmT3B0aW9ucy5maWVsZHNbdG9rZW5dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZk9wdGlvbnMuZGVmaW5pdGlvbnMgJiYgZGVmT3B0aW9ucy5kZWZpbml0aW9uc1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBkZWZPcHRpb25zLmRlZmluaXRpb25zW3Rva2VuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZk9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24ub3B0aW9ucyA9IGRlZk9wdGlvbnM7CgogICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnNSZWZlcmVuY2VJZC5pbmRleE9mKCIjIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgSUQgb2YgYSBub2RlIGluIHRoZSBjdXJyZW50IHNjaGVtYSBkb2N1bWVudAoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBjdXJyZW50IGRvY3VtZW50IHNjaGVtYSB1bnRpbCB3ZSBmaW5kIHRoZSByZWZlcmVuY2VkIG5vZGUgKHVzaW5nIGlkIHByb3BlcnR5KQogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uc1JlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRPcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi5vcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaXMgY29uc2lkZXJlZCB0byBiZSBhIFVSSSB3aXRoIG9yIHdpdGhvdXQgYSAiIyIgaW4gaXQgdG8gcG9pbnQgdG8gYSBzcGVjaWZpYyBsb2NhdGlvbiBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc2NoZW1hCgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25SZWZlcmVuY2VQYXJ0cyA9IEFscGFjYS5wYXRoUGFydHMob3B0aW9uc1JlZmVyZW5jZUlkKTsKCiAgICAgICAgICAgICAgICAgICAgdG9wRmllbGQuY29ubmVjdG9yLmxvYWRSZWZlcmVuY2VPcHRpb25zKG9wdGlvblJlZmVyZW5jZVBhcnRzLnBhdGgsIGZ1bmN0aW9uIChvcHRpb25zKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE9wdGlvbnMgPSBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2Uob3B0aW9ucywgb3B0aW9uUmVmZXJlbmNlUGFydHMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkT3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZucy5wdXNoKGZuMih0b3BGaWVsZC5vcHRpb25zLCBvcHRpb25zUmVmZXJlbmNlSWQsIHJlc29sdXRpb24pKTsKCiAgICAgICAgLy8gcnVuIGxvYWRzIGluIHBhcmFsbGVsCiAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZucywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdXRpb24uc2NoZW1hLCByZXNvbHV0aW9uLm9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBBbHBhY2EuREVGQVVMVF9FUlJPUl9DQUxMQkFDSyA9IGZ1bmN0aW9uKGVycm9yKQogICAgewogICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKQogICAgICAgIHsKICAgICAgICAgICAgLy8gbG9nIHRvIGRlYnVnCiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICAgICAgLy8gZXJyb3Igb3V0CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxwYWNhIGNhdWdodCBhbiBlcnJvciB3aXRoIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXI6ICIgKyBKU09OLnN0cmluZ2lmeShlcnJvcikpOwoKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRGVmYXVsdCBlcnJvciBjYWxsYmFjayBoYW5kbGVyIGZvciBBbHBhY2EuCiAgICAgKgogICAgICogVGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgYmUgdXNlZCBpZiBhbiAiZXJyb3IiIGFyZ3VtZW50IGlzbid0IHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZm9yIGFuIEFscGFjYSBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZXJyb3IKICAgICAqLwogICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrID0gQWxwYWNhLkRFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CgogICAgLyoqCiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHRocm93cyBhIGdlbmVyYWwgZXJyb3IgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWVzc2FnZQogICAgICovCiAgICBBbHBhY2EudGhyb3dEZWZhdWx0RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKQogICAgewogICAgICAgIGlmIChtZXNzYWdlICYmIEFscGFjYS5pc09iamVjdChtZXNzYWdlKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnIgPSB7CiAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZQogICAgICAgIH07CgogICAgICAgIEFscGFjYS5kZWZhdWx0RXJyb3JDYWxsYmFjayhlcnIpOwogICAgfTsKCiAgICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgdGhyb3dzIGFuIGVycm9yIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrIGhhbmRsZXIuCiAgICAgKgogICAgICogQHBhcmFtIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrID0gZnVuY3Rpb24obWVzc2FnZSwgZXJyb3JDYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAobWVzc2FnZSAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyID0gewogICAgICAgICAgICAibWVzc2FnZSI6IG1lc3NhZ2UKICAgICAgICB9OwoKICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgc2NoZW1hIHBhdGggcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBzdWItc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlID0gZnVuY3Rpb24oc2NoZW1hLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKHNjaGVtYS5pZCA9PT0gcmVmZXJlbmNlSWQpIHx8ICgoIiMiICsgc2NoZW1hLmlkKSA9PT0gcmVmZXJlbmNlSWQpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHNjaGVtYS5wcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIHggPSBBbHBhY2EucmVzb2x2ZVNjaGVtYVJlZmVyZW5jZShzdWJTY2hlbWEsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjaGVtYS5pdGVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdWJTY2hlbWEgPSBzY2hlbWEuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlU2NoZW1hUmVmZXJlbmNlKHN1YlNjaGVtYSwgcmVmZXJlbmNlSWQpOwogICAgICAgICAgICBpZiAoeCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICBBbHBhY2EucmVzb2x2ZU9wdGlvbnNSZWZlcmVuY2UgPSBmdW5jdGlvbihvcHRpb25zLCByZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICBpZiAoKG9wdGlvbnMuaWQgPT09IHJlZmVyZW5jZUlkKSB8fCAoKCIjIiArIG9wdGlvbnMuaWQpID09PSByZWZlcmVuY2VJZCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWVsZHMpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBmaWVsZElkIGluIG9wdGlvbnMuZmllbGRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuZmllbGRzW2ZpZWxkSWRdOwoKICAgICAgICAgICAgICAgIHZhciB4ID0gQWxwYWNhLnJlc29sdmVPcHRpb25zUmVmZXJlbmNlKHN1Yk9wdGlvbnMsIHJlZmVyZW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaXRlbXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3ViT3B0aW9ucyA9IG9wdGlvbnMuaXRlbXM7CgogICAgICAgICAgICB2YXIgeCA9IEFscGFjYS5yZXNvbHZlT3B0aW9uc1JlZmVyZW5jZShzdWJPcHRpb25zLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgIGlmICh4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgICQuYWxwYWNhID0gd2luZG93LkFscGFjYSA9IEFscGFjYTsKCiAgICAvKioKICAgICAqIGpRdWVyeSBmcmllbmRseSBtZXRob2QgZm9yIGJpbmRpbmcgYSBmaWVsZCB0byBhIERPTSBlbGVtZW50LgogICAgICogQGlnbm9yZQogICAgICovCiAgICAkLmZuLmFscGFjYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICAvLyBhcHBlbmQgdGhpcyBpbnRvIHRoZSBmcm9udCBvZiBhcmdzCiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXS5jb25jYXQodGhpcywgYXJncyk7CgogICAgICAgIC8vIGludm9rZSBBbHBhY2EgYWdhaW5zdCBjdXJyZW50IGVsZW1lbnQKICAgICAgICB2YXIgcmV0ID0gQWxwYWNhLmFwcGx5KHRoaXMsIG5ld0FyZ3MpOwogICAgICAgIGlmICh0eXBlb2YocmV0KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgLy8gYXMgcGVyIGpRdWVyeSdzIHBhdHRlcm4sIGFzc3VtZSB3ZSBoYW5kIGJhY2sgJGVsCiAgICAgICAgICAgIHJldCA9ICQodGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSBub2Nsb25pbmcKICAgICAqLwogICAgJC5mbi5vdXRlckhUTUwgPSBmdW5jdGlvbihub2Nsb25pbmcpIHsKICAgICAgICBpZiAobm9jbG9uaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZCh0aGlzKS5odG1sKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICQoIjxkaXY+PC9kaXY+IikuYXBwZW5kKHRoaXMuY2xvbmUoKSkuaHRtbCgpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAaWdub3JlCiAgICAgKiBAcGFyYW0gdG8KICAgICAqLwogICAgJC5mbi5zd2FwV2l0aCA9IGZ1bmN0aW9uKHRvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNvcHlfdG8gPSAkKHRvKS5jbG9uZSgpOwogICAgICAgICAgICB2YXIgY29weV9mcm9tID0gJCh0aGlzKS5jbG9uZSgpOwogICAgICAgICAgICAkKHRvKS5yZXBsYWNlV2l0aChjb3B5X2Zyb20pOwogICAgICAgICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKGNvcHlfdG8pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmF0dHJQcm9wID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmF0dHJQcm9wKCQodGhpcyksIG5hbWUsIHZhbHVlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBXaGVuIGRvbSBlbGVtZW50cyBhcmUgcmVtb3ZlZCwgd2UgZmlyZSB0aGUgc3BlY2lhbCAiZGVzdHJveWVkIiBldmVudCB0byBhbGxvdyBmb3IgbGF0ZSBjbGVhbnVwIG9mIGFueSBBbHBhY2EgY29kZQogICAgICogdGhhdCBtaWdodCBiZSBpbi1tZW1vcnkgYW5kIGxpbmtlZCB0byB0aGUgZG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogQHR5cGUge09iamVjdH0KICAgICAqLwogICAgJC5ldmVudC5zcGVjaWFsLmRlc3Ryb3llZCA9IHsKICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaWYgKG8uaGFuZGxlcikgewogICAgICAgICAgICAgICAgby5oYW5kbGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIEFscGFjYS5wYXRoUGFydHMgPSBmdW5jdGlvbihyZXNvdXJjZSkKICAgIHsKICAgICAgICBpZiAodHlwZW9mKHJlc291cmNlKSAhPT0gInN0cmluZyIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgICAgfQoKICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0byBvYmplY3QKICAgICAgICB2YXIgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2U7CiAgICAgICAgdmFyIHJlc291cmNlSWQgPSBudWxsOwogICAgICAgIHZhciBpID0gcmVzb3VyY2VQYXRoLmluZGV4T2YoIiMiKTsKICAgICAgICBpZiAoaSA+IC0xKQogICAgICAgIHsKICAgICAgICAgICAgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcoaSArIDEpOwogICAgICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIGkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChyZXNvdXJjZVBhdGgsICIvIikpIHsKICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCByZXNvdXJjZVBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGFydHMgPSB7fTsKICAgICAgICBwYXJ0cy5wYXRoID0gcmVzb3VyY2VQYXRoOwoKICAgICAgICBpZiAocmVzb3VyY2VJZCkKICAgICAgICB7CiAgICAgICAgICAgIHBhcnRzLmlkID0gcmVzb3VyY2VJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJ5IGl0cyBwcm9wZXJ0eSBpZC4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyRmllbGQKICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgKiBAcmV0dXJucyB7bnVsbH0KICAgICAqLwogICAgQWxwYWNhLnJlc29sdmVGaWVsZCA9IGZ1bmN0aW9uKGNvbnRhaW5lckZpZWxkLCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCkKICAgIHsKICAgICAgICB2YXIgcmVzb2x2ZWRGaWVsZCA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQpID09PSAic3RyaW5nIikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZC5pbmRleE9mKCIjLyIpID09PSAwICYmIHByb3BlcnR5SWQubGVuZ3RoID4gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gVE9ETzogcGF0aCBiYXNlZCBsb29rdXA/CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHlJZE9yUmVmZXJlbmNlSWQgPT09ICIjIiB8fCBwcm9wZXJ0eUlkT3JSZWZlcmVuY2VJZCA9PT0gIiMvIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzb2x2ZWRGaWVsZCA9IGNvbnRhaW5lckZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLmluZGV4T2YoIiMiKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGlkIGxvb2t1cAoKICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHRvcCBmaWVsZAogICAgICAgICAgICAgICAgdmFyIHRvcEZpZWxkID0gY29udGFpbmVyRmllbGQ7CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IHByb3BlcnR5SWRPclJlZmVyZW5jZUlkLnN1YnN0cmluZygxKTsKCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKHRvcEZpZWxkLCByZWZlcmVuY2VJZCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgbG9va3VwCiAgICAgICAgICAgICAgICByZXNvbHZlZEZpZWxkID0gY29udGFpbmVyRmllbGQuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZE9yUmVmZXJlbmNlSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzb2x2ZWRGaWVsZDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIGZpZWxkIGJhc2VkIG9uIGl0cyAicmVmZXJlbmNlIGlkIiByZWxhdGl2ZSB0byBhIHRvcCBsZXZlbCBmaWVsZC4gIFRoaXMgd2Fsa3MgZG93biB0aGUgZmllbGQgdHJlZSBhbmQKICAgICAqIGxvb2tzIGZvciBtYXRjaGluZyBzY2hlbWEuaWQgcmVmZXJlbmNlcyB0byBmaW5kIHRoZSBtYXRjaGluZyBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSByZWZlcmVuY2VJZAogICAgICovCiAgICBBbHBhY2EucmVzb2x2ZUZpZWxkQnlSZWZlcmVuY2UgPSBmdW5jdGlvbihmaWVsZCwgcmVmZXJlbmNlSWQpCiAgICB7CiAgICAgICAgaWYgKGZpZWxkLnNjaGVtYSAmJiBmaWVsZC5zY2hlbWEuaWQgPT0gcmVmZXJlbmNlSWQpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gQWxwYWNhLnJlc29sdmVGaWVsZEJ5UmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBlcXVhbCB0byB0aGUgZWxlbWVudHMgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3QgZWl0aGVyIGEgc2NhbGFyIHZhbHVlIG9yIGEgY29udGFpbmVyIChvYmplY3Qgb3IgYXJyYXkpIG9mIHZhbHVlcwogICAgICogQHBhcmFtIHNlY29uZCBlaXRoZXIgYSBzY2FsYXIgdmFsdWUgb3IgYSBjb250YWluZXIgKG9iamVjdCBvciBhcnJheSkgb2YgdmFsdWVzCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSBtYXRjaCBpcyBmb3VuZAogICAgICovCiAgICBBbHBhY2EuYW55RXF1YWxpdHkgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKQogICAgewogICAgICAgIC8vIGNvcHkgdmFsdWVzIGZyb20gZmlyc3QgaW50byBhIHZhbHVlcyBsb29rdXAgbWFwCiAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09PSAib2JqZWN0IiB8fCBBbHBhY2EuaXNBcnJheShmaXJzdCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbZmlyc3Rba11dID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZXNbZmlyc3RdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgLy8gY2hlY2sgdmFsdWVzIGZyb20gc2Vjb25kIGFnYWluc3QgdGhlIGxvb2t1cCBtYXAKICAgICAgICBpZiAodHlwZW9mKHNlY29uZCkgPT09ICJvYmplY3QiIHx8IEFscGFjYS5pc0FycmF5KHNlY29uZCkpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHYgPSBzZWNvbmRba107CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1tzZWNvbmRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgQWxwYWNhLnNlcmllcyA9IEFscGFjYS5zZXJpYWwgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spCiAgICB7CiAgICAgICAgYXN5bmMuc2VyaWVzKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnBhcmFsbGVsID0gZnVuY3Rpb24oZnVuY3MsIGNhbGxiYWNrKQogICAgewogICAgICAgIGFzeW5jLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLm5leHRUaWNrID0gZnVuY3Rpb24oZikKICAgIHsKICAgICAgICBhc3luYy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgZm9yIHRoZSBjaGFpbiBvZiBmaWVsZHMgZnJvbSB0aGUgdG9wLW1vc3QgZG93biB0byB0aGUgZ2l2ZW4gZmllbGQuCiAgICAgKiBFYWNoIHZhbGlkYXRpb24gY29udGV4dCBlbnRyeSBpcyBhIGZpZWxkIGluIHRoZSBjaGFpbiB3aGljaCBkZXNjcmliZXMgdGhlIGZvbGxvd2luZzoKICAgICAqCiAgICAgKiAgICB7CiAgICAgKiAgICAgICAiZmllbGQiOiB0aGUgZmllbGQgaW5zdGFuY2UsCiAgICAgKiAgICAgICAiYmVmb3JlIjogdGhlIGJlZm9yZSB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJhZnRlciI6IHRoZSBhZnRlciB2YWx1ZSAoYm9vbGVhbikKICAgICAqICAgICAgICJ2YWxpZGF0ZWQiOiAob3B0aW9uYWwpIGlmIHRoZSBmaWVsZCB2YWxpZGF0ZWQgKHN3aXRjaGVzIHN0YXRlIGZyb20gaW52YWxpZCB0byB2YWxpZCkKICAgICAqICAgICAgICJpbnZhbGlkYXRlZCI6IChvcHRpb25hbCkgaWYgdGhlIGZpZWxkIGludmFsaWRhdGVkIChzd2l0Y2hlcyBzdGF0ZSBmcm9tIHZhbGlkIHRvIGludmFsaWQpCiAgICAgKiAgICB9CiAgICAgKgogICAgICogVGhpcyBoYW5kcyBiYWNrIGFuIGFycmF5IG9mIGVudHJpZXMgd2l0aCB0aGUgY2hpbGQgZmllbGQgZmlyc3QgYW5kIGNvbnRpbnVpbmcgdXAgdGhlIHBhcmVudCBjaGFpbi4KICAgICAqIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgdG9wIG1vc3QgcGFyZW50IGZpZWxkLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBmaXJlZCB3aXRoIHRoZSBhc3NlbWJsZWQgY29udGV4dCwgYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRvIHJ1bi4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm5zIHtBcnJheX0KICAgICAqLwogICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dCA9IGZ1bmN0aW9uKGZpZWxkLCBjYWxsYmFjaykKICAgIHsKICAgICAgICAvLyB3YWxrIHVwIHRoZSBwYXJlbnQgdHJlZSB1bnRpbCB3ZSBmaW5kIHRoZSB0b3AtbW9zdCBjb250cm9sCiAgICAgICAgLy8gdGhpcyBzZXJ2ZXMgYXMgb3VyIHN0YXJ0aW5nIHBvaW50IGZvciBkb3dud2FyZCB2YWxpZGF0aW9uCiAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGFyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKHBhcmVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUgKHBhcmVudCk7CgogICAgICAgIC8vIHJldmVyc2Ugc28gdG9wIG1vc3QgcGFyZW50IGlzIGZpcnN0CiAgICAgICAgY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAvLyBjb21waWxhdGlvbiBjb250ZXh0CiAgICAgICAgdmFyIGNvbnRleHQgPSBbXTsKCiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc2V0cyB2YWxpZGF0aW9uIGZvciBhIHNpbmdsZSBmaWVsZAogICAgICAgIHZhciBmID0gZnVuY3Rpb24oY2hhaW4sIGNvbnRleHQsIGRvbmUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNoYWluIHx8IGNoYWluLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjaGFpblswXTsKCiAgICAgICAgICAgIHZhciBlbnRyeSA9IHt9OwogICAgICAgICAgICBlbnRyeS5pZCA9IGN1cnJlbnQuZ2V0SWQoKTsKICAgICAgICAgICAgZW50cnkuZmllbGQgPSBjdXJyZW50OwogICAgICAgICAgICBlbnRyeS5wYXRoID0gY3VycmVudC5wYXRoOwoKICAgICAgICAgICAgLy8gQkVGT1JFIGZpZWxkIHZhbGlkYXRpb24gc3RhdHVzCiAgICAgICAgICAgIHZhciBiZWZvcmVTdGF0dXMgPSBjdXJyZW50LmlzVmFsaWQoKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmVmb3JlU3RhdHVzID0gY3VycmVudC5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbnRyeS5iZWZvcmUgPSBiZWZvcmVTdGF0dXM7CgogICAgICAgICAgICB2YXIgb3Vyc2VsdmVzSGFuZGxlciA9IGZ1bmN0aW9uKGN1cnJlbnQsIGVudHJ5LCB3ZUZpbmlzaGVkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNseVZhbGlkYXRlZCA9IGN1cnJlbnQuX3ByZXZpb3VzbHlWYWxpZGF0ZWQ7CgogICAgICAgICAgICAgICAgLy8gbm93IHJ1biB0aGUgdmFsaWRhdGlvbiBmb3IganVzdCB0aGlzIG9uZSBmaWVsZAogICAgICAgICAgICAgICAgY3VycmVudC52YWxpZGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIChpZiBleGlzdHMpIGZvciBqdXN0IHRoaXMgb25lIGZpZWxkCiAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGlzIGp1c3QgZmlyZXMgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgICBjdXJyZW50Ll92YWxpZGF0ZUN1c3RvbVZhbGlkYXRvcihmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQUZURVIgZmllbGQgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0YXR1cyA9IGN1cnJlbnQuaXNWYWxpZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVudHJ5LmFmdGVyID0gYWZ0ZXJTdGF0dXM7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZmllbGQncyB2YWxpZGF0aW9uIHN0YXR1cyBmbGlwcGVkLCBmaXJlIHRyaWdnZXJzCiAgICAgICAgICAgICAgICAgICAgZW50cnkudmFsaWRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZVN0YXR1cyAmJiBhZnRlclN0YXR1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZVN0YXR1cyAmJiAhYWZ0ZXJTdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnZhbGlkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmllbGRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZXZpb3VzbHlWYWxpZGF0ZWQgJiYgIWFmdGVyU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGFpbmVyID0gY3VycmVudC5pc0NvbnRhaW5lcigpOwogICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbGlkID0gZW50cnkuYWZ0ZXI7CgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaChlbnRyeSk7CgogICAgICAgICAgICAgICAgICAgIHdlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gc3RlcCBkb3duIGludG8gY2hhaW4KICAgICAgICAgICAgLy8gd2UgZG8gY2hpbGRyZW4gYmVmb3JlIG91cnNlbHZlcwogICAgICAgICAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY29weSBhcnJheQogICAgICAgICAgICAgICAgdmFyIGNoaWxkQ2hhaW4gPSBjaGFpbi5zbGljZSgwKTsKICAgICAgICAgICAgICAgIGNoaWxkQ2hhaW4uc2hpZnQoKTsKICAgICAgICAgICAgICAgIGYoY2hpbGRDaGFpbiwgY29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Vyc2VsdmVzSGFuZGxlcihjdXJyZW50LCBlbnRyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGYoY2hhaW4sIGNvbnRleHQsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0KTsKICAgICAgICB9KTsKICAgIH07CgogICAgQWxwYWNhLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZUZvckNvbnRleHQgPSBmdW5jdGlvbih2aWV3LCBjb250ZXh0KQogICAgewogICAgICAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIGFuZCBmbGlwIGFueSBET00gVUkgYmFzZWQgb24gZW50cnkgc3RhdGUKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRleHQubGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2ldOwogICAgICAgICAgICB2YXIgZmllbGQgPSBlbnRyeS5maWVsZDsKCiAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyB2YWxpZGF0aW9uIFVJIG1hcmtlcnMKICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJhbHBhY2EtaW52YWxpZCBhbHBhY2EtaW52YWxpZC1oaWRkZW4gYWxwYWNhLXZhbGlkIik7CiAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygiY2xlYXJWYWxpZGl0eSIpOwoKICAgICAgICAgICAgLy8gdmFsaWQ/CiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtZmllbGQtdmFsaWQiKTsKICAgICAgICAgICAgICAgIGZpZWxkLmZpcmVDYWxsYmFjaygidmFsaWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG1hcmt1cCBpbnZhbGlkYXRpb24gc3RhdGUgZm9yIHJlYWRvbmx5IGZpZWxkcwogICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHRpb25zLnJlYWRvbmx5IHx8IEFscGFjYS5zaG93UmVhZE9ubHlJbnZhbGlkU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlyZUNhbGxiYWNrKCJpbnZhbGlkIiwgaGlkZGVuKTsKCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RmllbGRFbCgpLmFkZENsYXNzKCJhbHBhY2EtaW52YWxpZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImFscGFjYS1pbnZhbGlkLWhpZGRlbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGludmFsaWQgYW5kIGlzIGFsc28gcmVhZC1vbmx5LCBzbyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gaW5mb3JtIHRoZSBlbmQtdXNlcgogICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgVUkgKHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0KQogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHdlIGxvZyBhIG1lc3NhZ2UgdG8gZGVidWcgdG8gaW5mb3JtIHRoZSBkZXZlbG9wZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiVGhlIGZpZWxkIChpZD0iICsgZmllbGQuZ2V0SWQoKSArICIsIHRpdGxlPSIgKyBmaWVsZC5nZXRUaXRsZSgpICsgIiwgcGF0aD0iICsgZmllbGQucGF0aCArICIpIGlzIGludmFsaWQgYW5kIGFsc28gcmVhZC1vbmx5Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRSSUdHRVJTCiAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGQudHJpZ2dlcigidmFsaWRhdGVkIik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pbnZhbGlkYXRlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC50cmlnZ2VyKCJpbnZhbGlkYXRlZCIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgbWVzc2FnZSB0byBjaGFuZ2UKICAgICAgICAgICAgaWYgKGZpZWxkLm9wdGlvbnMuc2hvd01lc3NhZ2VzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmluaXRpYWxpemluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBtYXJrdXAgaW52YWxpZGF0aW9uIHN0YXRlIGZvciByZWFkb25seSBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLm9wdGlvbnMucmVhZG9ubHkgfHwgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtZXNzYWdlSWQgaW4gZmllbGQudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogZmllbGQudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGlzcGxheU1lc3NhZ2UobWVzc2FnZXMsIGZpZWxkLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb3ZlciB0aGUgZmllbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gcmVjdXJzaXZlbHkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcGFyYW0gZm4KICAgICAqLwogICAgQWxwYWNhLmZpZWxkQXBwbHlGaWVsZEFuZENoaWxkcmVuID0gZnVuY3Rpb24oZmllbGQsIGZuKQogICAgewogICAgICAgIGZuKGZpZWxkKTsKCiAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICBpZiAoZmllbGQuY2hpbGRyZW4gJiYgZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5maWVsZEFwcGx5RmllbGRBbmRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbltpXSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHN0cmluZyA8ZmluZD4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dCA8cmVwbGFjZT4uCiAgICAgKgogICAgICogQHBhcmFtIHRleHQKICAgICAqIEBwYXJhbSBmaW5kCiAgICAgKiBAcGFyYW0gcmVwbGFjZQogICAgICogQHJldHVybnMgeyp9CiAgICAgKi8KICAgIEFscGFjYS5yZXBsYWNlQWxsID0gZnVuY3Rpb24odGV4dCwgZmluZCwgcmVwbGFjZSkKICAgIHsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoZmluZCwgJ2cnKSwgcmVwbGFjZSk7CiAgICB9OwoKICAgIEFscGFjYS5hc0FycmF5ID0gZnVuY3Rpb24odGhpbmcpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGluZykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpbmc7CiAgICB9OwoKCgoKCgoKCgoKCgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLwogICAgLy8gQVNZTkMKICAgIC8vCiAgICAvLyBIZXJlIHdlIHByb3ZpZGUgYSByZWR1Y2VkIHZlcnNpb24gb2YgdGhlIHdvbmRlcmZ1bCBhc3luYyBsaWJyYXJ5LiAgVGhpcyBpcyBlbnRpcmVseSBpbmxpbmUgYW5kCiAgICAvLyB3aWxsIGhhdmUgbm8gYmVhcmluZyBvbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIGFzeW5jLgogICAgLy8KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMKICAgIC8vIENvcHlyaWdodCAoYykgMjAxMCBDYW9sYW4gTWNNYWhvbgogICAgLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvKmdsb2JhbCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2UgKi8KICAgIChmdW5jdGlvbiAoKSB7CgogICAgICAgIHZhciBhc3luYyA9IHt9OwoKICAgICAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyCiAgICAgICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jOwoKICAgICAgICByb290ID0gdGhpczsKICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgIHByZXZpb3VzX2FzeW5jID0gcm9vdC5hc3luYzsKICAgICAgICB9CgogICAgICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYzsKICAgICAgICAgICAgcmV0dXJuIGFzeW5jOwogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIG9ubHlfb25jZShmbikgewogICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBmbi5hcHBseShyb290LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8vLyBjcm9zcy1icm93c2VyIGNvbXBhdGlibGl0eSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICB2YXIgX2VhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewogICAgICAgICAgICBpZiAoYXJyLmZvckVhY2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChpdGVyYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBfbWFwID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKICAgICAgICAgICAgaWYgKGFyci5tYXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBpLCBhKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IoeCwgaSwgYSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykgewogICAgICAgICAgICBpZiAoYXJyLnJlZHVjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1Y2UoaXRlcmF0b3IsIG1lbW8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKICAgICAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBtZW1vOwogICAgICAgIH07CgogICAgICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICB9OwoKICAgICAgICAvLy8vIGV4cG9ydGVkIGFzeW5jIG1vZHVsZSBmdW5jdGlvbnMgLy8vLwoKICAgICAgICAvLy8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxiYWNrIC8vLy8KICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJvY2Vzcy5uZXh0VGljaykpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljazsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzeW5jLmVhY2ggPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgb25seV9vbmNlKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDsKCiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgICAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltjb21wbGV0ZWRdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaXRlcmF0ZSgpOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7CgogICAgICAgIGFzeW5jLmVhY2hMaW1pdCA9IGZ1bmN0aW9uIChhcnIsIGxpbWl0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGZuID0gX2VhY2hMaW1pdChsaW1pdCk7CiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIFthcnIsIGl0ZXJhdG9yLCBjYWxsYmFja10pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMuZm9yRWFjaExpbWl0ID0gYXN5bmMuZWFjaExpbWl0OwoKICAgICAgICB2YXIgX2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgewoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDsKICAgICAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDsKCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gcmVwbGVuaXNoICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgZG9QYXJhbGxlbCA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIGRvUGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0LCBmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFtfZWFjaExpbWl0KGxpbWl0KV0uY29uY2F0KGFyZ3MpKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHZhciBkb1NlcmllcyA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFthc3luYy5lYWNoU2VyaWVzXS5jb25jYXQoYXJncykpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgoKICAgICAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApOwogICAgICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7CiAgICAgICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgX21hcExpbWl0ID0gZnVuY3Rpb24obGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvUGFyYWxsZWxMaW1pdChsaW1pdCwgX2FzeW5jTWFwKTsKICAgICAgICB9OwoKICAgICAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVyc2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CiAgICAgICAgLy8gd29yayBpbiBtYW55IHNpdHVhdGlvbnMuCiAgICAgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0aW9uIChlcnIsIHYpIHsKICAgICAgICAgICAgICAgICAgICBtZW1vID0gdjsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLy8gaW5qZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNlOwogICAgICAgIC8vIGZvbGRsIGFsaWFzCiAgICAgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CgogICAgICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICAgIH0pLnJldmVyc2UoKTsKICAgICAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgLy8gZm9sZHIgYWxpYXMKICAgICAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0OwoKICAgICAgICB2YXIgX2ZpbHRlciA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhfbWFwKHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmZpbHRlciA9IGRvUGFyYWxsZWwoX2ZpbHRlcik7CiAgICAgICAgYXN5bmMuZmlsdGVyU2VyaWVzID0gZG9TZXJpZXMoX2ZpbHRlcik7CiAgICAgICAgLy8gc2VsZWN0IGFsaWFzCiAgICAgICAgYXN5bmMuc2VsZWN0ID0gYXN5bmMuZmlsdGVyOwogICAgICAgIGFzeW5jLnNlbGVjdFNlcmllcyA9IGFzeW5jLmZpbHRlclNlcmllczsKCiAgICAgICAgdmFyIF9yZWplY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKICAgICAgICBhc3luYy5yZWplY3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKCiAgICAgICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7CiAgICAgICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7CgogICAgICAgIGFzeW5jLnNvbWUgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgewogICAgICAgICAgICBhc3luYy5lYWNoKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbnkgYWxpYXMKICAgICAgICBhc3luYy5hbnkgPSBhc3luYy5zb21lOwoKICAgICAgICBhc3luYy5ldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvLyBhbGwgYWxpYXMKICAgICAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKCiAgICAgICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hdXRvID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICB2YXIga2V5cyA9IF9rZXlzKHRhc2tzKTsKICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChfa2V5cyhyZXN1bHRzKS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgdmFyIHRhc2sgPSAodGFza3Nba10gaW5zdGFuY2VvZiBGdW5jdGlvbikgPyBbdGFza3Nba11dOiB0YXNrc1trXTsKICAgICAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107CiAgICAgICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3JhcEl0ZXJhdG9yKG5leHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB3cmFwSXRlcmF0b3IoYXN5bmMuaXRlcmF0b3IodGFza3MpKSgpOwogICAgICAgIH07CgogICAgICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OwogICAgICAgICAgICBpZiAodGFza3MuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIF9wYXJhbGxlbCh7IG1hcDogYXN5bmMubWFwLCBlYWNoOiBhc3luYy5lYWNoIH0sIHRhc2tzLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNoOiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOwogICAgICAgIH07CgogICAgICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICAgICAgaWYgKHRhc2tzLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307CiAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJnczsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBhc3luYy5pdGVyYXRvciA9IGZ1bmN0aW9uICh0YXNrcykgewogICAgICAgICAgICB2YXIgbWFrZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrc1tpbmRleF0uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5leHQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmbi5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPCB0YXNrcy5sZW5ndGggLSAxKSA/IG1ha2VDYWxsYmFjayhpbmRleCArIDEpOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxsYmFjaygwKTsKICAgICAgICB9OwoKICAgICAgICBhc3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgbnVsbCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHsKICAgICAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHsKICAgICAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7CiAgICAgICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7CgogICAgICAgIGFzeW5jLndoaWxzdCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRlc3QoKSkgewogICAgICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzeW5jLndoaWxzdCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW50aWwgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXN5bmMudW50aWwodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMucXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkgewogICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcG9zLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0YXNrLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYmIHEudGFza3MubGVuZ3RoID09PSBjb25jdXJyZW5jeSkgewogICAgICAgICAgICAgICAgICAgICAgICBxLnNhdHVyYXRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgd29ya2VycyA9IDA7CiAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgdGFza3M6IFtdLAogICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LAogICAgICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgZW1wdHk6IG51bGwsCiAgICAgICAgICAgICAgICBkcmFpbjogbnVsbCwKICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlcnMgPCBxLmNvbmN1cnJlbmN5ICYmIHEudGFza3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcS50YXNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5lbXB0eSAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxLmRyYWluICYmIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuZHJhaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBvbmx5X29uY2UobmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIGNiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY2FyZ28gPSBmdW5jdGlvbiAod29ya2VyLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHZhciB3b3JraW5nICAgICA9IGZhbHNlLAogICAgICAgICAgICAgICAgdGFza3MgICAgICAgPSBbXTsKCiAgICAgICAgICAgIHZhciBjYXJnbyA9IHsKICAgICAgICAgICAgICAgIHRhc2tzOiB0YXNrcywKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsCiAgICAgICAgICAgICAgICBzYXR1cmF0ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICBlbXB0eTogbnVsbCwKICAgICAgICAgICAgICAgIGRyYWluOiBudWxsLAogICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFtkYXRhXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZ28uc2F0dXJhdGVkICYmIHRhc2tzLmxlbmd0aCA9PT0gcGF5bG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ28uc2F0dXJhdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoY2FyZ28ucHJvY2Vzcyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZ28uZHJhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHRzID0gdHlwZW9mIHBheWxvYWQgPT09ICdudW1iZXInID8KICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3Muc3BsaWNlKDApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBfbWFwKHRzLCBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXJnby5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKHRzLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFza3MubGVuZ3RoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJ1bm5pbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2luZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGNhcmdvOwogICAgICAgIH07CgogICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KICAgICAgICB2YXIgX2NvbnNvbGVfZm4gPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lYWNoKGFyZ3MsIGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtuYW1lXSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCgogICAgICAgIGFzeW5jLmxvZyA9IF9jb25zb2xlX2ZuKCdsb2cnKTsKICAgICAgICBhc3luYy5kaXIgPSBfY29uc29sZV9mbignZGlyJyk7CiAgICAgICAgLyphc3luYy5pbmZvID0gX2NvbnNvbGVfZm4oJ2luZm8nKTsKICAgICAgICAgYXN5bmMud2FybiA9IF9jb25zb2xlX2ZuKCd3YXJuJyk7CiAgICAgICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KCiAgICAgICAgYXN5bmMubWVtb2l6ZSA9IGZ1bmN0aW9uIChmbiwgaGFzaGVyKSB7CiAgICAgICAgICAgIHZhciBtZW1vID0ge307CiAgICAgICAgICAgIHZhciBxdWV1ZXMgPSB7fTsKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGVyIHx8IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBoYXNoZXIuYXBwbHkobnVsbCwgYXJncyk7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1lbW8pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW2ldLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBtZW1vaXplZC5tZW1vID0gbWVtbzsKICAgICAgICAgICAgbWVtb2l6ZWQudW5tZW1vaXplZCA9IGZuOwogICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudW5tZW1vaXplID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMudGltZXNTZXJpZXMgPSBmdW5jdGlvbiAoY291bnQsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY291bnRlciA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvdW50ZXIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXN5bmMubWFwU2VyaWVzKGNvdW50ZXIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKICAgICAgICAgICAgdmFyIGZucyA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICBhc3luYy5yZWR1Y2UoZm5zLCBhcmdzLCBmdW5jdGlvbiAobmV3YXJncywgZm4sIGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIG5ld2FyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgbmV4dGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9XSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGF0LCBbZXJyXS5jb25jYXQocmVzdWx0cykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHZhciBfYXBwbHlFYWNoID0gZnVuY3Rpb24gKGVhY2hmbiwgZm5zIC8qYXJncy4uLiovKSB7CiAgICAgICAgICAgIHZhciBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFjaGZuKGZucywgZnVuY3Rpb24gKGZuLCBjYikgewogICAgICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChbY2JdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGdvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGdvOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhc3luYy5hcHBseUVhY2ggPSBkb1BhcmFsbGVsKF9hcHBseUVhY2gpOwogICAgICAgIGFzeW5jLmFwcGx5RWFjaFNlcmllcyA9IGRvU2VyaWVzKF9hcHBseUVhY2gpOwoKICAgICAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgewogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm4obmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCgpOwogICAgICAgIH07CgogICAgICAgIC8qCiAgICAgICAgLy8gQU1EIC8gUmVxdWlyZUpTCiAgICAgICAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXN5bmM7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyBOb2RlLmpzCiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc3luYzsKICAgICAgICB9CiAgICAgICAgLy8gaW5jbHVkZWQgZGlyZWN0bHkgdmlhIDxzY3JpcHQ+IHRhZwogICAgICAgIGVsc2UgewogICAgICAgICAgICByb290LmFzeW5jID0gYXN5bmM7CiAgICAgICAgfQogICAgICAgICovCgogICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYzsKCgoKCgogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBFUVVJViBBTkQgSE9PWklUCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBpcyBvLgogICAgICAgIGZ1bmN0aW9uIGhvb3ppdChvKSB7CiAgICAgICAgICAgIGlmIChvLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAoby5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJuYW4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKCiAgICAgICAgICAgICAgICAvLyBjb25zaWRlcjogdHlwZW9mIFtdID09PSBvYmplY3QKICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwoKICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyOiB0eXBlb2YgbmV3IERhdGUoKSA9PT0gb2JqZWN0CiAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZGF0ZSI7CgogICAgICAgICAgICAgICAgLy8gY29uc2lkZXI6IC8uLyBpbnN0YW5jZW9mIE9iamVjdDsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAvLi8gaW5zdGFuY2VvZiBSZWdFeHA7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB0eXBlb2YgLy4vID09PSAiZnVuY3Rpb24iOyAvLyA9PiBmYWxzZSBpbiBJRSBhbmQgT3BlcmEsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgaW4gRkYgYW5kIFNhZmFyaQogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiAicmVnZXhwIjsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG8gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBvIHJlbGF0ZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogICAgICAgIGZ1bmN0aW9uIGJpbmRDYWxsYmFja3MobywgY2FsbGJhY2tzLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBwcm9wID0gaG9veml0KG8pOwogICAgICAgICAgICBpZiAocHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGhvb3ppdChjYWxsYmFja3NbcHJvcF0pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrc1twcm9wXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzW3Byb3BdOyAvLyBvciB1bmRlZmluZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KICAgICAgICB2YXIgZXF1aXYgPSByb290LmVxdWl2ID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbm5lckVxdWl2OyAvLyB0aGUgcmVhbCBlcXVpdiBmdW5jdGlvbgogICAgICAgICAgICB2YXIgY2FsbGVycyA9IFtdOyAvLyBzdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwoKICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nLCBib29sZWFuLCBudW1iZXIgYW5kIG51bGwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2ggc2hvcnQgYW5ub3RhaW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJib29sZWFuIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAoKICAgICAgICAgICAgICAgICAgICAibmFuIjogZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGIpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICJkYXRlIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAicmVnZXhwIjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb3ppdChiKSA9PT0gInJlZ2V4cCIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiAvLyB0aGUgcmVnZXggaXRzZWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgLy8gYW5kIGl0cyBtb2RpZmVycyAoZ21pKSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCiAgICAgICAgICAgICAgICAgICAgLy8gLSBhYm9ydCBvdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgLy8gICBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQogICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxlciA9IGNhbGxlcnNbY2FsbGVycy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAiYXJyYXkiOiBmdW5jdGlvbiAoYiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKGhvb3ppdChiKSA9PT0gImFycmF5IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT09IGIubGVuZ3RoKSB7IC8vIHNhZmUgYW5kIGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAib2JqZWN0IjogZnVuY3Rpb24gKGIsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcSA9IHRydWU7IC8vIHVubGVzcyB3ZSBjYW4gcHJvb3ZlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhUHJvcGVydGllcyA9IFtdLCBiUHJvcGVydGllcyA9IFtdOyAvLyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBpbnN0YW5jZW9mCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucHVzaChhLmNvbnN0cnVjdG9yKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhKSB7IC8vIGJlIHN0cmljdDogZG9uJ3QgZW5zdXJlcyBoYXNPd25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9wZXJ0aWVzLnB1c2goaSk7IC8vIGNvbGxlY3QgYSdzIHByb3BlcnRpZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5uZXJFcXVpdihhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMucG9wKCk7IC8vIHVuc3RhY2ssIHdlIGFyZSBkb25lCgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb3BlcnRpZXMucHVzaChpKTsgLy8gY29sbGVjdCBiJ3MgcHJvcGVydGllcwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxICYmIGlubmVyRXF1aXYoYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKCiAgICAgICAgICAgIGlubmVyRXF1aXYgPSBmdW5jdGlvbiAoKSB7IC8vIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZW5kIHRyYW5zaXRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhdGNoIHRoZSBtb3N0IHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8IGhvb3ppdChhKSAhPT0gaG9veml0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZENhbGxiYWNrcyhhLCBjYWxsYmFja3MsIFtiLCBhXSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgfSkoYXJnc1swXSwgYXJnc1sxXSkgJiYgYXJndW1lbnRzLmNhbGxlZS5hcHBseSh0aGlzLCBhcmdzLnNwbGljZSgxLCBhcmdzLmxlbmd0aCAtMSkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGlubmVyRXF1aXY7CgogICAgICAgIH0oKTsKCiAgICB9KCkpOwoKICAgIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1jb250YWluZXItZmllbGQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSA9ICJhbHBhY2EtbWFya2VyLWNvbnRyb2wtZmllbGQtaXRlbSI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQ09OVEFJTkVSX0ZJRUxEX0lURU1fS0VZID0gImRhdGEtYWxwYWNhLWNvbnRhaW5lci1maWVsZC1pdGVtLWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgPSAiYWxwYWNhLW1hcmtlci1mb3JtLWl0ZW1zLWZpZWxkIjsKICAgIEFscGFjYS5DTEFTU19DT05UQUlORVIgPSAiYWxwYWNhLWNvbnRhaW5lciI7CiAgICBBbHBhY2EuQ0xBU1NfQ09OVFJPTCA9ICJhbHBhY2EtY29udHJvbCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0lOU0VSVCA9ICJhbHBhY2EtbWFya2VyLWluc2VydCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfSU5TRVJUX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItaW5zZXJ0LWtleSI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX1RPT0xCQVIgPSAiYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC10b29sYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLWFycmF5LWZpZWxkLXRvb2xiYXItZmllbGQtaWQiOwogICAgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiA9ICJhbHBhY2EtbWFya2VyLWFycmF5LWZpZWxkLWl0ZW0tYWN0aW9uYmFyIjsKICAgIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1rZXkiOwogICAgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fUEFSRU5UX0ZJRUxEX0lEID0gImRhdGEtYWxwYWNhLW1hcmtlci1hcnJheS1maWVsZC1pdGVtLXBhcmVudC1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCA9ICJkYXRhLWFscGFjYS1tYXJrZXItYXJyYXktZmllbGQtaXRlbS1maWVsZC1pZCI7CiAgICBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEID0gImFscGFjYS1tYXJrZXItY29udGFpbmVyLWZpZWxkLWl0ZW0tZmllbGQiOwoKICAgIEFscGFjYS5tYWtlQ2FjaGVLZXkgPSBmdW5jdGlvbih2aWV3SWQsIHNjb3BlVHlwZSwgc2NvcGVJZCwgdGVtcGxhdGVJZCkKICAgIHsKICAgICAgICByZXR1cm4gdmlld0lkICsgIjoiICsgc2NvcGVUeXBlICsgIjoiICsgc2NvcGVJZCArICI6IiArIHRlbXBsYXRlSWQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU3BsaXRzIGEgY2FjaGUga2V5IGludG8gaXRzIHBhcnRzIC0gdmlld0lkLCBzY29wZVR5cGUsIHNjb3BlSWQgYW5kIHRlbXBsYXRlSWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgKiBAcmV0dXJucyB7e319CiAgICAgKi8KICAgIEFscGFjYS5zcGxpdENhY2hlS2V5ID0gZnVuY3Rpb24oY2FjaGVLZXkpCiAgICB7CiAgICAgICAgdmFyIHBhcnRzID0ge307CgogICAgICAgIHZhciB4ID0gY2FjaGVLZXkuaW5kZXhPZigiOiIpOwogICAgICAgIHZhciB5ID0gY2FjaGVLZXkubGFzdEluZGV4T2YoIjoiKTsKCiAgICAgICAgcGFydHMudmlld0lkID0gY2FjaGVLZXkuc3Vic3RyaW5nKDAsIHgpOwogICAgICAgIHBhcnRzLnRlbXBsYXRlSWQgPSBjYWNoZUtleS5zdWJzdHJpbmcoeSArIDEpOwoKICAgICAgICB2YXIgc2NvcGVJZGVudGlmaWVyID0gY2FjaGVLZXkuc3Vic3RyaW5nKHggKyAxLCB5KTsKCiAgICAgICAgdmFyIHogPSBzY29wZUlkZW50aWZpZXIuaW5kZXhPZigiOiIpOwoKICAgICAgICBwYXJ0cy5zY29wZVR5cGUgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIHopOwogICAgICAgIHBhcnRzLnNjb3BlSWQgPSBzY29wZUlkZW50aWZpZXIuc3Vic3RyaW5nKHorMSk7CgogICAgICAgIHJldHVybiBwYXJ0czsKICAgIH07CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRhdGEgb2JqZWN0IGZvciBhIGdpdmVuIEpTT04gc2NoZW1hLgogICAgICoKICAgICAqIEBwYXJhbSBzY2hlbWEKICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgKi8KICAgIEFscGFjYS5jcmVhdGVFbXB0eURhdGFJbnN0YW5jZSA9IGZ1bmN0aW9uKHNjaGVtYSkKICAgIHsKICAgICAgICBpZiAoIXNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTd2FwcyB0d28gZGl2cyB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzb3VyY2UKICAgICAqIEBwYXJhbSB0YXJnZXQKICAgICAqIEBwYXJhbSBkdXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgKi8KICAgIEFscGFjYS5hbmltYXRlZFN3YXAgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgewogICAgICAgIGlmICh0eXBlb2YoZHVyYXRpb24pID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZHVyYXRpb247CiAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgIH0KCiAgICAgICAgdmFyIF9hbmltYXRlID0gZnVuY3Rpb24oYSwgYiwgZHVyYXRpb24sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZyb20gPSAkKGEpLAogICAgICAgICAgICAgICAgZGVzdCA9ICQoYiksCiAgICAgICAgICAgICAgICBmcm9tX3BvcyA9IGZyb20ub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Qub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lID0gZnJvbS5jbG9uZSgpLAogICAgICAgICAgICAgICAgZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIGRlc3RfY2xvbmUuaW5zZXJ0QWZ0ZXIoZGVzdCkuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgd2lkdGg6IGRlc3Qub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGRlc3Qub3V0ZXJIZWlnaHQoKX0pLm9mZnNldChkZXN0X3BvcykuY3NzKCJ6LWluZGV4IiwgIjk5OSIpOwoKICAgICAgICAgICAgaWYoZnJvbV9wb3MudG9wICE9PSBkZXN0X3Bvcy50b3ApIHsKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21fdmVydGljYWwgPSB0b3RhbF9yb3V0ZV92ZXJ0aWNhbCAtIGZyb20uaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm91dGVfZGVzdF92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZGVzdC5oZWlnaHQoKTsKICAgICAgICAgICAgaWYoZnJvbV9wb3MubGVmdCAhPT0gZGVzdF9wb3MubGVmdCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV9ob3Jpem9udGFsID0gdG90YWxfcm91dGVfaG9yaXpvbnRhbCAtIGZyb20ud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZGVzdC53aWR0aCgpOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHRvcDogIis9IiArIHJvdXRlX2Zyb21fdmVydGljYWwgKyAicHgiLAogICAgICAgICAgICAgICAgbGVmdDogIis9IiArIHJvdXRlX2Zyb21faG9yaXpvbnRhbCArICJweCIKICAgICAgICAgICAgfSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDEpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZXN0X2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiLT0iICsgcm91dGVfZGVzdF92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiLT0iICsgcm91dGVfZGVzdF9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGZyb20uY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZnJvbV9jbG9uZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIGRlc3RfY2xvbmUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9LCBkdXJhdGlvbiArIDEpOwogICAgICAgIH07CgogICAgICAgIF9hbmltYXRlKHNvdXJjZSwgdGFyZ2V0LCBkdXJhdGlvbiwgY2FsbGJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuaW1hdGVzIHRoZSBtb3ZlbWVudCBvZiBhIGRpdiB2aXN1YWxseSBhbmQgdGhlbiBmaXJlcyBjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlCiAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgKiBAcGFyYW0gZHVyYXRpb24KICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICovCiAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgIHsKICAgICAgICBpZiAodHlwZW9mKGR1cmF0aW9uKSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBjYWxsYmFjayA9IGR1cmF0aW9uOwogICAgICAgICAgICBkdXJhdGlvbiA9IDUwMDsKICAgICAgICB9CgogICAgICAgIHZhciBfYW5pbWF0ZSA9IGZ1bmN0aW9uKGEsIGIsIGR1cmF0aW9uLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmcm9tID0gJChhKSwKICAgICAgICAgICAgICAgIGRlc3QgPSAkKGIpLAogICAgICAgICAgICAgICAgZnJvbV9wb3MgPSBmcm9tLm9mZnNldCgpLAogICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0Lm9mZnNldCgpLAogICAgICAgICAgICAgICAgZnJvbV9jbG9uZSA9IGZyb20uY2xvbmUoKSwKICAgICAgICAgICAgICAgIC8vZGVzdF9jbG9uZSA9IGRlc3QuY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX3ZlcnRpY2FsICAgPSBkZXN0X3Bvcy50b3AgKyBkZXN0LmhlaWdodCgpIC0gZnJvbV9wb3MudG9wLAogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCAgICA9IDAsCiAgICAgICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsICAgID0gMCwKICAgICAgICAgICAgICAgIHRvdGFsX3JvdXRlX2hvcml6b250YWwgPSBkZXN0X3Bvcy5sZWZ0ICsgZGVzdC53aWR0aCgpIC0gZnJvbV9wb3MubGVmdCwKICAgICAgICAgICAgICAgIHJvdXRlX2Zyb21faG9yaXpvbnRhbCAgPSAwLAogICAgICAgICAgICAgICAgcm91dGVfZGVzdF9ob3Jpem9udGFsICA9IDA7CgogICAgICAgICAgICBmcm9tLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgICBkZXN0LmNzcygib3BhY2l0eSIsIDApOwoKICAgICAgICAgICAgZnJvbV9jbG9uZS5pbnNlcnRBZnRlcihmcm9tKS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZnJvbS5vdXRlcldpZHRoKCksIGhlaWdodDogZnJvbS5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGZyb21fcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CiAgICAgICAgICAgIC8vZGVzdF9jbG9uZS5pbnNlcnRBZnRlcihkZXN0KS5jc3Moe3Bvc2l0aW9uOiAiYWJzb2x1dGUiLCB3aWR0aDogZGVzdC5vdXRlcldpZHRoKCksIGhlaWdodDogZGVzdC5vdXRlckhlaWdodCgpfSkub2Zmc2V0KGRlc3RfcG9zKS5jc3MoInotaW5kZXgiLCAiOTk5Iik7CgogICAgICAgICAgICBpZihmcm9tX3Bvcy50b3AgIT09IGRlc3RfcG9zLnRvcCkgewogICAgICAgICAgICAgICAgcm91dGVfZnJvbV92ZXJ0aWNhbCA9IHRvdGFsX3JvdXRlX3ZlcnRpY2FsIC0gZnJvbS5oZWlnaHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByb3V0ZV9kZXN0X3ZlcnRpY2FsID0gdG90YWxfcm91dGVfdmVydGljYWwgLSBkZXN0LmhlaWdodCgpOwogICAgICAgICAgICBpZihmcm9tX3Bvcy5sZWZ0ICE9PSBkZXN0X3Bvcy5sZWZ0KSB7CiAgICAgICAgICAgICAgICByb3V0ZV9mcm9tX2hvcml6b250YWwgPSB0b3RhbF9yb3V0ZV9ob3Jpem9udGFsIC0gZnJvbS53aWR0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdXRlX2Rlc3RfaG9yaXpvbnRhbCA9IHRvdGFsX3JvdXRlX2hvcml6b250YWwgLSBkZXN0LndpZHRoKCk7CgogICAgICAgICAgICBmcm9tX2Nsb25lLmFuaW1hdGUoewogICAgICAgICAgICAgICAgdG9wOiAiKz0iICsgcm91dGVfZnJvbV92ZXJ0aWNhbCArICJweCIsCiAgICAgICAgICAgICAgICBsZWZ0OiAiKz0iICsgcm91dGVfZnJvbV9ob3Jpem9udGFsICsgInB4IgogICAgICAgICAgICB9LCBkdXJhdGlvbiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGRlc3QuY3NzKCJvcGFjaXR5IiwgMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGRlc3RfY2xvbmUuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICB0b3A6ICItPSIgKyByb3V0ZV9kZXN0X3ZlcnRpY2FsICsgInB4IiwKICAgICAgICAgICAgICAgIGxlZnQ6ICItPSIgKyByb3V0ZV9kZXN0X2hvcml6b250YWwgKyAicHgiCiAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZnJvbS5jc3MoIm9wYWNpdHkiLCAxKTsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBmcm9tX2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy9kZXN0X2Nsb25lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwgZHVyYXRpb24gKyAxKTsKICAgICAgICB9OwoKICAgICAgICBfYW5pbWF0ZShzb3VyY2UsIHRhcmdldCwgZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH07CgoKICAgIEFscGFjYS5maXJlUmVhZHkgPSBmdW5jdGlvbihfZmllbGQpCiAgICB7CiAgICAgICAgaWYgKF9maWVsZC5jaGlsZHJlbiAmJiBfZmllbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgX2ZpZWxkLmNoaWxkcmVuLmxlbmd0aDsgZysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KF9maWVsZC5jaGlsZHJlbltnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9maWVsZC50cmlnZ2VyKCJyZWFkeSIpOwogICAgfTsKCiAgICBBbHBhY2EucmVhZENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpCiAgICB7CiAgICAgICAgZnVuY3Rpb24gX3JlYWRDb29raWUobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuYW1lRVEgPSBuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXTsKICAgICAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKT09JyAnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLGMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICBpZiAodHlwZW9mKGRvY3VtZW50KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgewogICAgICAgICAgICB2YWx1ZSA9IF9yZWFkQ29va2llKG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKCiAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5ID0gZnVuY3Rpb24oYmFzZU9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZXMpIHsKCiAgICAgICAgaWYgKHR5cGVvZihiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0pID09PSAidW5kZWZpbmVkIiB8fCBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBiYXNlT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYmFzZU9iamVjdFtwcm9wZXJ0eU5hbWVdLmxlbmd0aCA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGJhc2VPYmplY3RbcHJvcGVydHlOYW1lXS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBBbHBhY2EuaW5BcnJheSA9IGZ1bmN0aW9uKGFycmF5LCB2YWwpCiAgICB7CiAgICAgICAgcmV0dXJuICgkLmluQXJyYXkodmFsLCBhcnJheSkgPiAtMSk7CiAgICB9OwoKICAgIEFscGFjYS5pbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIHZhbCkKICAgIHsKICAgICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgYXJyYXkpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBNb21lbnQuanMgc3RhdGljCiAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgQWxwYWNhLm1vbWVudCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICBpZiAoIUFscGFjYS5fbW9tZW50KSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuX21vbWVudCA9IHdpbmRvdy5tb21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghQWxwYWNhLl9tb21lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgbW9tZW50LmpzIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGluY2x1ZGVkLCBjYW5ub3QgcHJvZHVjZSBtb21lbnQgb2JqZWN0Iik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLl9tb21lbnQuY2FsbCh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDU1JGIFN1cHBvcnQKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuQ1NSRl9UT0tFTiA9IG51bGw7CiAgICBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMgPSBbIkNTUkYtVE9LRU4iLCAiWFNSRi1UT0tFTiJdOwogICAgQWxwYWNhLkNTUkZfSEVBREVSX05BTUUgPSAiWC1DU1JGLVRPS0VOIjsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBTVEFUSUMgREVGQVVMVFMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAvLyB1c2UgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgInN0aWNreSIgdG9vbGJhciBiZWhhdmlvcgogICAgLy8gc2V0IHRvIHRydWUgdG8gaGF2ZSB0b29sYmFycyBhbHdheXMgc3RpY2sgb3IgdW5kZWZpbmVkIHRvIGhhdmUgdGhlbSBhcHBlYXIgb24gaG92ZXIKICAgIEFscGFjYS5kZWZhdWx0VG9vbGJhclN0aWNreSA9IHVuZGVmaW5lZDsKCiAgICAvLyB1c2UgdGhpcyB0byBoYXZlIGludmFsaWQgbWVzc2FnZXMgc2hvdyB1cCBmb3IgcmVhZC1vbmx5IGZpZWxkcwogICAgQWxwYWNhLnNob3dSZWFkT25seUludmFsaWRTdGF0ZSA9IGZhbHNlOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vCiAgICAvLyBDQUNIRSBJTVBMRU1FTlRBVElPTlMKICAgIC8vCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICBBbHBhY2EuY2FjaGVzID0ge307CiAgICBBbHBhY2EucmVnaXN0ZXJDYWNoZSA9IGZ1bmN0aW9uKGlkLCBjYWNoZUZuKQogICAgewogICAgICAgIEFscGFjYS5jYWNoZXNbaWRdID0gY2FjaGVGbjsKICAgIH07CiAgICBBbHBhY2EuZ2V0Q2FjaGUgPSBmdW5jdGlvbihpZCkKICAgIHsKICAgICAgICByZXR1cm4gQWxwYWNhLmNhY2hlc1tpZF07CiAgICB9OwoKCn0pKGpRdWVyeSk7CgovKmpzaGludCAtVzAxNCAqLyAvLyBiYWQgbGluZSBicmVha2luZwovKmpzaGludCAtVzAwNCAqLyAvLyBkdXBsaWNhdGUgdmFyaWFibGVzCihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLmxpc3RlbmVySWQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJsaXN0ZW5lci0iICsgKHgrKyk7CiAgICAgICAgfTsKICAgIH0oKTsKCiAgICAvKioKICAgICAqIFN1YnNjcmliZXMgYSBmdW5jdGlvbiBoYW5kbGVyIHRvIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja0Z1bmN0aW9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gZGVzY3JpcHRvcgogICAgICovCiAgICBBbHBhY2Euc3Vic2NyaWJlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwoKICAgICAgICB2YXIgc2NvcGUgPSBudWxsOwogICAgICAgIHZhciBpZCA9IG51bGw7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbGlzdGVuZXIgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBzdWJzY3JpYmUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXIuX2xmaWQ7CiAgICAgICAgaWYgKCFsaXN0ZW5lcklkKSB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBBbHBhY2EubGlzdGVuZXJJZCgpOwogICAgICAgICAgICBsaXN0ZW5lci5fbGZpZCA9IGxpc3RlbmVySWQ7CiAgICAgICAgfQoKICAgICAgICAvLyB3cmFwIGZ1bmN0aW9uIGludG8gYSBjbG9zdXJlCiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbih0aGF0KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgIH0odGhpcyk7CiAgICAgICAgZnVuYy5fbGZpZCA9IGxpc3RlbmVyLl9sZmlkOwoKICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0KHNjb3BlKTsKICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzLm9ic2VydmFibGUoaWQpOwoKICAgICAgICAvLyB0ZWxsIHRoZSBvYnNlcnZhYmxlIHRvIHN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKGxpc3RlbmVySWQsIGZ1bmMpOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2NvcGUiOiBzY29wZSwKICAgICAgICAgICAgImlkIjogaWQsCiAgICAgICAgICAgICJsaXN0ZW5lcklkIjogbGlzdGVuZXJJZAogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogVW5zdWJzY3JpYmVzIGEgZnVuY3Rpb24gaGFuZGxlciBmcm9tIGFuIG9ic2VydmFibGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbGlzdGVuZXIgZWl0aGVyIHRoZSBmdW5jdGlvbiBvciBsaXN0ZW5lciBpZAogICAgICogQHJldHVybiBkZXNjcmlwdG9yCiAgICAgKi8KICAgIEFscGFjYS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBsaXN0ZW5lck9ySWQgPSBudWxsOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gImdsb2JhbCI7CiAgICAgICAgICAgIGlkID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBsaXN0ZW5lck9ySWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDMpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpc3RlbmVyT3JJZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHZhciBsaXN0ZW5lcklkID0gbGlzdGVuZXJPcklkOwogICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihsaXN0ZW5lcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkLl9sZmlkOwogICAgICAgIH0KCiAgICAgICAgLy8gcGljayBvZmYgcGF0aCBpZiBpZCBpcyBhIGZpZWxkCiAgICAgICAgaWYgKGlkICYmIEFscGFjYS5pc09iamVjdChpZCkpCiAgICAgICAgewogICAgICAgICAgICBpZCA9IGlkLnBhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlkKQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJNaXNzaW5nIG9ic2VydmFibGUgaWQ6ICIgKyBpZCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgLy8gdGVsbCB0aGUgb2JzZXJ2YWJsZSB0byB1bnN1YnNjcmliZQogICAgICAgIG9ic2VydmFibGUudW5zdWJzY3JpYmUobGlzdGVuZXJJZCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzY29wZSI6IHNjb3BlLAogICAgICAgICAgICAiaWQiOiBpZCwKICAgICAgICAgICAgImxpc3RlbmVySWQiOiBsaXN0ZW5lcklkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgYW4gb2JzZXJ2YWJsZSBpbiB0aGUgZ2l2ZW4gc2NvcGUuCiAgICAgKgogICAgICogQHBhcmFtIFtTdHJpbmddIHNjb3BlIG9wdGlvbmFsIHNjb3BlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIHZhcmlhYmxlIGlkCiAgICAgKi8KICAgIEFscGFjYS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlcy5vYnNlcnZhYmxlKGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfTsKCiAgICBBbHBhY2EuY2xlYXJPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBzY29wZTsKICAgICAgICB2YXIgaWQ7CgogICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgaWQgPSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBwaWNrIG9mZiBwYXRoIGlmIGlkIGlzIGEgZmllbGQKICAgICAgICBpZiAoaWQgJiYgQWxwYWNhLmlzT2JqZWN0KGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gaWQucGF0aDsKICAgICAgICB9CgogICAgICAgIGlmICghaWQpCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIk1pc3Npbmcgb2JzZXJ2YWJsZSBpZDogIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsKICAgICAgICB9CgogICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5nZXQoc2NvcGUpOwogICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXMub2JzZXJ2YWJsZShpZCk7CgogICAgICAgIG9ic2VydmFibGUuY2xlYXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbmQgZ2V0cyBhIGRlcGVuZGVudCBvYnNlcnZhYmxlIGluIGEgZ2l2ZW4gc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NvcGUKICAgICAqIEBwYXJhbSBpZAogICAgICogQHBhcmFtIGZ1bmMKICAgICAqLwogICAgQWxwYWNhLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIHNjb3BlID0gbnVsbDsKICAgICAgICB2YXIgaWQgPSBudWxsOwogICAgICAgIHZhciBmdW5jID0gbnVsbDsKCiAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDIpCiAgICAgICAgewogICAgICAgICAgICBzY29wZSA9ICJnbG9iYWwiOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHNjb3BlID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgICBpZCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgZnVuYyA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQWxwYWNhLmVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBpY2sgb2ZmIHBhdGggaWYgaWQgaXMgYSBmaWVsZAogICAgICAgIGlmIChpZCAmJiBBbHBhY2EuaXNPYmplY3QoaWQpKQogICAgICAgIHsKICAgICAgICAgICAgaWQgPSBpZC5wYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpZCkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiTWlzc2luZyBvYnNlcnZhYmxlIGlkOiAiICsgSlNPTi5zdHJpbmdpZnkoYXJncykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLmdldChzY29wZSk7CgogICAgICAgIHJldHVybiBvYnNlcnZhYmxlcy5kZXBlbmRlbnRPYnNlcnZhYmxlKGlkLCBmdW5jKTsKICAgIH07Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkKewogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8qKgogICAgICogQ29sbGVjdGlvbiBvZiBvYnNlcnZhYmxlcy4KICAgICAqLwogICAgQWxwYWNhLk9ic2VydmFibGVzID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHNjb3BlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CgogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oaWQsIGluaXRpYWxWYWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlKHRoaXMuc2NvcGUsIGlkKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuc2V0KGluaXRpYWxWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlc1tpZF0gPSBvYnNlcnZhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgZnJvbSBtYXAKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbaWRdOwogICAgICAgIH0sCgogICAgICAgIGRlcGVuZGVudE9ic2VydmFibGU6IGZ1bmN0aW9uKGlkLCBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICghdGhpcy5vYnNlcnZhYmxlc1tpZF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gdGhpcy5vYnNlcnZhYmxlKGlkKTsKCiAgICAgICAgICAgICAgICAvLyB3cmFwIHRoZSBtb2RlbAogICAgICAgICAgICAgICAgdmFyIG0gPSBuZXcgQWxwYWNhLk9ic2VydmFibGVzKHRoaXMuc2NvcGUpOwogICAgICAgICAgICAgICAgbS5vYnNlcnZhYmxlID0gZnVuY3Rpb24oeCwgeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvL1JhdGNoZXQuZGVidWcoIk9ic2VydmFibGU6ICIgKyBvYnNlcnZhYmxlLmlkICsgIiBkZXBlbmRzIG9uIG9ic2VydmFibGU6ICIgKyB4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IF90aGlzLm9ic2VydmFibGUoeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgby5tYXJrRGVwZW5kZW50T25VcyhvYnNlcnZhYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgZnVuY3Rpb24gKHdoZXJlICJ0aGlzIiA9IHRoZSBtb2RlbCkKICAgICAgICAgICAgICAgIHZhciB2YWx1ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChtKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmFibGVzOwogICAgICAgIH0KCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKQp7CiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk9ic2VydmFibGUgPSBCYXNlLmV4dGVuZCgKICAgIHsKICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oc2NvcGUsIGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdGhpcy5pZCA9IHNjb3BlICsgIi0iICsgaWQ7CgogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IHt9OwoKICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBjb250YWlucyBvYnNlcnZhYmxlIHdob3NlIHZhbHVlIGlzIGRlcGVuZGVudCBvbiBvdXIgdmFsdWUKICAgICAgICAgICAgdGhpcy5kZXBlbmRlbnRPblVzID0ge307CgoKICAgICAgICAgICAgLy8gcHJpdmlsZWdlZCBmdW5jdGlvbnMKCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMgPSBmdW5jdGlvbihwcmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5zdWJzY3JpYmVycywgZnVuY3Rpb24oaWQsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKF90aGlzLnZhbHVlLCBwcmlvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyA9IGZ1bmN0aW9uKHByaW9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5kZXBlbmRlbnRPblVzLCBmdW5jdGlvbihrZXksIG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGFzc3VtZSBudWxsIHZhbHVlIGZ1bmN0aW9uCiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWVGdW5jdGlvbjogZnVuY3Rpb24odmFsdWVGdW5jdGlvbikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMub25EZXBlbmRlbmN5Q2hhbmdlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciB3aGljaCBhY3RzIGFzIGEgc3Vic2NyaWJlci4gIFdoZW4gdGhpcyBvYnNlcnZhYmxlIHZhbHVlIGNoYW5nZXMsCiAgICAgICAgICogdGhlIGhhbmRsZXIgbWV0aG9kIGlzIHJhaXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmCiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbihpZCwgaGFuZGxlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N1YnNjcmliZWQoaWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzW2lkXSA9IGhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oaWQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpYmVyc1tpZF07CiAgICAgICAgfSwKCiAgICAgICAgaXNTdWJzY3JpYmVkOiBmdW5jdGlvbihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zdWJzY3JpYmVyc1tpZF0gPyB0cnVlOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgbWFya0RlcGVuZGVudE9uVXM6IGZ1bmN0aW9uKG9ic2VydmFibGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRlcGVuZGVudE9uVXNbb2JzZXJ2YWJsZS5pZF0gPSBvYnNlcnZhYmxlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIG91ciBkZXBlbmRlbnRzIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVuY3lDaGFuZ2U6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmlvciA9IHRoaXMuZ2V0KCk7CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24sIGZpcmUgaXQKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVGdW5jdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLnZhbHVlRnVuY3Rpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgY2hhbmdlZCwgbm90aWZ5CiAgICAgICAgICAgICAgICBpZiAocHJpb3IgIT0gY3VycmVudCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChjdXJyZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIGRlcGVuZGVudHMgKG9ic2VydmVycyB0aGF0IGRlcGVuZCBvbiBvdXIgdmFsdWUpCiAgICAgICAgICAgIHRoaXMubm90aWZ5RGVwZW5kZW50cyhwcmlvcik7CgogICAgICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIG9mIHRoZSB1cGRhdGVkIHZhbHVlCiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMocHJpb3IpOwogICAgICAgIH0sCgogICAgICAgIGdldDogZnVuY3Rpb24oX2RlZmF1bHQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdiA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICghdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdiA9IF9kZWZhdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0sCgogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcHJpb3IgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgZGVwZW5kZW50cyAob2JzZXJ2ZXJzIHRoYXQgZGVwZW5kIG9uIG91ciB2YWx1ZSkKICAgICAgICAgICAgdGhpcy5ub3RpZnlEZXBlbmRlbnRzKHByaW9yKTsKCiAgICAgICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgb2YgdGhlIHVwZGF0ZWQgdmFsdWUKICAgICAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhwcmlvcik7CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpCnsKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMgPSB7fTsKICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXAgPSB7fTsKCiAgICBBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMuZ2V0ID0gZnVuY3Rpb24oc2NvcGUpCiAgICB7CiAgICAgICAgaWYgKCFBbHBhY2EuU2NvcGVkT2JzZXJ2YWJsZXMubWFwW3Njb3BlXSkKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5TY29wZWRPYnNlcnZhYmxlcy5tYXBbc2NvcGVdID0gbmV3IEFscGFjYS5PYnNlcnZhYmxlcyhzY29wZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWxwYWNhLlNjb3BlZE9ic2VydmFibGVzLm1hcFtzY29wZV07CiAgICB9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigpCnsKICAgIEFscGFjYS5UZW1wbGF0ZUVuZ2luZVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihpZCwgZW5naW5lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWdpc3RyeVtpZF0gPSBlbmdpbmU7CgogICAgICAgICAgICAgICAgZW5naW5lLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGlkT3JUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW5naW5lID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbaWRPclR5cGVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IHJlZ2lzdHJ5W2lkT3JUeXBlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNwZWN0IGJ5IHR5cGUKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpZCBpbiByZWdpc3RyeSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdXBwb3J0ZWRNaW1ldHlwZXMgPSByZWdpc3RyeVtpZF0uc3VwcG9ydGVkTWltZXR5cGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydGVkTWltZXR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRPclR5cGUudG9Mb3dlckNhc2UoKSA9PT0gc3VwcG9ydGVkTWltZXR5cGVzW2ldLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lID0gcmVnaXN0cnlbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpZHM6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlkcyA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaWRzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KSgpOwoKKGZ1bmN0aW9uKCQpCnsKICAgIEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lID0gQmFzZS5leHRlbmQoCiAgICB7CiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CgogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBmdW5jdGlvbihodG1sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBpZiBzdGFydHMgd2l0aCBhIHNjcmlwdCB0YWcsIHRoZW4gd2Ugc3RyaXAgdGhhdCBvdXQKICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKS5sZW5ndGggPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChodG1sKVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAic2NyaXB0IikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbCkuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgKG9yIFVSSSBvciBkb20gc2VsZWN0b3IpCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgZmlyZWQgb25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMgYW5kIGhhcyBzaWduYXR1cmUgY2FsbGJhY2soZXJyKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWNoZUtleQogICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSBjb25uZWN0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgdGVtcGxhdGUsIGNvbm5lY3RvciwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgdmFsdWUgYmVpbmcgY29tcGlsZWQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgSFRNTAogICAgICAgICAgICAvLyAgIFVSTCAoaHR0cCwgLi8gb3IgLykKICAgICAgICAgICAgLy8gICBkb20gc2VsZWN0b3IgKCNhYmMsIC5jbGFzc25hbWUpCiAgICAgICAgICAgIC8vICAgZG9tIGVsZW1lbnQKCiAgICAgICAgICAgIC8vIGhlcmUgd2UgdHJ5IHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdmFsdWUgaXQgaXMKICAgICAgICAgICAgdmFyIHR5cGUgPSAiaHRtbCI7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGVtcGxhdGUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGMgPSB0ZW1wbGF0ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShsYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ1cmkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuaW5kZXhPZigiIyIpID09PSAwIHx8IHRlbXBsYXRlLmluZGV4T2YoIi4iKSA9PT0gMCB8fCB0ZW1wbGF0ZS5pbmRleE9mKCJbIikgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzZWxlY3RvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZG9tIGVsZW1lbnQsIHdlIGZsb3cgdGhyb3VnaAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBub3cgZXh0cmFjdCBodG1sIGFuZCBjb21waWxlCiAgICAgICAgICAgIGlmICh0eXBlID09PSAic2VsZWN0b3IiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCB0ZW1wbGF0ZSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJ1cmkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZUV4dGVuc2lvbiA9IHNlbGYuZmlsZUV4dGVuc2lvbigpOwoKICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigiLiIgKyBmaWxlRXh0ZW5zaW9uKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIi4iICsgZmlsZUV4dGVuc2lvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgY29ubmVjdG9yCiAgICAgICAgICAgICAgICBjb25uZWN0b3IubG9hZFRlbXBsYXRlKHVybCwgZnVuY3Rpb24oaHRtbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICBodG1sID0gc2VsZi5jbGVhbnVwKGh0bWwpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgInVybCI6IHVybCwKICAgICAgICAgICAgICAgICAgICAiZGF0YVR5cGUiOiAiaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiOiBmdW5jdGlvbihodG1sLCBjb2RlLCB4aHIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwIGh0bWwKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHNlbGYuY2xlYW51cChodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbih4aHIsIGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHhoci5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGhyIjogeGhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiOiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAiaHRtbCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIGpRdWVyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJChodG1sKS5vdXRlckhUTUwoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLl9jb21waWxlKGNhY2hlS2V5LCBodG1sLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoIlRlbXBsYXRlIGVuZ2luZSBjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdHlwZTogIiArIHR5cGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jb21waWxlOiBmdW5jdGlvbihjYWNoZUtleSwgaHRtbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICAvLyBmb3IgbnVsbCB0ZW1wbGF0ZXMsIHNldCB0byBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KGh0bWwpKSB7CiAgICAgICAgICAgICAgICBodG1sID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaW0gdGhlIGh0bWwKICAgICAgICAgICAgaHRtbCA9IEFscGFjYS50cmltKGh0bWwpOwoKICAgICAgICAgICAgaWYgKGh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCI8c2NyaXB0IikgPT09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIHNjcmlwdCB0YWcKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHNjcmlwdCB0YWcKICAgICAgICAgICAgICAgIGh0bWwgPSAiPHNjcmlwdCB0eXBlPSciICsgdGhpcy5zdXBwb3J0ZWRNaW1ldHlwZXMoKVswXSArICInPiIgKyBodG1sICsgIjwvc2NyaXB0PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQ29tcGlsaW5nIHRlbXBsYXRlOiAiICsgdGhpcy5pZCArICIsIGNhY2hlS2V5OiAiICsgY2FjaGVLZXkgKyAiLCB0ZW1wbGF0ZTogIiArIGh0bWwpOwoKICAgICAgICAgICAgdGhpcy5kb0NvbXBpbGUoY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKiBAcGFyYW0gaHRtbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGRvQ29tcGlsZTogZnVuY3Rpb24oY2FjaGVLZXksIGh0bWwsIGNhbGxiYWNrKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBleGVjdXRlOiBmdW5jdGlvbihjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkV4ZWN1dGluZyB0ZW1wbGF0ZSBmb3IgY2FjaGUga2V5OiAiICsgY2FjaGVLZXkpOwoKICAgICAgICAgICAgdmFyIGh0bWwgPSB0aGlzLmRvRXhlY3V0ZShjYWNoZUtleSwgbW9kZWwsIGVycm9yQ2FsbGJhY2spOwoKICAgICAgICAgICAgLy8gcmVtb3ZlcyB3cmFwcGluZyA8c2NyaXB0Lz4gdGFnCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFudXAoaHRtbCk7CgogICAgICAgICAgICByZXR1cm4gaHRtbDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlIGEgdGVtcGxhdGUgYW5kIGhhbmQgYmFjayBhIHRleHQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGV4dGVuc2lvbl9wb2ludAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhY2hlS2V5CiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGV4cGVjdGVkIGZpbGUgZXh0ZW5zaW9uIGZvciB0ZW1wbGF0ZXMgbG9hZGVkIHZpYSBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZmlsZUV4dGVuc2lvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaHRtbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHNjcmlwdCB0YWcgdHlwZXMgZm9yIHRlbXBsYXRlcyBsb2FkZWQgZnJvbSB0aGUgRE9NLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7QXJyYXl9CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydGVkTWltZXR5cGVzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV4aXN0aW5nIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FjaGVLZXkKICAgICAgICAgKi8KICAgICAgICBpc0NhY2hlZDogZnVuY3Rpb24oY2FjaGVLZXkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWNxdWlyZXMgYW4gYXJyYXkgb2YgY2FjaGUga2V5cyBtYXRjaGluZyB0aGUgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2aWV3SWQKICAgICAgICAgKi8KICAgICAgICBmaW5kQ2FjaGVLZXlzOiBmdW5jdGlvbih2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQoKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkLCBIYW5kbGViYXJzLCBIYW5kbGViYXJzUHJlY29tcGlsZWQpCnsKICAgIC8vIHJ1bnRpbWUgY2FjaGUgb2YgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGtleWVkIGJ5IGNhY2hlS2V5CiAgICB2YXIgQ09NUElMRURfVEVNUExBVEVTID0ge307CgogICAgdmFyIGhlbHBlcnMgPSB7fTsKICAgIGhlbHBlcnNbImNvbXBhcmUiXSA9IGZ1bmN0aW9uKGx2YWx1ZSwgcnZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkhhbmRsZXJiYXJzIEhlbHBlciAnY29tcGFyZScgbmVlZHMgMiBwYXJhbWV0ZXJzIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgb3BlcmF0b3IgPSBvcHRpb25zLmhhc2gub3BlcmF0b3IgfHwgIj09IjsKCiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IHsKICAgICAgICAgICAgJz09JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID09IHI7IH0sIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAnPT09JzogICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPT09IHI7IH0sCiAgICAgICAgICAgICchPSc6ICAgICAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gbCAhPSByOyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgJyE9PSc6ICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsICE9PSByOyB9LAogICAgICAgICAgICAnPCc6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPCByOyB9LAogICAgICAgICAgICAnPic6ICAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPiByOyB9LAogICAgICAgICAgICAnPD0nOiAgICAgICBmdW5jdGlvbihsLHIpIHsgcmV0dXJuIGwgPD0gcjsgfSwKICAgICAgICAgICAgJz49JzogICAgICAgZnVuY3Rpb24obCxyKSB7IHJldHVybiBsID49IHI7IH0sCiAgICAgICAgICAgICd0eXBlb2YnOiAgIGZ1bmN0aW9uKGwscikgeyByZXR1cm4gdHlwZW9mIGwgPT0gcjsgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICB9OwoKICAgICAgICBpZiAoIW9wZXJhdG9yc1tvcGVyYXRvcl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIYW5kbGVyYmFycyBIZWxwZXIgJ2NvbXBhcmUnIGRvZXNuJ3Qga25vdyB0aGUgb3BlcmF0b3IgIitvcGVyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVzdWx0ID0gb3BlcmF0b3JzW29wZXJhdG9yXShsdmFsdWUscnZhbHVlKTsKCiAgICAgICAgaWYoIHJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1siaWZub3QiXSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKQogICAgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKICAgICAgICB9CiAgICB9OwogICAgaGVscGVyc1sidGltZXMiXSA9IGZ1bmN0aW9uKG4sIGJsb2NrKSB7CiAgICAgICAgdmFyIGFjY3VtID0gJyc7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGFjY3VtICs9IGJsb2NrLmZuKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW07CiAgICB9OwogICAgaGVscGVyc1siY29udHJvbCJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImNvbnRhaW5lciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1siaXRlbSJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbIml0ZW1GaWVsZCJdID0gZnVuY3Rpb24odGFnLCBvcHRpb25zKQogICAgewogICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGFnKSkKICAgICAgICB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB0YWc7CiAgICAgICAgICAgIHRhZyA9ICJkaXYiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICI8IiArIHRhZyArICIgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEICsgIic+PC8iICsgdGFnICsgIj4iOwogICAgfTsKICAgIGhlbHBlcnNbImZvcm1JdGVtcyJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICByZXR1cm4gIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0ZPUk1fSVRFTVNfRklFTEQgKyAiJz48L2Rpdj4iOwogICAgfTsKICAgIGhlbHBlcnNbImluc2VydCJdID0gZnVuY3Rpb24oa2V5KQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfSU5TRVJUICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9JTlNFUlRfS0VZICsgIj0nIiArIGtleSArICInPjwvZGl2PiI7CiAgICB9OwogICAgaGVscGVyc1sic3RyIl0gPSBmdW5jdGlvbihkYXRhKQogICAgewogICAgICAgIGlmIChkYXRhID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkYXRhID09PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJ0cnVlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAidW5kZWZpbmVkIikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzU3RyaW5nKGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc051bWJlcihkYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgIiAgIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICIgICIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgaGVscGVyc1siYXJyYXlUb29sYmFyIl0gPSBmdW5jdGlvbihvcHRpb25zKQogICAgewogICAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyB0aGlzLmlkICsgIic+PC9kaXY+IjsKICAgIH07CiAgICBoZWxwZXJzWyJhcnJheUFjdGlvbmJhciJdID0gZnVuY3Rpb24ob3B0aW9ucykKICAgIHsKICAgICAgICB2YXIgaHRtbCA9ICI8ZGl2IGNsYXNzPSciICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9LRVkgKyAiPSciICsgdGhpcy5uYW1lICsgIiciOwogICAgICAgIGh0bWwgKz0gIiAiICsgQWxwYWNhLk1BUktFUl9EQVRBX0FSUkFZX0lURU1fRklFTERfSUQgKyAiPSciICsgdGhpcy5pZCArICInIjsKICAgICAgICBpZiAodGhpcy5wYXJlbnRGaWVsZElkKQogICAgICAgIHsKICAgICAgICAgICAgaHRtbCArPSAiICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9QQVJFTlRfRklFTERfSUQgKyAiPSciICsgdGhpcy5wYXJlbnRGaWVsZElkICsgIiciCiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gIj48L2Rpdj4iOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH07CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheVRvb2xiYXIiLCBoZWxwZXJzWyJhcnJheVRvb2xiYXIiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJhcnJheUFjdGlvbmJhciIsIGhlbHBlcnNbImFycmF5QWN0aW9uYmFyIl0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNldEluZGV4IiwgZnVuY3Rpb24odmFsdWUpewogICAgICAgIHRoaXMuaW5kZXggPSBOdW1iZXIodmFsdWUpOwogICAgfSk7CgogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZWFjaFByb3BlcnR5IiwgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHZhciByZXQgPSAiIjsKICAgICAgICBmb3IodmFyIHByb3AgaW4gY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IHJldCArIG9wdGlvbnMuZm4oe2tleTpwcm9wLHZhbHVlOmNvbnRleHRbcHJvcF19KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0pOwoKCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ1cGxvYWRFcnJvck1lc3NhZ2UiLCBmdW5jdGlvbihlcnJvcikgewoKICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yOwoKICAgICAgICBpZiAoZXJyb3IgPT09IDEpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyB1cGxvYWRfbWF4X2ZpbGVzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgZXhjZWVkcyBNQVhfRklMRV9TSVpFIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDMpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgd2FzIG9ubHkgcGFydGlhbGx5IHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDQpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk5vIEZpbGUgd2FzIHVwbG9hZGVkIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDUpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1pc3NpbmcgYSB0ZW1wb3JhcnkgZm9sZGVyIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IDYpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byB3cml0ZSBmaWxlIHRvIGRpc2siOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gNykKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSB1cGxvYWQgc3RvcHBlZCBieSBleHRlbnNpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gIm1heEZpbGVTaXplIikKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSBpcyB0b28gYmlnIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJtaW5GaWxlU2l6ZSIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgaXMgdG9vIHNtYWxsIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJhY2NlcHRGaWxlVHlwZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJGaWxldHlwZSBub3QgYWxsb3dlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm9yID09PSAibWF4TnVtYmVyT2ZGaWxlcyIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIk1heCBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gInVwbG9hZGVkQnl0ZXMiKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9ICJVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09ICJlbXB0eVJlc3VsdCIpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gIkVtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0pOwoKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImRpc2d1aXNlIiwgZnVuY3Rpb24odGV4dCwgY2hhcmFjdGVyKSB7CgogICAgICAgIHZhciByZXBsYWNlZCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXBsYWNlZCArPSBjaGFyYWN0ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CgogICAgfSk7CgoKCiAgICAvL0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVhY2giLCBoZWxwZXJzWyJlYWNoIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiY29tcGFyZSIsIGhlbHBlcnNbImNvbXBhcmUiXSk7CiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJjb250cm9sIiwgaGVscGVyc1siY29udHJvbCJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImNvbnRhaW5lciIsIGhlbHBlcnNbImNvbnRhaW5lciJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoIml0ZW0iLCBoZWxwZXJzWyJpdGVtIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiaXRlbUZpZWxkIiwgaGVscGVyc1siaXRlbUZpZWxkIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZm9ybUl0ZW1zIiwgaGVscGVyc1siZm9ybUl0ZW1zIl0pOwogICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigidGltZXMiLCBoZWxwZXJzWyJ0aW1lcyJdKTsKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInN0ciIsIGhlbHBlcnNbInN0ciJdKTsKCiAgICAvLyB3aXRoCiAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpOwogICAgfSk7CgogICAgLy8gaWZub3QKICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlmbm90IiwgaGVscGVyc1siaWZub3QiXSk7CgogICAgdmFyIHBhcnRpYWxzID0ge307CgogICAgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSA9IEFscGFjYS5BYnN0cmFjdFRlbXBsYXRlRW5naW5lLmV4dGVuZCgKICAgIHsKICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICB9LAoKICAgICAgICBzdXBwb3J0ZWRNaW1ldHlwZXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInRleHQveC1oYW5kbGViYXJzLXRtcGwiCiAgICAgICAgICAgIF07CiAgICAgICAgfSwKCiAgICAgICAgaW5pdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0byBkaXNjb3ZlciBhbnkgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGFuZCBzdG9yZSB0aGVtIGJ5IGNhY2hlIGtleSBoZXJlCiAgICAgICAgICAgIGlmIChIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHZpZXdJZCBpbiBIYW5kbGViYXJzUHJlY29tcGlsZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdUZW1wbGF0ZXMgPSBIYW5kbGViYXJzUHJlY29tcGlsZWRbdmlld0lkXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ZW1wbGF0ZUlkIGluIHZpZXdUZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB2aWV3VGVtcGxhdGVzW3RlbXBsYXRlSWRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBBbHBhY2EubWFrZUNhY2hlS2V5KHZpZXdJZCwgInZpZXciLCB2aWV3SWQsIHRlbXBsYXRlSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID0gdGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkb0NvbXBpbGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBodG1sLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TdHJpbmcgPSBIYW5kbGViYXJzLnByZWNvbXBpbGUoaHRtbCk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGV2YWwoIigiICsgZnVuY3Rpb25TdHJpbmcgKyAiKSIpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKCiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZ1bmN0aW9uIC0gZm4obW9kZWwpCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMudGVtcGxhdGUodGVtcGxhdGUpOwoKICAgICAgICAgICAgICAgIC8vIENBQ0hFOiB3cml0ZQogICAgICAgICAgICAgICAgQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICBkb0V4ZWN1dGU6IGZ1bmN0aW9uKGNhY2hlS2V5LCBtb2RlbCwgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIENBQ0hFOiByZWFkCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZ1bmN0aW9uID0gQ09NUElMRURfVEVNUExBVEVTW2NhY2hlS2V5XTsKICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUZ1bmN0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgaGFuZGxlYmFycyBjYWNoZWQgdGVtcGxhdGUgZm9yIGtleTogIiArIGNhY2hlS2V5KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbmRlciB0ZW1wbGF0ZQogICAgICAgICAgICB2YXIgaHRtbCA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGVGdW5jdGlvbihtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfSwKCiAgICAgICAgaXNDYWNoZWQ6IGZ1bmN0aW9uKGNhY2hlS2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChDT01QSUxFRF9URU1QTEFURVNbY2FjaGVLZXldID8gdHJ1ZSAgOiBmYWxzZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZENhY2hlS2V5czogZnVuY3Rpb24odmlld0lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhY2hlS2V5cyA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgY2FjaGVLZXkgaW4gQ09NUElMRURfVEVNUExBVEVTKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkuaW5kZXhPZih2aWV3SWQgKyAiOiIpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5wdXNoKGNhY2hlS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5czsKICAgICAgICB9CgogICAgfSk7CgogICAgLy8gYXV0byByZWdpc3RlcgogICAgQWxwYWNhLlRlbXBsYXRlRW5naW5lUmVnaXN0cnkucmVnaXN0ZXIoImhhbmRsZWJhcnMiLCBuZXcgQWxwYWNhLkhhbmRsZWJhcnNUZW1wbGF0ZUVuZ2luZSgiaGFuZGxlYmFycyIpKTsKCn0pKGpRdWVyeSwgKCh0eXBlb2YoSGFuZGxlYmFycykgIT0gInVuZGVmaW5lZCIpID8gSGFuZGxlYmFycyA6IHdpbmRvdy5IYW5kbGViYXJzKSwgKCh0eXBlb2YoSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSAhPSAidW5kZWZpbmVkIikgPyBIYW5kbGViYXJzUHJlY29tcGlsZWQgOiB3aW5kb3cuSGFuZGxlYmFyc1ByZWNvbXBpbGVkKSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuTm9ybWFsaXplZFZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5Ob3JtYWxpemVkVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIE9uY2UgYWxsIG9mIHRoZSBBbHBhY2Egdmlld3MgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrLCBlYWNoIGlzIG5vcm1hbGl6ZWQgc28gdGhhdCBwYXJlbnQtY2hhaW4KICAgICAgICAgKiByZWZlcmVuY2VzIGFuZCBvdmVycmlkZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBhIHNpbmdsZSwgZmFzdCBsb29rdXAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBOb3JtYWxpemVkIHZpZXcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhlIHZpZXcgaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlld0lkKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB2aWV3SWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXphdGlvbiBvY2N1cnMgb25jZSBwZXIgdmlldyB1cG9uIHN0YXJ0dXAgb2YgQWxwYWNhLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24odmlld3MpCiAgICAgICAgewogICAgICAgICAgICAvLyBsb2FkIHRoZSB2aWV3IG9iamVjdAogICAgICAgICAgICB2YXIgdmlld09iamVjdCAgPSB2aWV3c1t0aGlzLmlkXTsKICAgICAgICAgICAgaWYgKCF2aWV3T2JqZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIlZpZXcgY29tcGlsYXRpb24gZmFpbGVkIC0gdmlldyBub3QgZm91bmQ6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KICAgICAgICAgICAgdmFyIGNoYWluID0gW107CiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld09iamVjdDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7CgogICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY3VycmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gdmlld3NbY3VycmVudC5wYXJlbnRdOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiVmlldyBjb21waWxhdGlvbiBmYWlsZWQgLSBjYW5ub3QgZmluZCBwYXJlbnQgdmlldzogIiArIHBhcmVudElkICsgIiBmb3IgdmlldzogIiArIGN1cnJlbnQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJldmVyc2UgdGhlIGNoYWluCiAgICAgICAgICAgIGNoYWluID0gY2hhaW4ucmV2ZXJzZSgpOwoKICAgICAgICAgICAgdmFyIHNldFNjYWxhciA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgdmFsdWU6ICIgKyBjdXJyZW50VmFsdWUgKyAiIGFuZCBvdmVyd3JpdGluZyB0bzogIiArIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBzZXRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbcHJvcGVydHlJZF07CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzVW5kZWZpbmVkKGN1cnJlbnRWYWx1ZSkgJiYgIUFscGFjYS5pc1VuZGVmaW5lZCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJWaWV3IHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCArICIgYWxyZWFkeSBoYXMgZnVuY3Rpb24sIG92ZXJ3cml0aW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNVbmRlZmluZWQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5SWRdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWVyZ2VNYXAgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgcHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZVtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VNYXApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcGVydHlJZF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdDIoc291cmNlTWFwLCB0YXJnZXRbcHJvcGVydHlJZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd2FsayBmb3J3YXJkIGFuZCBhcHBseQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYWluW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydGllcwogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ0eXBlIik7IC8vIHZpZXcsIGVkaXQsIGNyZWF0ZQogICAgICAgICAgICAgICAgc2V0U2NhbGFyKHRoaXMsIGVsZW1lbnQsICJ1aSIpOyAvLyBib290c3RyYXAsIGpxdWVyeXVpLCBqcXVlcnltb2JpbGUsIHdlYgoKICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIHZpZXcgaXMgcmVhZG9ubHkKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZGlzcGxheVJlYWRvbmx5Iik7CgogICAgICAgICAgICAgICAgLy8gbG9jYWxlCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImxvY2FsZSIpOwoKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInJlbmRlciIpOwogICAgICAgICAgICAgICAgc2V0RnVuY3Rpb24odGhpcywgZWxlbWVudCwgInBvc3RSZW5kZXIiKTsKCiAgICAgICAgICAgICAgICAvLyB2aWV3IHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInRlbXBsYXRlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImZpZWxkcyIpOwoKICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImxheW91dCIpOwoKICAgICAgICAgICAgICAgIC8vIHN0eWxlcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgInN0eWxlcyIpOwoKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgImNhbGxiYWNrcyIpOwoKICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBtZXJnZU1hcCh0aGlzLCBlbGVtZW50LCAibWVzc2FnZXMiKTsKCiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsCiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImhvcml6b250YWwiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgc29tZSBvZiB0aGVzZT8KICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAibGVnZW5kU3R5bGUiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAidG9vbGJhclN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgImJ1dHRvblN0eWxlIik7CiAgICAgICAgICAgICAgICBzZXRTY2FsYXIodGhpcywgZWxlbWVudCwgInRvb2xiYXJTdGlja3kiKTsKICAgICAgICAgICAgICAgIHNldFNjYWxhcih0aGlzLCBlbGVtZW50LCAiZ2xvYmFsVGVtcGxhdGUiKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgd2l6YXJkPwogICAgICAgICAgICAgICAgbWVyZ2VNYXAodGhpcywgZWxlbWVudCwgIndpemFyZCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZpZXcgY29tcGlsYXRpb24gY29tcGxldGUgZm9yIHZpZXc6ICIgKyB0aGlzLmlkKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJGaW5hbCB2aWV3OiAiKTsKICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsICIgICAiKSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9KTsKfSkoalF1ZXJ5KTsKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuUnVudGltZVZpZXcgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5SdW50aW1lVmlldy5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnRpbWUgaW1wbGVtZW50YXRpb24gb2YgYSB2aWV3IGFzIGFwcGxpZWQgdG8gYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzb3JzIGludG8gdGhlIG5lc3RlZCBiZWhhdmlvcnMgb2Ygdmlld3MgYW5kIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGZpZWxkLWxldmVsIGF0dHJpYnV0ZXMKICAgICAgICAgKiBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBkb20gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQ2xhc3MgZm9yIG1hbmFnaW5nIHZpZXcgY29tcG9uZW50cyBzdWNoIGFzIGxheW91dCwgdGVtcGxhdGUsIG1lc3NhZ2UgZXRjLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRoZSB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkIHRoZSBmaWVsZCBjb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKHZpZXdJZCwgZmllbGQpIHsKICAgICAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICAgICAgICB0aGlzLnNldFZpZXcodmlld0lkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgdGhpcyBydW50aW1lIHZpZXcgYWRhcHRlcnMgc2hvdWxkIGNvbnN1bHQgZHVyaW5nIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aGUgdmlldyBpZAogICAgICAgICAqLwogICAgICAgIHNldFZpZXc6IGZ1bmN0aW9uICh2aWV3SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgZmllbGQgY2xhc3NlcyBldmVyIHJlYWxseSBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk/CiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbGVmdCBpbiB0byBzdXBwb3J0IEFscGFjYSBkb2NzIGdlbmVyYXRpb24gKG5lZWQgdG8gY2xlYW4gdGhpcyB1cClzCiAgICAgICAgICAgIC8vIGlmIGEgdmlldyBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhleSBpbnN0YW50aWF0ZWQgYSBmaWVsZCBkaXJlY3RseQogICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlLCB3ZSdsbCBqdXN0IHBpY2sgdGhlIGRlZmF1bHQgdmlldwogICAgICAgICAgICBpZiAoIXZpZXdJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmlld0lkID0gICJ3ZWItZWRpdCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBub3JtYWxpemVkIHZpZXcKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWaWV3ID0gQWxwYWNhLmdldE5vcm1hbGl6ZWRWaWV3KHZpZXdJZCk7CiAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFZpZXcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgdmlldyBmb3IgdmlldyBpZDogIiArIHZpZXdJZCArICIgY291bGQgbm90IGZpbmQgYSBub3JtYWxpemVkIHZpZXciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29weSBjb21waWxlZCBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBub3JtYWxpemVkVmlldykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWaWV3Lmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1trXSA9IG5vcm1hbGl6ZWRWaWV3W2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB2aWV3IHdpemFyZCBzZXR0aW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFZpZXcgd2l6YXJkIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIGdldFdpemFyZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1BhcmFtKCJ3aXphcmQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBnbG9iYWwgbGF5b3V0IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdHxTdHJpbmd9IEdsb2JhbCBsYXlvdXQgdGVtcGxhdGUgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJnbG9iYWxUZW1wbGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgbGF5b3V0IHRlbXBsYXRlIGFuZCBiaW5kaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IExheW91dCB0ZW1wbGF0ZSBhbmQgYmluZGluZ3Mgc2V0dGluZyBvZiB0aGUgdmlldy4KICAgICAgICAgKi8KICAgICAgICBnZXRMYXlvdXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgInRlbXBsYXRlRGVzY3JpcHRvciI6IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJsYXlvdXRUZW1wbGF0ZSIsIHNlbGYpLAogICAgICAgICAgICAgICAgImJpbmRpbmdzIjogdGhpcy5nZXRWaWV3UGFyYW0oWyJsYXlvdXQiLCJiaW5kaW5ncyJdLCB0cnVlKQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRzIGJhY2sgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlkIGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlSWQKICAgICAgICAgKiBAcGFyYW0gZmllbGQgKG9wdGlvbmFsKQogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24odGVtcGxhdGVJZCwgZmllbGQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmdldFRlbXBsYXRlRGVzY3JpcHRvcih0aGlzLCB0ZW1wbGF0ZUlkLCBmaWVsZCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlSWQgTWVzc2FnZSBpZAogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgbG9jYWxlCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNZXNzYWdlIG1hcHBlZCB0byB0aGUgZ2l2ZW4gaWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uIChtZXNzYWdlSWQsIGxvY2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghbG9jYWxlKSB7CiAgICAgICAgICAgICAgICBsb2NhbGUgPSBBbHBhY2EuZGVmYXVsdExvY2FsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1lc3NhZ2VGb3JMb2NhbGUgPSB0aGlzLmdldFZpZXdQYXJhbShbIm1lc3NhZ2VzIiwgbG9jYWxlLCBtZXNzYWdlSWRdKTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KG1lc3NhZ2VGb3JMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlRm9yTG9jYWxlID0gdGhpcy5nZXRWaWV3UGFyYW0oWyJtZXNzYWdlcyIsIG1lc3NhZ2VJZF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZvckxvY2FsZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdmlldyBwYXJhbWV0ZXIgYmFzZWQgb24gY29uZmlndXJhdGlvbiBJZCBvciBJZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjb25maWdJZCBDb25maWd1cmF0aW9uIGlkIG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmlldyBwYXJhbWV0ZXIgbWFwcGVkIHRvIGNvbmZpZ3VyYXRpb24gSWQgb3IgSWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld1BhcmFtOiBmdW5jdGlvbiAoY29uZmlnSWQsIHRvcExldmVsT25seSkgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9vayBmb3IgZXhhY3QgbWF0Y2gKICAgICAgICAgICAgdmFyIGZpZWxkUGF0aCA9IHRoaXMuZmllbGQucGF0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRzICYmIHRoaXMuZmllbGRzW2ZpZWxkUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbZmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25maWdWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBbKl0gc3ludGF4KSAgaS5lLiAgL2EvYlsqXS9jL2RbKl0vZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiWypdIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXJyYXkgcmVsYXRlZCBmaWVsZCBwYXRoICh1c2luZyBwdXJlIHBhdGggc3ludGF4KSAgIGkuZS4gL2EvYi9jL2QvZQogICAgICAgICAgICBpZiAoZmllbGRQYXRoICYmIGZpZWxkUGF0aC5pbmRleE9mKCdbJykgIT09IC0xICYmIGZpZWxkUGF0aC5pbmRleE9mKCddJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoL1xbXGQrXF0vZywiIik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25maWdWYWwgPSB0aGlzLl9nZXRDb25maWdWYWwodGhpcy5maWVsZHNbbmV3RmllbGRQYXRoXSwgY29uZmlnSWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoY29uZmlnVmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0b3BMZXZlbE9ubHkpICYmIHRvcExldmVsT25seSAmJiB0aGlzLmZpZWxkLnBhdGggIT09ICIvIikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb25maWdWYWwodGhpcywgY29uZmlnSWQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEludGVybmFsIG1ldGhvZCBmb3IgZ2V0dGluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QW55fSBjb25maWdWYWwgY29uZmlndXJhdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnSWQgY29uZmlndXJhdGlvbiBpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbnl9IGNvbmZpZ3VyYXRpb24gbWFwcGluZyB0byB0aGUgZ2l2ZW4gaWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0Q29uZmlnVmFsIDogZnVuY3Rpb24gKGNvbmZpZ1ZhbCwgY29uZmlnSWQpIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGNvbmZpZ0lkKSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25maWdJZC5sZW5ndGggJiYgIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbCA9IGNvbmZpZ1ZhbFtjb25maWdJZFtpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmZpZ1ZhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdWYWwgPSBjb25maWdWYWxbY29uZmlnSWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihmaWVsZCwgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgJiYgdGhpcy5jYWxsYmFja3NbaWRdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0uY2FsbChmaWVsZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhcHBseVN0eWxlOiBmdW5jdGlvbihpZCwgZmllbGRPckVsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsID0gZmllbGRPckVsOwogICAgICAgICAgICBpZiAoZWwgJiYgZWwuZ2V0RmllbGRFbCkgewogICAgICAgICAgICAgICAgZWwgPSBlbC5nZXRGaWVsZEVsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzICYmIHRoaXMuc3R5bGVzW2lkXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5hZGRDbGFzcyh0aGlzLnN0eWxlc1tpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGlkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW2lkXSA/IHRoaXMuc3R5bGVzW2lkXSA6ICIiOwogICAgICAgIH0KCgogICAgfSk7Cn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGQgPSBCYXNlLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgQWJzdHJhY3QgY2xhc3MgdGhhdCBzZXJ2ZWQgYXMgYmFzZSBmb3IgYWxsIEFscGFjYSBmaWVsZCBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgVGhlIGRvbSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdWx0aW1hdGVseSByZW5kZXJpbmcuCiAgICAgICAgICogQHBhcmFtIHtBbnl9IGRhdGEgRmllbGQgZGF0YQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZpZXdJZCB2aWV3IGlkCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBkYXRhLCBvcHRpb25zLCBzY2hlbWEsIHZpZXdJZCwgY29ubmVjdG9yLCBlcnJvckNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBkb21FbAogICAgICAgICAgICB0aGlzLmRvbUVsID0gZG9tRWw7CgogICAgICAgICAgICAvLyBwYXJlbnQKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwoKICAgICAgICAgICAgLy8gY29uZmlnCiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRFcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZmllbGQgcmVuZGVyaW5nIGlzIHNpbmdsZS1sZXZlbCBvciBub3QKICAgICAgICAgICAgdGhpcy5zaW5nbGVMZXZlbFJlbmRlcmluZyA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gc2V0IGEgcnVudGltZSB2aWV3CiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBBbHBhY2EuUnVudGltZVZpZXcodmlld0lkLCB0aGlzKTsKCiAgICAgICAgICAgIC8vIHRoaW5ncyB3ZSBjYW4gZHJhdyBvZmYgdGhlIG9wdGlvbnMKICAgICAgICAgICAgdmFyIG5vT3B0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgICAgICBub09wdGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlOwoKICAgICAgICAgICAgLy8gc2V0dXAgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gQWxwYWNhLmdlbmVyYXRlSWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9TY2hlbWEgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYSkgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgIG5vU2NoZW1hID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sYWJlbCAmJiB0aGlzLnNjaGVtYS50aXRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsID0gdGhpcy5zY2hlbWEudGl0bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlbHBlciAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlciA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydDogb3B0aW9ucy5oZWxwZXIgLT4gY29udmVydCB0byBvcHRpb25zLmhlbHBlcnMKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVscGVycykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlbHBlcnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBlcikgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuaGVscGVyKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWxwZXJzLnB1c2godGhpcy5vcHRpb25zLmhlbHBlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmhlbHBlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGVscGVycy5wdXNoKHRoaXMub3B0aW9ucy5oZWxwZXJbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVnYWN5IHZhbHVlCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmhlbHBlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5yZWFkb25seSkgJiYgIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLnJlYWRvbmx5KSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlYWRvbmx5ID0gdGhpcy5zY2hlbWEucmVhZG9ubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGRhdGEgaXMgZW1wdHksIHRoZW4gd2UgY2hlY2sgd2hldGhlciB3ZSBjYW4gZmFsbCBiYWNrIHRvIGEgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWFbImRlZmF1bHQiXSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2NoZW1hWyJkZWZhdWx0Il07CiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdEZWZhdWx0RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgcGF0aAogICAgICAgICAgICB0aGlzLnBhdGggPSAiLyI7CgogICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHN0YXR1cwogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB7fTsKCiAgICAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKCgoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSdyZSBpbiBhIGRpc3BsYXktb25seSBtb2RlCiAgICAgICAgICAgIHRoaXMuaXNEaXNwbGF5T25seSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLnZpZXcudHlwZSA9PT0gInZpZXciIHx8IHNlbGYudmlldy50eXBlID09ICJkaXNwbGF5Iik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzY2hlbWEgaWQgY2xlYW51cAogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuaWQgJiYgdGhpcy5zY2hlbWEuaWQuaW5kZXhPZigiIyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5pZCA9IHRoaXMuc2NoZW1hLmlkLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFzIHRoaXMgZmllbGQgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZD8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseVZhbGlkYXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb2JzZXJ2YWJsZQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5zZXQodGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmFibGUodGhpcy5wYXRoKS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKCF0b3AuaXNUb3AoKSkgewogICAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGVTY29wZSA9IHRvcC5vYnNlcnZhYmxlU2NvcGU7CiAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTY29wZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlU2NvcGUgPSAiZ2xvYmFsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVNjb3BlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhpcy5lbnN1cmVQcm9wZXJUeXBlID0gZnVuY3Rpb24odmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIF9lbnN1cmUgPSBmdW5jdGlvbih2LCB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJpbnRlZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBhcnNlSW50KHYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09ICIiIHx8IHYudG9Mb3dlckNhc2UoKSA9PT0gImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzTnVtYmVyKHYpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiIgKyB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICJib29sZWFuIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT09IC0xIHx8IHYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS5pdGVtcyAmJiBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IF9lbnN1cmUodmFsW2ldLCBzZWxmLnNjaGVtYS5pdGVtcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNTdHJpbmcodmFsKSB8fCBBbHBhY2EuaXNOdW1iZXIodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfZW5zdXJlKHZhbCwgc2VsZi5zY2hlbWEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMub25Db25zdHJ1Y3QoKTsKICAgICAgICB9LAoKICAgICAgICBvbkNvbnN0cnVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNUb3A6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgb3V0ZXIgZmllbGQgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbCBmaWVsZHMsIHRoaXMgaXMgImNvbnRyb2wiLgogICAgICAgICAqIEZvciBjb250YWluZXIgZmllbGRzLCB0aGlzIGlzICJjb250YWluZXIiLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gZmllbGQgdGVtcGxhdGUgZGVzY3JpcHRvciBpZAogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlbXBsYXRlIGRlc2NyaXB0b3IgSUQgd2FzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGRlZmF1bHQgcmVuZGl0aW9uIHRlbXBsYXRlIGZyb20gdmlldy4KICAgICAgICAgKi8KICAgICAgICBpbml0VGVtcGxhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgdmlld1RlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IodGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3JJZCgpLCB0aGlzKTsKICAgICAgICAgICAgdmFyIGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMudmlldy5nZXRHbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgdmFyIGxheW91dCA9IHRoaXMudmlldy5nZXRMYXlvdXQoKTsKCiAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgdGhlIGdsb2JhbCBvciBsYXlvdXQgdGVtcGxhdGUgdG8gYmUgYXBwbGllZCB0byB0aGUgdG9wLW1vc3QgZmllbGQKICAgICAgICAgICAgdmFyIHRyaXAgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUb3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGdsb2JhbFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcihnbG9iYWxUZW1wbGF0ZURlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlTGV2ZWxSZW5kZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRyaXAgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0ICYmIGxheW91dC50ZW1wbGF0ZURlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wbGF0ZURlc2NyaXB0b3IobGF5b3V0LnRlbXBsYXRlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdHJpcCAmJiB2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFRlbXBsYXRlRGVzY3JpcHRvcih2aWV3VGVtcGxhdGVEZXNjcmlwdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlIHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIlVuYWJsZSB0byBmaW5kIHRlbXBsYXRlIGRlc2NyaXB0b3IgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRGaWVsZFR5cGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmllbGQgaW5zdGFuY2UgaXMgY3JlYXRlZC4gSXQgd2lsbCBpbml0aWFsaXplCiAgICAgICAgICogdGhlIGZpZWxkIHRvIGdldCBpdCByZWFkeSBmb3IgcmVuZGl0aW9uLgogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXppbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIHBpY2tlZCBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURlc2NyaXB0b3IoKTsKCiAgICAgICAgICAgIC8vIEpTT04gU0NIRU1BCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBWQUxJREFUSU9OCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodGhpcy5vcHRpb25zLnZhbGlkYXRlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gT1BUSU9OUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNRVNTQUdFUwogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5zaG93TWVzc2FnZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd01lc3NhZ2VzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldHVwRmllbGQ6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmFtZQogICAgICAgICAqIEBwYXJhbSBmbgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIG9uOiBmdW5jdGlvbihuYW1lLCBmbikKICAgICAgICB7CiAgICAgICAgICAgIEFscGFjYS5sb2dEZWJ1ZygiQWRkaW5nIGxpc3RlbmVyIGZvciBldmVudDogIiArIG5hbWUpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaChmbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG5hbWUKICAgICAgICAgKi8KICAgICAgICBvZmY6IGZ1bmN0aW9uKG5hbWUpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbbmFtZV0ubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGFuIGV2ZW50IGFuZCBwcm9wYWdhdGVzIHRoZSBldmVudC4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBiZWhhdmlvciBpcyB0byBwcm9wYWdhdGUgdXAgdG8gdGhlIHBhcmVudCBjaGFpbiAoYnViYmxlIHVwKS4KICAgICAgICAgKgogICAgICAgICAqIElmICJkaXJlY3Rpb24iIGlzIHNldCB0byAiZG93biIgYW5kIHRoZSBmaWVsZCBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUgZXZlbnQgaXMgcHJvcGFnYXRlZCBkb3duCiAgICAgICAgICogdG8gY2hpbGRyZW4gKHRyaWNrbGUgZG93bikuCiAgICAgICAgICoKICAgICAgICAgKiBJZiAiZGlyZWN0aW9uIiBpcyBzZXQgdG8gImJvdGgiLCB0aGVuIGJvdGggdXAgYW5kIGRvd24gYXJlIHRyaWdnZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiAob3B0aW9uYWwpIHNlZSBhYm92ZQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJXaXRoUHJvcGFnYXRpb246IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pCiAgICAgICAgewogICAgICAgICAgICBpZiAodHlwZW9mKGV2ZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGV2ZW50OwogICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gd2UgdHJpZ2dlciBvdXJzZWx2ZXMgZmlyc3QKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGRvIGFueSBjaGlsZHJlbiBmaXJzdAogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CgogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uLmNhbGwoY2hpbGQsIG5hbWUsIGV2ZW50LCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkbyBvdXJzZWx2ZXMgbGFzdAogICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gImJvdGgiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBkbyBhbnkgY2hpbGRyZW4gZmlyc3QKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCBuYW1lLCBldmVudCwgImRvd24iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlci5jYWxsKHRoaXMsIG5hbWUsIGV2ZW50KTsKCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHRyaWdnZXIgcGFyZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnRyaWdnZXJXaXRoUHJvcGFnYXRpb24uY2FsbCh0aGlzLnBhcmVudCwgbmFtZSwgZXZlbnQsICJ1cCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcnMgYW4gZXZlbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogQHBhcmFtIGV2ZW50CiAgICAgICAgICoKICAgICAgICAgKiBSZW1haW5kZXIgb2YgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bGx9CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpCiAgICAgICAgewogICAgICAgICAgICAvLyBOT1RFOiB0aGlzID09IGNvbnRyb2wKCiAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKICAgICAgICAgICAgaWYgKGhhbmRsZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaGFuZGxlcikgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIkZpcmluZyBldmVudDogIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGUgZXZlbnQgaGFuZGxlciBjYXVnaHQgYW4gZXhjZXB0aW9uOiAiICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWVsZC4gIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQgb2YgY29uc3RydWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGJpbmREYXRhOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1ldGhvZCBpbnRvIHRoZSBmaWVsZC4gIEl0IGlzIGNhbGxlZCBieSBBbHBhY2EgZm9yIGVhY2ggZmllbGQgYmVpbmcgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBSZW5kZXJzIHRoaXMgZmllbGQgaW50byB0aGUgY29udGFpbmVyIGFuZCBjcmVhdGVzIGEgRE9NIGVsZW1lbnQgd2hpY2ggaXMgYm91bmQgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IFZpZXcgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIGZpZWxkIChvcHRpb25hbCkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1SZW5kZXIgY2FsbGJhY2sgKG9wdGlvbmFsKS4KICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZpZXcsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHZpZXcgJiYgKEFscGFjYS5pc1N0cmluZyh2aWV3KSB8fCBBbHBhY2EuaXNPYmplY3QodmlldykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShjYWxsYmFjaykgJiYgQWxwYWNhLmlzRnVuY3Rpb24odmlldykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB2aWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsYXN0IHRyeSB0byBzZWUgaWYgd2UgY2FuIHBvcHVsYXRlIHRoZSBsYWJlbCBmcm9tIHByb3BlcnR5SWQKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCA9PT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHRoaXMucHJvcGVydHlJZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgbmFtZSBmaWVsZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmFtZQogICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXAoKTsKCiAgICAgICAgICAgIHRoaXMuc2V0dXBGaWVsZChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLl9yZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHJlbmRlciBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVuZGVyIik7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGNhbGN1bGF0ZU5hbWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5uYW1lIHx8ICh0aGlzLm5hbWUgJiYgdGhpcy5uYW1lQ2FsY3VsYXRlZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGhhcyBwYXRoPwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm5hbWUgJiYgdGhpcy5wYXRoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0U2VnbWVudCA9IHRoaXMucGF0aC5zdWJzdHJpbmcodGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICE9PSAtMSAmJiBsYXN0U2VnbWVudC5pbmRleE9mKCJdIikgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucGFyZW50Lm5hbWUgKyAiXyIgKyBsYXN0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lQ2FsY3VsYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5hbWUgZnJvbSB0aGUgcGF0aAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnBhdGgucmVwbGFjZSgvXC8vZywiIikucmVwbGFjZSgvXFsvZywiXyIpLnJlcGxhY2UoL1xdL2csIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWVDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIHByb2Nlc3NpbmcgdGhlIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgUG9zdC1yZW5kZXIgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgX3JlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGluIGEgZm9ybQogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvcm0gJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5mb3JtKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZvcm0udmlld1R5cGUgPSB0aGlzLnZpZXcudHlwZTsKCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHNlbGYuZm9ybTsKICAgICAgICAgICAgICAgIGlmICghZm9ybSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3JtID0gbmV3IEFscGFjYS5Gb3JtKHNlbGYuZG9tRWwsIHRoaXMub3B0aW9ucy5mb3JtLCBzZWxmLnZpZXcuaWQsIHNlbGYuY29ubmVjdG9yLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybS5yZW5kZXIoZnVuY3Rpb24oZm9ybSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBmb3JtIGlzIHRoZSBmb3JtIGluc3RhbmNlIChub3QgdGhlIGpxdWVyeSBlbGVtZW50KQoKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEZpZWxkSG9sZGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NSZW5kZXIodGVtcEZpZWxkSG9sZGVyLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgZmllbGQgYmVmb3JlIG91ciBmb3JtIGZpZWxkcyBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZm9ybUZpZWxkc0NvbnRhaW5lciBtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluZCB0aGUgdG9wIGZpZWxkIHRvIHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbCA9IHNlbGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmluaXRFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtID0gZm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lID0gc2VsZjsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGFueSBwb3N0LXJlbmRlcmluZyBmYWNpbGl0aWVzIHRvIGtpY2sgaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIGluaXRpYWxpemluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXppbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IgZm9ybSB0byBkbyBzb21lIGxhdGUgdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFmdGVySW5pdGlhbGl6ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpZWxkIHJlbW92ZXMsIHJlbW92ZSB0aGUgZm9ybSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZmllbGQpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGFuZCByZW5kZXIgaXQKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NSZW5kZXIoc2VsZi5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCAiZmllbGQiIGVsZW1lbnQgdG8gdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgLy8kKHNlbGYuZmllbGQpLmFwcGVuZFRvKHNlbGYuZG9tRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhbnkgcG9zdC1yZW5kZXJpbmcgZmFjaWxpdGllcyB0byBraWNrIGluCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0UmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgaW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgQWxwYWNhLmlzRnVuY3Rpb24oY2FsbGJhY2spKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgZmllbGQgaW50byB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEVsIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBmaWVsZCAob3V0ZXIgZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5yZW5kZXJGaWVsZChwYXJlbnRFbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJmaWVsZCIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmaWVsZCIpOwoKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBhbnkgZmllbGQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyRmllbGRFbGVtZW50cyhmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGREb21FbGVtZW50OiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHRoaXMuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCk7CgogICAgICAgICAgICAvLyByZW5kZXIgdGhlIGZpZWxkCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudG1wbCh0ZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICJpZCI6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSI6IHRoaXMuc2NoZW1hLAogICAgICAgICAgICAgICAgImRhdGEiOiBkYXRhLAogICAgICAgICAgICAgICAgInZpZXciOiB0aGlzLnZpZXcsCiAgICAgICAgICAgICAgICAicGF0aCI6IHRoaXMucGF0aCwKICAgICAgICAgICAgICAgICJuYW1lIjogdGhpcy5uYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlICJmaWVsZCIgb3V0ZXIgZWxlbWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgY29udHJvbCBvciBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcGFyZW50RWwKICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGQ6IGZ1bmN0aW9uKHBhcmVudEVsLCBvblN1Y2Nlc3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyB0aGUgZGF0YSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIHRoZURhdGEgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5LW9ubHkgbW9kZSwgYW5kIHRoZURhdGEgaXMgYW4gb2JqZWN0LCBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKHRoZURhdGEpID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhlRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoZURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gc2VsZi5yZW5kZXJGaWVsZERvbUVsZW1lbnQodGhlRGF0YSk7CgogICAgICAgICAgICAvLyBpZiB3ZSBnb3QgYmFjayBtdWx0aXBsZSBlbGVtZW50cywgdHJ5IHRvIHBpY2sgYXQgdGhlIGZpcnN0IERJVgogICAgICAgICAgICBpZiAoJChyZW5kZXJlZERvbUVsZW1lbnQpLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzaW5nbGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKHJlbmRlcmVkRG9tRWxlbWVudCkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0ubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJkaXYiID09PSBuYW1lIHx8ICJzcGFuIiA9PT0gbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlID0gJCgkKHJlbmRlcmVkRG9tRWxlbWVudClbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaW5nbGUgPSAkKCQocmVuZGVyZWREb21FbGVtZW50KS5sYXN0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNpbmdsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERvbUVsZW1lbnQgPSBzaW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuZmllbGQgPSByZW5kZXJlZERvbUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuZmllbGQuYXBwZW5kVG8ocGFyZW50RWwpOwoKICAgICAgICAgICAgb25TdWNjZXNzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyBhbnkgZmllbGQgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgY29udHJvbHMgb3IgY29udGFpbmVycywgdGhpcyBob29rIGlzIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgZG9tIGVsZW1lbnRzIGludG8gdGhlIG91dGVyIGZpZWxkCiAgICAgICAgICogZG9tIGVsZW1lbnQuICBTaW1wbGUgZmllbGQgdHlwZXMgbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckZpZWxkRWxlbWVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHR5cGljYWxseSBvbmNlIHBlciByZW5kZXIuICBJZiBhIERPTSBlbGVtZW50IGlzIG1vdmVkIHdpdGhpbiBhIGNvbnRhaW5lciBhbmQgaXQncyBpbmRleGluZwogICAgICAgICAqIGNoYW5nZXMsIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGFnYWluc3QgdG8gZW5zdXJlIHRoYXQgRE9NIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGVpciBwYXRoCiAgICAgICAgICAgIHRoaXMuZmllbGQuYXR0cigiZGF0YS1hbHBhY2EtZmllbGQtcGF0aCIsIHRoaXMuZ2V0UGF0aCgpKTsKCiAgICAgICAgICAgIC8vIGFsbCBmaWVsZHMgZ2V0IHRoZWlyIG5hbWUKICAgICAgICAgICAgdGhpcy5maWVsZC5hdHRyKCJkYXRhLWFscGFjYS1maWVsZC1uYW1lIiwgdGhpcy5nZXROYW1lKCkpOwoKICAgICAgICAgICAgLy8gbmFtZSBzaG91bGQgbm90IGFwcGVhciBvbiBmaWVsZAogICAgICAgICAgICB0aGlzLmZpZWxkLnJlbW92ZUF0dHIoIm5hbWUiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZmllbGQgcmVuZGl0aW9uIGlzIGNvbXBsZXRlLiBJdCBpcyBzZXJ2ZWQgYXMgYSB3YXkgdG8gbWFrZSBmaW5hbAogICAgICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgcHJvZHVjZWQuCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCB0aGUgImFscGFjYS1maWVsZCIgY2xhc3Mgd2hpY2ggbWFya3MgdGhlIG91dGVyIGVsZW1lbnQKICAgICAgICAgICAgdGhpcy5maWVsZC5hZGRDbGFzcygiYWxwYWNhLWZpZWxkIik7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBtYXJrZWQgYnkgdHlwZSBhcyB3ZWxsCiAgICAgICAgICAgIHRoaXMuZmllbGQuYWRkQ2xhc3MoImFscGFjYS1maWVsZC0iICsgdGhpcy5nZXRGaWVsZFR5cGUoKSk7CgogICAgICAgICAgICAvLyBhbGwgZmllbGRzIGdldCBmaWVsZCBpZCBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB0aGlzLmZpZWxkLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIiwgdGhpcy5nZXRJZCgpKTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlRE9NRWxlbWVudCgpOwoKICAgICAgICAgICAgLy8gdHJ5IHRvIGF2b2lkIGFkZGluZyB1bm5lY2Vzc2FyeSBpbmplY3Rpb25zIGZvciBkaXNwbGF5IHZpZXcuCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKSB7CgogICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtcmVxdWlyZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZXF1aXJlZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVxdWlyZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2Etb3B0aW9uYWwiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJvcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygib3B0aW9uYWwiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZG9EaXNhYmxlRmllbGQgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayAiZGlzYWJsZWQiIGF0dHJpYnV0ZSBvbnRvIHVuZGVybHlpbmcgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCdpbnB1dCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGlzYWJsZWQoJCgnc2VsZWN0Jywgc2VsZi5maWVsZCksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIEFscGFjYS5kaXNhYmxlZCgkKCc6cmFkaW8nLCBzZWxmLmZpZWxkKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRpc2FibGVkKCQoJzpjaGVja2JveCcsIHNlbGYuZmllbGQpLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciByYWRpbyBidXR0b25zIChwcmV2ZW50IGNsaWNrcykKICAgICAgICAgICAgICAgICAgICAkKCI6cmFkaW8iLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICQoIi5yYWRpbyBsYWJlbCIsIHNlbGYuZmllbGQpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAoaW5wdXQgZmllbGQpCiAgICAgICAgICAgICAgICAgICAgJCgiaW5wdXQiLCBzZWxmLmZpZWxkKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIGRpc2FibGUgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIHJlYWRvbmx5CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1yZWFkb25seSIpOwoKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCcsIHRoaXMuZmllbGQpLmF0dHIoJ3JlYWRvbmx5JywgJ3JlYWRvbmx5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZG9EaXNhYmxlRmllbGQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZWFkb25seSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygicmVhZG9ubHkiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFkZENsYXNzKCJhbHBhY2EtZGlzYWJsZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBkb0Rpc2FibGVGaWVsZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogImRpc2FibGVkIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFsbG93IHNpbmdsZSBvciBtdWx0aXBsZSBmaWVsZCBjbGFzc2VzIHRvIGJlIHNwZWNpZmllZCB2aWEgdGhlICJmaWVsZENsYXNzIgogICAgICAgICAgICAgICAgLy8gb3IgImZpZWxkQ2xhc3NlcyIgb3B0aW9ucwogICAgICAgICAgICAgICAgdmFyIGFwcGx5RmllbGRDbGFzcyA9IGZ1bmN0aW9uKGVsLCB0aGluZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyh0aGluZ1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaW5kZXhPZigiLCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0aGluZy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModG9rZW5zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaW5nLmluZGV4T2YoIiAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKHRva2Vuc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3ModGhpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGFwcGx5RmllbGRDbGFzcyh0aGlzLmZpZWxkLCB0aGlzLm9wdGlvbnNbImZpZWxkQ2xhc3MiXSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBzdHlsZXMgcHJvdmlkZWQgYnkgY3VzdG9tIHZpZXcKICAgICAgICAgICAgICAgIHZhciBjdXN0b21TdHlsZXMgPSB0aGlzLnZpZXcuZ2V0U3R5bGVzKCk7CiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlQ2xhc3MgaW4gY3VzdG9tU3R5bGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdHlsZUNsYXNzLCB0aGlzLmRvbUVsKS5jc3MoY3VzdG9tU3R5bGVzW3N0eWxlQ2xhc3NdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJkaXNhYmxlIgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2UgYmluZCBkYXRhIGlmIHdlJ3JlIGluICJlZGl0IiBtb2RlCiAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHksIHdlIGRvbid0IGJpbmQgZGF0YSBpZiB3ZSdyZSBpbiAiY3JlYXRlIiBvciBhbnkgb3RoZXIgbW9kZQogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlICYmIHRoaXMudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaG93aW5nRGVmYXVsdERhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb250cm9sIGlzIHNob3dpbmcgZGVmYXVsdCBkYXRhLCB0aGVuIHdlIHJlbmRlciB0aGUgY29udHJvbCBhbnl3YXkKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmREYXRhKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBsb2dnaW5nIHRvIGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAiY3JlYXRlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlNraXBwaW5nIGRhdGEgYmluZGluZyBmb3IgZmllbGQ6ICIgKyB0aGlzLmlkICsgIiBzaW5jZSB2aWV3IG1vZGUgaXMgJ2NyZWF0ZSciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGRvbS1sZXZlbCBldmVudHMKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSAmJiB0aGlzLnZpZXcudHlwZSAhPT0gJ3ZpZXcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoaWRkZW4KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRkZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZmllbGQuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVmYXVsdEhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gKHRoaXMudmlldy50eXBlID09PSAnY3JlYXRlJykgJiYgIXRoaXMucmVmcmVzaGVkOwogICAgICAgICAgICB0aGlzLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5vcHRpb25zLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKSA/IGRlZmF1bHRIaWRlSW5pdFZhbGlkYXRpb25FcnJvciA6IHRoaXMub3B0aW9ucy5oaWRlSW5pdFZhbGlkYXRpb25FcnJvcjsKCiAgICAgICAgICAgIC8vIGZvciBjcmVhdGUgdmlldywgaGlkZSBhbGwgcmVhZG9ubHkgZmllbGRzCiAgICAgICAgICAgIGlmICghdGhpcy52aWV3LmRpc3BsYXlSZWFkb25seSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuYWxwYWNhLXJlYWRvbmx5IikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWVsZCBsZXZlbCBwb3N0IHJlbmRlcgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc3RSZW5kZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3N0UmVuZGVyLmNhbGwodGhpcywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVkcmF3cyB0aGUgZmllbGQgdXNpbmcgdGhlIGN1cnJlbnRseSBib3VuZCBET00gZWxlbWVudCBhbmQgdmlldy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBkYXRhCiAgICAgICAgICAgIHZhciBfZGF0YSA9IHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgc3R1ZmYKICAgICAgICAgICAgdmFyIG9sZERvbUVsID0gc2VsZi5kb21FbDsKICAgICAgICAgICAgdmFyIG9sZEZpZWxkID0gc2VsZi5maWVsZDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udHJvbCA9IHNlbGYuY29udHJvbDsKICAgICAgICAgICAgLy92YXIgb2xkQ29udGFpbmVyID0gc2VsZi5jb250YWluZXI7CiAgICAgICAgICAgIC8vdmFyIG9sZEZvcm0gPSBzZWxmLmZvcm07CgogICAgICAgICAgICAvLyBpbnNlcnQgbWFya2VyIGVsZW1lbnQgYmVmb3JlIGN1cnJlbnQgZmllbGQgdG8gbWFyayB3aGVyZSB3ZSdsbCByZW5kZXIKICAgICAgICAgICAgdmFyIG1hcmtlckVsID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgJChvbGRGaWVsZCkuYmVmb3JlKG1hcmtlckVsKTsKCiAgICAgICAgICAgIC8vIHRlbXAgZG9tRWwKICAgICAgICAgICAgc2VsZi5kb21FbCA9ICQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IG5vbmUnPjwvZGl2PiIpOwogICAgICAgICAgICAvLyBjbGVhciB0aGlzIHN0dWZmIG91dAogICAgICAgICAgICBzZWxmLmZpZWxkID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmNvbnRyb2wgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzZWxmLmZvcm0gPSB1bmRlZmluZWQ7CgogICAgICAgICAgICAvLyBkaXNhYmxlIGFsbCBidXR0b25zIG9uIG91ciBjdXJyZW50IGZpZWxkCiAgICAgICAgICAgIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSByZXBlYXRlZCBjbGlja3MgY291bGQgY2F1c2UgdHJvdWJsZSB3aGlsZSB0aGUgZmllbGQgaXMgaW4gc29tZSBoYWxmLXN0YXRlCiAgICAgICAgICAgIC8vIGR1cmluZyByZWZyZXNoCiAgICAgICAgICAgICQob2xkRmllbGQpLmZpbmQoImJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CgogICAgICAgICAgICAvLyBtYXJrIHRoYXQgd2UgYXJlIGluaXRpYWxpemluZwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7CgogICAgICAgICAgICAvLyByZS1zZXR1cCB0aGUgZmllbGQKICAgICAgICAgICAgc2VsZi5zZXR1cCgpOwoKICAgICAgICAgICAgc2VsZi5zZXR1cEZpZWxkKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgc2VsZi5fcmVuZGVyKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFoZWFkIG9mIG1hcmtlcgogICAgICAgICAgICAgICAgICAgICQobWFya2VyRWwpLmJlZm9yZShzZWxmLmZpZWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGRvbUVsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21FbCA9IG9sZERvbUVsOwoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGNsYXNzZXMgZnJvbSBvbGRGaWVsZCBvbnRvIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSAkKG9sZEZpZWxkKS5hdHRyKCJjbGFzcyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvbGRDbGFzc2VzLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmICF2LmluZGV4T2YoImFscGFjYS0iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3Modik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgb2xkIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJChvbGRGaWVsZCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2VyCiAgICAgICAgICAgICAgICAgICAgJChtYXJrZXJFbCkucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhhdCB3ZSdyZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXBwYXJlbnRseSBuZWVkZWQgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoX2RhdGEpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QoX2RhdGEpIHx8IEFscGFjYS5pc0FycmF5KF9kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGZpcmUgdGhlICJyZWFkeSIgZXZlbnQKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmlyZVJlYWR5KHNlbGYpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4uLgoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2xlYW4gdXAgb2xkIGZpZWxkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cmlnZ2VyIHRoZSBib3VuZCAiZGVzdHJveWVkIiBldmVudCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBvbGQgZG9tIGVsLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgb2xkRm9ybSAtPiBGaWVsZCAod2l0aCBvbGREb21FbCkKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3JtIC0+IEZpZWxkICh3aXRoIGRvbUVsKQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5pbmcgdXAgIm9sZERvbUVsIiBjYXVzZXMgIkZpZWxkIiB0byBjbGVhbnVwIHdoaWNoIGNhdXNlcyAib2xkRm9ybSIgdG8gY2xlYW51cAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAiRmllbGQiIHRvIGNsZWFudXAgd2hpY2ggY2F1c2VzICJkb21FbCIgdG8gY2xlYW4gdXAgKGFuZCBhbHNvICJmb3JtIikKICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UganVzdCB3YW50IHRvIHJlbW92ZSB0aGUgZG9tIGVsZW1lbnRzIGZvciAib2xkRG9tRWwiIGFuZCAib2xkRm9ybSIgd2l0aG91dCB0cmlnZ2VyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwZWNpYWwgZGVzdHJveWVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgd2UgY2FuIGRvIHRoaXMgd2l0aCBhIHNlY29uZCBhcmd1bWVudC4uLj8KICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICQob2xkRmllbGQpLnJlbW92ZSh1bmRlZmluZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzdHJveSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgYSB2aWV3IHN0eWxlIHRvIGEgZG9tIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZTogZnVuY3Rpb24oaWQsIHRhcmdldCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5hcHBseVN0eWxlKGlkLCB0YXJnZXQpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVzIGEgdmlldyBjYWxsYmFjayBmb3IgdGhlIGN1cnJlbnQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgb3V0ZXIgImZpZWxkIiByZW5kZXJlZCBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZmllbGQgaXMgYSBjb250cm9sIGZpZWxkIG9yIGEgY29udGFpbmVyIGZpZWxkLCB0aGlzIERPTSBlbGVtZW50IHdpbGwgd3JhcCB0aGUgaW5uZXIgImNvbnRyb2wiCiAgICAgICAgICogYW5kICJjb250YWluZXIiIGVsZW1lbnRzIHJlc3BlY3RpdmVseS4gIEluIHNvbWUgY2FzZXMsIHRoZSB3cmFwcGluZyBtaWdodCBub3QgZXhpc3QgaW4gd2hpY2ggY2FzZSB0aGlzCiAgICAgICAgICogZmllbGQgbWF5IGJlIHRoZSAiY29udHJvbCIgb3IgImNvbnRhaW5lciIgZmllbGQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkRWw6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyBGaWVsZCBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBwYXRoIHRvIHRoaXMgZWxlbWVudCBpbiB0aGUgZ3JhcGggb2YgSlNPTiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhdGggdG8gdGhpcyBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Kn0KICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHRvcCBsZXZlbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoaXMgZmllbGQgaXMgdGhlIHRvcCBsZXZlbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1RvcExldmVsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXYWxrcyB1cCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm5zIHRoZSB0b3AgbW9zdCBjb250cm9sLiAgSWYgbm8gcGFyZW50cywgdGhlbiBjdXJyZW50IGNvbnRyb2wgaXMgdG9wIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Q29udHJvbH0gdG9wIG1vc3QgY29udHJvbAogICAgICAgICAqLwogICAgICAgIHRvcDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRvcCA9IHRoaXM7CgogICAgICAgICAgICB3aGlsZSAodG9wLnBhcmVudCkgewogICAgICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRvcDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGUoKTsKCiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gaWYgd2UncmUgaW4gYSBkaXNwbGF5IG1vZGUgYW5kIG5vdCBmaXJzdCByZW5kZXIsIHRoZW4gZG8gYSByZWZyZXNoIGhlcmUKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpICYmICF0aGlzLmluaXRpYWxpemluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wICYmIHRoaXMudG9wKCkgJiYgdGhpcy50b3AoKS5pbml0aWFsaXppbmcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIHVuZGVyIGEgdG9wIG1vc3QgY29udHJvbCB0aGF0IGlzbid0IGZpbmlzaGVkIGluaXRpYWxpemluZywgdGhlbiBkb24ndCByZWZyZXNoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdmFsdWUgdG8gZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gdGVtcGxhdGUgZGVzY3JpcHRvcgogICAgICAgICAqLwogICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBmaWVsZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlIGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBzZXRUZW1wbGF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRlbXBsYXRlRGVzY3JpcHRvcikgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlRGVzY3JpcHRvciA9IHRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1lc3NhZ2VzIHRvIHNob3cgZm9yIGEgZ2l2ZW4gZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbWVzc2FnZXMgZWl0aGVyIGEgbWVzc2FnZSBvYmplY3Qge2lkLCBtZXNzYWdlfSBvciBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHMKICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJlZm9yZVN0YXR1cyBQcmV2aW91cyB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAgICAgKi8KICAgICAgICBkaXNwbGF5TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZXMsIGJlZm9yZVN0YXR1cykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBBbHBhY2EuaXNPYmplY3QobWVzc2FnZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IFttZXNzYWdlc107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHN0cmluZywgY29udmVydAogICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgQWxwYWNhLmlzU3RyaW5nKG1lc3NhZ2VzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBbewogICAgICAgICAgICAgICAgICAgICJpZCI6ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZXMKICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZW1vdmUgYW55IGFscGFjYSBtZXNzYWdlcyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1tZXNzYWdlIikucmVtb3ZlKCk7CgogICAgICAgICAgICAvLyBtYXhNZXNzYWdlCiAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMgJiYgQWxwYWNhLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcykgJiYgdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKDAsdGhpcy5vcHRpb25zLm1heE1lc3NhZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJyZW1vdmVNZXNzYWdlcyIKICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInJlbW92ZU1lc3NhZ2VzIik7CgogICAgICAgICAgICAvLyBhZGQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgaXQKICAgICAgICAgICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQuZWFjaChtZXNzYWdlcywgZnVuY3Rpb24oaW5kZXgsIG1lc3NhZ2VPYmplY3QpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlIHRvIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigibWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VFbGVtZW50ID0gQWxwYWNhLnRtcGwobWVzc2FnZVRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIjogbWVzc2FnZU9iamVjdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogbWVzc2FnZU9iamVjdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXciOiBzZWxmLnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFkZENsYXNzKCJhbHBhY2EtbWVzc2FnZSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRDbGFzcygiYWxwYWNhLW1lc3NhZ2UtaGlkZGVuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuYXBwZW5kKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYWRkTWVzc2FnZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYWRkTWVzc2FnZSIsIGluZGV4LCBtZXNzYWdlT2JqZWN0LmlkLCBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2UsIGhpZGRlbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBmaWVsZCB0byBiZSByZWZyZXNoZWQgb3IgcmVkcmF3biB0byB0aGUgc2NyZWVuLgogICAgICAgICAqCiAgICAgICAgICogSWYgdG9sZCB0byBjaGVjayBjaGlsZHJlbiwgdGhlbiBhbGwgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciBmaWVsZCB3aWxsIGJlIHJlZnJlc2hlZCBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gcmVmcmVzaCB2YWxpZGF0aW9uIGZvciBjaGlsZHJlbgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIG9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gdmFsaWRhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbih2YWxpZGF0ZUNoaWxkcmVuLCBjYikKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJDYWxsIHJlZnJlc2hWYWxpZGF0aW9uU3RhdGU6ICIgKyB0aGlzLnBhdGgpOwoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gcnVuIHZhbGlkYXRpb24gY29udGV4dCBjb21waWxhdGlvbiBmb3Igb3Vyc2VsdmVzIGFuZCBvcHRpb25hbGx5IGFueSBjaGlsZHJlbgogICAgICAgICAgICB2YXIgY29udGV4dHMgPSBbXTsKICAgICAgICAgICAgdmFyIGZ1bmN0aW9ucyA9IFtdOwoKICAgICAgICAgICAgLy8gY29uc3RydWN0cyBhbiBhc3luYyBmdW5jdGlvbiB0byB2YWxpZGF0ZSBjb250ZXh0IGZvciBhIGdpdmVuIGZpZWxkCiAgICAgICAgICAgIHZhciBmdW5jdGlvbkJ1aWxkZXIgPSBmdW5jdGlvbihmaWVsZCwgY29udGV4dHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIG5leHQgdGljawogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvbXBpbGVWYWxpZGF0aW9uQ29udGV4dChmaWVsZCwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHdyYXAgdXAgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGRvIGludG8gYXN5bmMgY2FsbGJhY2sgbWV0aG9kcwogICAgICAgICAgICBpZiAodmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwdGggZmlyc3QgY3Jhd2wgYWNyb3NzIGFsbCBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIGNyYXdsID0gZnVuY3Rpb24oZmllbGQsIGNvbnRleHRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc1ZhbGlkYXRpb25QYXJ0aWNpcGFudCgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGhhcyBjaGlsZHJlbiwgZ28gZGVwdGggZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuICYmIGZpZWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2woZmllbGQuY2hpbGRyZW5baV0sIGNvbnRleHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25CdWlsZGVyKGZpZWxkLCBjb250ZXh0cykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjcmF3bCh0aGlzLCBjb250ZXh0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvdXJzZWx2ZXMgaW4gbGFzdAogICAgICAgICAgICBmdW5jdGlvbnMucHVzaChmdW5jdGlvbkJ1aWxkZXIodGhpcywgY29udGV4dHMpKTsKCiAgICAgICAgICAgIC8vIG5vdyBydW4gYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gcGFyYWxsZWwKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmN0aW9ucywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgLy8gY29udGV4dHMgbm93IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzCgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGNvbnRleHRzIGludG8gYSBzaW5nbGUgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGlzIGZpZWxkCiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkTWFwID0ge307CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldOwoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBjb250ZXh0IGlzIGFscmVhZHkgaW4gb3JkZXIgW2NoaWxkLCBwYXJlbnQsIC4uLl0KCiAgICAgICAgICAgICAgICAgICAgdmFyIG1JbmRleCA9IG1lcmdlZENvbnRleHQubGVuZ3RoOwoKICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRleHQubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjb250ZXh0W2pdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkTWFwW2VudHJ5LmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW50cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmlkID0gZW50cnkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5wYXRoID0gZW50cnkucGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LmRvbUVsID0gZW50cnkuZG9tRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbnRyeS5maWVsZCA9IGVudHJ5LmZpZWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkudmFsaWRhdGVkID0gZW50cnkudmFsaWRhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW50cnkuaW52YWxpZGF0ZWQgPSBlbnRyeS5pbnZhbGlkYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VudHJ5LnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnNwbGljZShtSW5kZXgsIDAsIG5ld0VudHJ5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGluIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkTWFwW25ld0VudHJ5LmlkXSA9IG5ld0VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbGlkYXRlZCAmJiAhZXhpc3RpbmcuaW52YWxpZGF0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5pbnZhbGlkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkID0gZW50cnkudmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmludmFsaWRhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmludmFsaWRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy52YWxpZCA9IGVudHJ5LnZhbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIG5vdyByZXZlcnNlIGl0IHNvIHRoYXQgY29udGV4dCBpcyBub3JtYWxpemVkIHdpdGggY2hpbGQgZmllbGRzIGZpcnN0CiAgICAgICAgICAgICAgICBtZXJnZWRDb250ZXh0LnJldmVyc2UoKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS51cGRhdGVWYWxpZGF0aW9uU3RhdGVGb3JDb250ZXh0KHNlbGYudmlldywgbWVyZ2VkQ29udGV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNiKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZpZXcgYW5kIGxvY2FsZSBmcmllbmRseSByZXRyaWV2YWwgb2YgbWVzc2FnZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICovCiAgICAgICAgZ2V0TWVzc2FnZTogZnVuY3Rpb24oa2V5KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRNZXNzYWdlKGtleSwgdGhpcy52aWV3LmxvY2FsZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoaXMgZmllbGQgYW5kIHJldHVybnMgd2hldGhlciBpdCBpcyBpbiBhIHZhbGlkIHN0YXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSB2YWxpZGF0ZUNoaWxkcmVuIHdoZXRoZXIgdG8gY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkYXRlQ2hpbGRyZW4pCiAgICAgICAgewogICAgICAgICAgICAvLyBza2lwIG91dCBpZiB3ZSBoYXZlbid0IHlldCBib3VuZCBhbnkgZGF0YSBpbnRvIHRoaXMgY29udHJvbAogICAgICAgICAgICAvLyB0aGUgY29udHJvbCBjYW4gc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBpbml0aWFsaXppbmcKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRydWU7CgogICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6aW5nICYmIHRoaXMub3B0aW9ucy52YWxpZGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdmFsaWRhdGVDaGlsZHJlbiwgdGhlbiB3YWxrIHJlY3Vyc2l2ZWx5IGRvd24gaW50byBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdmFsaWRhdGVDaGlsZHJlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudmFsaWRhdGUodmFsaWRhdGVDaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGUgb3Vyc2VsdmVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmhhbmRsZVZhbGlkYXRlKCk7CgogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3Igc29tZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzICYmIEFscGFjYS5sb2dMZXZlbCA9PSBBbHBhY2EuREVCVUcpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZUlkIGluIHRoaXMudmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW21lc3NhZ2VJZF1bInN0YXR1cyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMudmFsaWRhdGlvblttZXNzYWdlSWRdWyJtZXNzYWdlIl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlZhbGlkYXRpb24gZmFpbHVyZSBmb3IgZmllbGQgKGlkPSIgKyB0aGlzLmdldElkKCkgKyAiLCBwYXRoPSIgKyB0aGlzLnBhdGggKyAiKSwgbWVzc2FnZXM6ICIgKyBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5VmFsaWRhdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlT3B0aW9uYWwoKTsKICAgICAgICAgICAgdmFsSW5mb1sibm90T3B0aW9uYWwiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoIm5vdE9wdGlvbmFsIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpc2FsbG93KCk7CiAgICAgICAgICAgIHZhbEluZm9bImRpc2FsbG93VmFsdWUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImRpc2FsbG93VmFsdWUiKSwgW3RoaXMuc2NoZW1hWyJkaXNhbGxvdyJdLmpvaW4oJywgJyldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiB2YWxJbmZvWyJub3RPcHRpb25hbCJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJkaXNhbGxvd1ZhbHVlIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyB1c2luZyB1c2VyIHByb3ZpZGVkIHZhbGlkYXRvci4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVDdXN0b21WYWxpZGF0b3I6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWxpZGF0b3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZhbGlkYXRvcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWxpZGF0b3IuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWxJbmZvKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzdG9yZSBpbiAiY3VzdG9tIgogICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRpb25bImN1c3RvbSJdID0gdmFsSW5mbzsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyAmJiBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLndoaXRlc3BhY2UsIHRoaXMuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGlzYWxsb3c6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuc2NoZW1hLmRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBkaXNhbGxvdyA9IHRoaXMuc2NoZW1hLmRpc2FsbG93OwogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KGRpc2FsbG93KSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChkaXNhbGxvdywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWxwYWNhLmlzT2JqZWN0KHZhbCkgfHwgKEFscGFjYS5pc0FycmF5KHZhbCkpICYmIEFscGFjYS5pc1N0cmluZyh2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFscGFjYS5wYXJzZUpTT04odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuY29tcGFyZU9iamVjdCh2YWwsIHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbGxvd2VkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKEFscGFjYS5pc09iamVjdCh2YWwpIHx8IChBbHBhY2EuaXNBcnJheSh2YWwpKSAmJiBBbHBhY2EuaXNTdHJpbmcoZGlzYWxsb3cpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvdyA9IEFscGFjYS5wYXJzZUpTT04oZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFscGFjYS5jb21wYXJlT2JqZWN0KHZhbCwgZGlzYWxsb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBsaXN0ZW5zIHRvIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBFWFRFTlNJT05fUE9JTlQKICAgICAgICAgKgogICAgICAgICAqIERpc2FibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gT1ZFUlJJREUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBPVkVSUklERQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE9WRVJSSURFCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgZmllbGQgaXMgZW5hYmxlZAogICAgICAgICAqLwogICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIG9uIHRoZSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgY29udHJvbCBmb2N1c2VkIHVwb24uCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykgewogICAgICAgICAgICAvLyBPVkVSUklERQoKICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFB1cmdlcyBhbnkgZXZlbnQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhpcyBmaWVsZCBmcm9tIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyByZW1vdmUgb2JzZXJ2YWJsZQogICAgICAgICAgICBBbHBhY2Eub2JzZXJ2YWJsZSh0aGlzLnBhdGgpLmNsZWFyKCk7CgogICAgICAgICAgICAvLyBjbGVhbiB1cCBBbHBhY2EuZmllbGRJbnN0YW5jZXMgc3RhdGljIHJlZmVyZW5jZSAodXNlZCBmb3IgY29udmVuaWVuY2UgYWNjZXNzIHRvIHByZXZpb3VzIHJlbmRlcmVkIGZpZWxkcykKICAgICAgICAgICAgaWYgKEFscGFjYSAmJiBBbHBhY2EuZmllbGRJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXSkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBBbHBhY2EuZmllbGRJbnN0YW5jZXNbdGhpcy5nZXRJZCgpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgRE9NCiAgICAgICAgICAgICQodGhpcy5maWVsZCkucmVtb3ZlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmhpZGRlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGhpZGRlbiBvcHRpb24gaXMgb24sIHdlJ3JlIGFsd2F5cyBoaWRkZW4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiIgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5vblNob3coKTsKCiAgICAgICAgICAgICAgICAvLyBDQUxMQkFDSzogInNob3ciCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygic2hvdyIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25TaG93OiBmdW5jdGlvbigpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgZmllbGQuCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLm9uSGlkZSgpOwoKICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJoaWRlIgogICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjaygiaGlkZSIpOwogICAgICAgIH0sCgogICAgICAgIG9uSGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgaXNWYWxpZGF0aW9uUGFydGljaXBhbnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTsKICAgICAgICB9LAoKICAgICAgICBpc1Nob3duOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSGlkZGVuKCk7CiAgICAgICAgfSwKCiAgICAgICAgaXNIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKCJub25lIiA9PT0gJCh0aGlzLmZpZWxkKS5jc3MoImRpc3BsYXkiKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJpbnRzIHRoZSBmaWVsZC4KICAgICAgICAgKi8KICAgICAgICBwcmludDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGRFbCgpLnByaW50QXJlYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkucHJpbnRBcmVhKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZmllbGQgaXMgYmVpbmcgcmV2ZWFsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGRlcGVuZGVuY3kgb3IgY29uZGl0aW9uYWwgY2FsY3VsYXRpb24KICAgICAgICAgKiB0aGF0IGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudFJldmVhbDogZnVuY3Rpb24oKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGZpZWxkIGlzIGJlaW5nIGNvbmNlYWxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZGVwZW5kZW5jeSBvciBjb25kaXRpb25hbCBjYWxjdWxhdGlvbgogICAgICAgICAqIHRoYXQgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKi8KICAgICAgICBvbkRlcGVuZGVudENvbmNlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlbG9hZHMgdGhlIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLmNhbGxiYWNrKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLCB0aGlzLnJlbmRlcmVkQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJlZENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgZmllbGQgYW5kIHJlc2V0cyB0aGUgZmllbGQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGNsZWFyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgdmFsdWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmlzVmFsRW1wdHkodGhpcy5nZXRWYWx1ZSgpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaW5kcyBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihjaGVja0NoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNWYWxpZGF0aW9uUGFydGljaXBhbnQoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWYWxpZChjaGVja0NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMudmFsaWRhdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsaWRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uW2tleV0uc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5maWVsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW92ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTW91c2VPdmVyLmNhbGwoX3RoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnRyaWdnZXIoIm1vdXNlb3ZlciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5maWVsZC5tb3VzZW91dChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25Nb3VzZU91dC5jYWxsKF90aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyKCJtb3VzZW91dCIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5vbkZpZWxkPEZpZWxkTmFtZT4gPSBmbgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMub3B0aW9ucywgZnVuY3Rpb24oa2V5LCBmdW5jKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2Euc3RhcnRzV2l0aChrZXksJ29uRmllbGQnKSAmJiBBbHBhY2EuaXNGdW5jdGlvbihmdW5jKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGtleS5zdWJzdHJpbmcoNykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuY2FsbChfdGhpcyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZnV0dXJlIHN1cHBvcnQgLSBzcGVjaWZ5IGV2ZW50cyB2aWEgb3B0aW9ucy5ldmVudHMuPGV2ZW50TmFtZT4gPSBmbgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZXZlbnRzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZXZlbnRzLCBmdW5jdGlvbihldmVudCwgZnVuYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0Z1bmN0aW9uKGZ1bmMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICJyZW5kZXIiIHx8IGV2ZW50ID09PSAicmVhZHkiIHx8IGV2ZW50ID09PSAiYmx1ciIgfHwgZXZlbnQgPT09ICJmb2N1cyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub24oZXZlbnQsIGZ1bmN0aW9uKGUsIGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLCBlLCBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmllbGQub24oZXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5jYWxsKF90aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIGhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWVtcHR5Iik7CiAgICAgICAgICAgICQodGhpcy5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1maWVsZC1mb2N1c2VkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGZpZWxkIGxvc2VzIGZvY3VzIChibHVycykuCiAgICAgICAgICoKICAgICAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciB0aGUgZW50aXJlIGZpZWxkIHRvIHVuLWhpZ2hsaWdodC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIGRvbSBldmVudAogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgdmFyIHdhc0ZvY3VzZWQgPSAkKHRoaXMuZmllbGQpLmhhc0NsYXNzKCJhbHBhY2EtZmllbGQtZm9jdXNlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgVUkgdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICBpZiAod2FzRm9jdXNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxkYmx1ciIKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS50cmlnZ2VyKCJmaWVsZGJsdXIiKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byB1cGRhdGUgdGhlIGNvbnRyb2wncyB2YWx1ZSBhbmQgbm90aWZ5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGUgRXZlbnQuCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBpbnRvIGRhdGEgZWxlbWVudAogICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmVhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgYSBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlCiAgICAgICAgICovCiAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAqLwogICAgICAgIG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgYSBmaWVsZCBjb250cm9sIGJ5IGl0cyBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggRmllbGQgY29udHJvbCBwYXRoLgogICAgICAgICAqIEByZXR1cm5zIHtBbHBhY2EuRmllbGR9IEZpZWxkIGNvbnRyb2wgbWFwcGVkIHRvIHRoZSBwYXRoLgogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xCeVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHBhdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiLyIgaWYgaXQgaXMgdGhlcmUKICAgICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoIi8iKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIvIiBpZiBpdCBpcyB0aGVyZQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5lbmRzV2l0aChwYXRoLCAiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnJheS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEVsZW1lbnQgPSBwYXRoQXJyYXlbaV07CgogICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IHBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIHZhciBfaW5kZXggPSAtMTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHoxID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiWyIpOwogICAgICAgICAgICAgICAgICAgIGlmICh6MSA+PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHoyID0gcGF0aEVsZW1lbnQuaW5kZXhPZigiXSIsIHoxICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6MiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5kZXggPSBwYXJzZUludChwYXRoRWxlbWVudC5zdWJzdHJpbmcoejEgKyAxLCB6MikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBwYXRoRWxlbWVudC5zdWJzdHJpbmcoMCwgejEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbkJ5UHJvcGVydHlJZFtfbmFtZV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2luZGV4ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW19pbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgQWxwYWNhIGNvbnRyb2xzIGJ5IHRoZWlyIEFscGFjYSBmaWVsZCB0eXBlIChpLmUuICJ0ZXh0IiwgImNoZWNrYm94IiwgImNrZWRpdG9yIikKICAgICAgICAgKiBUaGlzIGRvZXMgYSBkZWVwIHRyYXZlcnNhbCBhY3Jvc3MgdGhlIGdyYXBoIG9mIEFscGFjYSBmaWVsZCBpbnN0YW5jZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmllbGRUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlGaWVsZFR5cGU6IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewoKICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CgogICAgICAgICAgICBpZiAoZmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgZmllbGRUeXBlLCBhcnJheSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW5baV0uZ2V0RmllbGRUeXBlKCkgPT09IGZpZWxkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBmaWVsZFR5cGUsIGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKHRoaXMsIGZpZWxkVHlwZSwgYXJyYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIEFscGFjYSBjb250cm9scyBieSB0aGVpciBzY2hlbWEgdHlwZSAoaS5lLiAic3RyaW5nIiwgIm51bWJlciIpLgogICAgICAgICAqIFRoaXMgZG9lcyBhIGRlZXAgdHJhdmVyc2FsIGFjcm9zcyB0aGUgZ3JhcGggb2YgQWxwYWNhIGZpZWxkIGluc3RhbmNlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xzQnlTY2hlbWFUeXBlOiBmdW5jdGlvbihzY2hlbWFUeXBlKSB7CgogICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsKCiAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKHBhcmVudCwgc2NoZW1hVHlwZSwgYXJyYXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmdldFR5cGUoKSA9PT0gc2NoZW1hVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYXJlbnQuY2hpbGRyZW5baV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuW2ldLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYocGFyZW50LmNoaWxkcmVuW2ldLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZih0aGlzLCBzY2hlbWFUeXBlLCBhcnJheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LAoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8KICAgICAgICAvLyBPQlNFUlZBQkxFUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLnN1YnNjcmliZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EudW5zdWJzY3JpYmUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgfSwKCiAgICAgICAgb2JzZXJ2YWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBbHBhY2EubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmdldE9ic2VydmFibGVTY29wZSgpKTsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2Eub2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBjbGVhck9ic2VydmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhcmdzID0gQWxwYWNhLm1ha2VBcnJheShhcmd1bWVudHMpOwogICAgICAgICAgICBhcmdzLnVuc2hpZnQodGhpcy5nZXRPYnNlcnZhYmxlU2NvcGUoKSk7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmNsZWFyT2JzZXJ2YWJsZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9LAoKICAgICAgICBkZXBlbmRlbnRPYnNlcnZhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9IEFscGFjYS5tYWtlQXJyYXkoYXJndW1lbnRzKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuZ2V0T2JzZXJ2YWJsZVNjb3BlKCkpOwoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZXBlbmRlbnRPYnNlcnZhYmxlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0sCgoKICAgICAgICAvLyBVdGlsaXR5IEZ1bmN0aW9ucyBmb3IgRm9ybSBCdWlsZGVyCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2NoZW1hIGRhdGEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFNjaGVtYSBkYXRhIHR5cGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJlcXVpcmVkCiAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAqCiAgICAgICAgICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250cm9sIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgdHlwZSBvZiB0aGUgYmFzZSBjbGFzcyAob3IgbnVsbCBpZiBub25lKQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlRmllbGRUeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5jb25zdHJ1Y3Rvci5hbmNlc3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgIGlmICh4ICYmIHguZ2V0RmllbGRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiYXNlRmllbGRUeXBlID0geC5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VGaWVsZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmluZHMgaWYgdGhpcyBmaWVsZCBpcyBhIGNvbnRhaW5lciBvZiBvdGhlciBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBpcyBhIGNvbnRhaW5lciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGlzQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBmaWVsZCBpcyByZXF1aXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEEgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBieSBlaXRoZXIgc3BlY2lmeWluZyByZXF1aXJlZDogdHJ1ZSBvbiB0aGUgc2NoZW1hIGZvciBhIGZpZWxkIG9yIGJ5CiAgICAgICAgICogc3BlY2lmeWluZyBhIHJlcXVpcmVkIGFycmF5IG9uIHRoZSBwYXJlbnQgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGZpZWxkIChhcyBwZXIganNvbiBzY2hlbWEgdiAwNCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBpc1JlcXVpcmVkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBhc3N1bWUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYS5yZXF1aXJlZCkgPT09ICJib29sZWFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0aGlzLnNjaGVtYS5yZXF1aXJlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IganNvbi1zY2hlbWEgZHJhZnQgMDQKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHRoaXMucGFyZW50LnNjaGVtYS5yZXF1aXJlZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkQXJyYXkgPSB0aGlzLnBhcmVudC5zY2hlbWEucmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkQXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFycmF5W2ldID09PSB0aGlzLnByb3BlcnR5SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgdGl0bGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCB0aXRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZmllbGQgZGVzY3JpcHRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBGaWVsZCBkZXNjcmlwdGlvbi4KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gSlNPTiBzY2hlbWEgb2YgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFPZlNjaGVtYSA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRoaXMuZ2V0VGl0bGUoKSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaXRsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlJlYWRvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuICBBIHJlYWQtb25seSBmaWVsZCBjYW5ub3QgaGF2ZSBpdCdzIHZhbHVlIGNoYW5nZWQuICBSZWFkLW9ubHkgZmllbGRzIHJlbmRlciBpbiBhIGdyYXllZC1vdXQgb3IgZGlzYWJsZWQgY29udHJvbC4gIElmIHRoZSBmaWVsZCBpcyByZW5kZXJlZCB1c2luZyBhIHZpZXcgd2l0aCB0aGUgPGNvZGU+ZGlzcGxheVJlYWRvbmx5PC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlLCB0aGUgcmVhZC1vbmx5IGZpZWxkIHdpbGwgbm90IGFwcGVhci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgaXMgcmVxdWlyZWQuICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgdGFrZSBvbiBhIHZhbGlkIHZhbHVlIGFuZCBjYW5ubm90IGJlIGxlZnQgZW1wdHkgb3IgdW5hc3NpZ25lZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHByb3BlcnR5LiAgSWYgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCBpcyBlbXB0eSBvciBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBsdWdnZWQgaW4gZm9yIHlvdS4gIFNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlIHdoZW4geW91IHdhbnQgdG8gcHJlLXBvcHVsYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFoZWFkIG9mIHRpbWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIGZvcm1hdCBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzYWxsb3dlZCBWYWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBkaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHByb3BlcnR5IGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmdldFR5cGUgJiYgIUFscGFjYS5pc1ZhbEVtcHR5KHRoaXMuZ2V0VHlwZSgpKSkgewogICAgICAgICAgICAgICAgc2NoZW1hT2ZTY2hlbWEucHJvcGVydGllcy50eXBlWydkZWZhdWx0J10gPSB0aGlzLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgIHNjaGVtYU9mU2NoZW1hLnByb3BlcnRpZXMudHlwZVsnZW51bSddID0gW3RoaXMuZ2V0VHlwZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2NoZW1hT2ZTY2hlbWE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHNob3J0IGRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZXRhaWxlZCBkZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHdpbGwgYmUgcmVhZCBvbmx5IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlYWQtb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgc2V0IGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJGaWVsZCBkYXRhIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIEFscGFjYS5kZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvdyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJEaXNhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIERlcGVuZGVuY2llcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpemUiOjMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhU291cmNlIjogZnVuY3Rpb24gKGZpZWxkLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnBhcmVudCAmJiBmaWVsZC5wYXJlbnQuc2NoZW1hUGFyZW50ICYmIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkLnBhcmVudC5zY2hlbWFQYXJlbnQucGFyZW50LmNoaWxkcmVuQnlQcm9wZXJ0eUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gZmllbGQucGFyZW50LnNjaGVtYVBhcmVudC5wcm9wZXJ0eUlkKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0T3B0aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEpTT04gc2NoZW1hIG9mIHRoZSBBbHBhY2Egb3B0aW9ucyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYU9mT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb25zIGZvciAiICsgdGhpcy5nZXRUaXRsZSgpLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5nZXREZXNjcmlwdGlvbigpICsgIiAoT3B0aW9ucykiLAogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtIjp7fSwKICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZmllbGQgaWQuIEF1dG8tZ2VuZXJhdGVkIGlmIG5vdCBwcm92aWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdHlwZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRoaXMuZ2V0RmllbGRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IE1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRpc3BsYXkgdmFsaWRhdGlvbiBtZXNzYWdlcyBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FibGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgZGlzYWJsZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUmVhZG9ubHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgd2lsbCBiZSByZWFkb25seSBpZiB0cnVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHdpbGwgYmUgaGlkZGVuIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkxhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIGxhYmVsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgaGVscCBtZXNzYWdlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGVscGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBmaWVsZCBoZWxwIG1lc3NhZ2VzLiAgRWFjaCBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIG9uIGl0J3Mgb3duIGxpbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ1NTIGNsYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBkb20gZWxlbWVudCBmb3IgdGhpcyBmaWVsZCBvbmNlIGl0IGlzIHJlbmRlcmVkLiAgU3VwcG9ydHMgYSBzaW5nbGUgdmFsdWUsIGNvbW1hLWRlbGltaXRlZCB2YWx1ZXMsIHNwYWNlLWRlbGltaXRlZCB2YWx1ZXMgb3IgdmFsdWVzIHBhc3NlZCBpbiBhcyBhbiBhcnJheS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSGlkZSBJbml0aWFsIFZhbGlkYXRpb24gRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIGluaXRpYWwgZm9jdXMgZm9yIHRoZSBmb3JtIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50ICh1c3VhbGx5IHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZm9ybSkuICBJZiBhIGZpZWxkIG5hbWUgb3IgcGF0aCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgc3BlY2lmaWVkIGNoaWxkIGZpZWxkIHdpbGwgcmVjZWl2ZSBmb2N1cy4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgc2V0IGZvY3VzIHRvICduYW1lJyAoc2VsZWN0aW5nIHRoZSAnbmFtZScgZmllbGQpIG9yIHlvdSBtaWdodCBzZXQgaXQgdG8gJ2NsaWVudC9uYW1lJyB3aGljaCBwaWNrcyB0aGUgJ25hbWUnIGZpZWxkIG9uIHRoZSAnY2xpZW50JyBvYmplY3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJvcHRpb25MYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbnVtZXJhdGVkIFZhbHVlIExhYmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBzdHJpbmcgbGFiZWxzIGZvciBpdGVtcyBpbiB0aGUgZW51bSBhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZpZXciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPdmVycmlkZSBvZiB0aGUgdmlldyBmb3IgdGhpcyBmaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoaXMgZmllbGQgdG8gYmUgcmVuZGVyZWQgd2l0aCBhIGRpZmZlcmVudCB2aWV3IChzdWNoIGFzICdkaXNwbGF5JyBvciAnY3JlYXRlJykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5pc1RvcExldmVsKCkpIHsKCiAgICAgICAgICAgICAgICBzY2hlbWFPZk9wdGlvbnMucHJvcGVydGllcy5mb3JtID0gewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgcmVuZGVyaW5nIHRoZSBGT1JNIHRhZy4iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQXR0cmlidXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgRk9STSB0YWcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbmlxdWUgZm9ybSBpZC4gQXV0by1nZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBzdWJtaXNzaW9uIGVuZHBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1ldGhvZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGb3JtIHN1Ym1pc3Npb24gbWV0aG9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsicG9zdCIsImdldCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVieXJhaWxzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUnVieSBPbiBSYWlscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSdWJ5IG9uIFJhaWxzIE5hbWUgU3RhbmRhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9ybSBuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9jdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRm9jdXMgU2V0dGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJidXR0b25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm0gQnV0dG9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBmb3IgZm9ybS1ib3VuZCBidXR0b25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VibWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU3VibWl0IEJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZXNldCBidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9nZ2xlIFN1Ym1pdCBWYWxpZCBTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVG9nZ2xlIHRoZSB2YWxpZGl0eSBzdGF0ZSBvZiB0aGUgU3VibWl0IGJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hT2ZPcHRpb25zLnByb3BlcnRpZXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNjaGVtYU9mT3B0aW9uczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIEFscGFjYSBvcHRpb25zIGZvciB0aGUgQWxwYWNhIG9wdGlvbnMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbHBhY2Egb3B0aW9ucyBmb3IgdGhlIEFscGFjYSBvcHRpb25zIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zRm9yT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmZvcmNlIHZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93TWVzc2FnZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjoiRGlzYWJsZSB0aGlzIGZpZWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkhpZGUgdGhpcyBmaWVsZCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHRhcmVhIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhlbHBlcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dGFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmaWVsZENsYXNzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImhpZGVJbml0VmFsaWRhdGlvbkVycm9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJIaWRlIGluaXRpYWwgdmFsaWRhdGlvbiBlcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb2N1cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBdXRvLWZvY3VzIGZpcnN0IGNoaWxkIGZpZWxkIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbkxhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmlldyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLmlzVG9wTGV2ZWwoKSkgewogICAgICAgICAgICAgICAgb3B0aW9uc0Zvck9wdGlvbnMuZmllbGRzLmZvcm0gPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gb3B0aW9uc0Zvck9wdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIFJlZ2lzdGVycyBhZGRpdGlvbmFsIG1lc3NhZ2VzCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiezB9IGFyZSBkaXNhbGxvd2VkIHZhbHVlcy4iLAogICAgICAgICJub3RPcHRpb25hbCI6ICJUaGlzIGZpZWxkIGlzIG5vdCBvcHRpb25hbC4iCiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuQ29udHJvbEZpZWxkID0gQWxwYWNhLkZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbnRyb2xGaWVsZC5wcm90b3R5cGUKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udHJvbCBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5pc0NvbnRyb2xGaWVsZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWwoKSBmcm9tIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIGNvbnZlcnNpb24gdG8gdGhlIGNvcnJlY3Qgc2NhbGFyIHR5cGUKICAgICAgICAgICAgICAgIHRoaXMuX2dldENvbnRyb2xWYWwgPSBmdW5jdGlvbihlbnN1cmVQcm9wZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAkKHRoaXMuY29udHJvbCkudmFsKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlUHJvcGVyVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMuZW5zdXJlUHJvcGVyVHlwZSh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciBjb250cm9sVGVtcGxhdGVUeXBlID0gc2VsZi5yZXNvbHZlQ29udHJvbFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAgICAgaWYgKCFjb250cm9sVGVtcGxhdGVUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udHJvbDogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERlc2NyaXB0b3IgPSB0aGlzLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250cm9sLSIgKyBjb250cm9sVGVtcGxhdGVUeXBlLCBzZWxmKTsKCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5yZW5kZXJCdXR0b25zKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnZhbHVlID0gdGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS5zdHlsZXMgPSB0aGlzLnZpZXcuc3R5bGVzLmJ1dHRvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdldENvbnRyb2xFbDogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzb2x2ZUNvbnRyb2xUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHdlIHdhbGsgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBmaW5kIGEgdGVtcGxhdGUgdHlwZQoKICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWIuZ2V0RmllbGRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRyb2wtIiArIGIuZ2V0RmllbGRUeXBlKCksIHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlID0gYi5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghZmluaXNoZWQpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBvblNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9yIGNvbnRyb2wgZmllbGRzLCB3ZSB1c2UgdGhlICJjb250cm9sIiB0ZW1wbGF0ZSBhcyB0aGUgcHJpbWFyeS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQKICAgICAgICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRlbXBsYXRlRGVzY3JpcHRvcklkIDogZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICJjb250cm9sIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgYSAiY29udHJvbCIgZG9tIGVsZW1lbnQgaW5zaWRlIG9mIHRoZSBmaWVsZCB3aGljaCBob3VzZXMgb3VyIGN1c3RvbSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNyZW5kZXJGaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLy8gZmluZCBvdXIgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbCA9ICQodGhpcy5maWVsZCkuZmluZCgiLiIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRST0xfRklFTEQpOwogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVFJPTF9GSUVMRCk7CgogICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVDb250cm9sTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlZm9yZVJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKGNvbnRyb2xGaWVsZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sRmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlcGxhY2VXaXRoKGNvbnRyb2xGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sID0gY29udHJvbEZpZWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYWRkQ2xhc3MoQWxwYWNhLkNMQVNTX0NPTlRST0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29udHJvbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250cm9sIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclJlbmRlckNvbnRyb2wobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdXNlIGluIHJlbmRlcmluZyB0aGUgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKG1vZGVsKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSB7fTsKICAgICAgICAgICAgICAgIG1vZGVsLmlkID0gdGhpcy5nZXRJZCgpOwogICAgICAgICAgICAgICAgbW9kZWwubmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBtb2RlbC5zY2hlbWEgPSB0aGlzLnNjaGVtYTsKICAgICAgICAgICAgICAgIG1vZGVsLmRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgICAgICBtb2RlbC5yZXF1aXJlZCA9IHRoaXMuaXNSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHRoaXMudmlldzsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpcyByZW5kZXJlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgaWYgKCFzZWxmLmZpcnN0VXBkYXRlT2JzZXJ2YWJsZUZpcmUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2Yoc2VsZi5kYXRhKSA9PSAidW5kZWZpbmVkIikgfHwgc2VsZi5kYXRhID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RVcGRhdGVPYnNlcnZhYmxlRmlyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBidXR0b25zCiAgICAgICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWNvbnRyb2wtYnV0dG9uIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gY2xpY2sgaGFuZGxlcj8KICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKGNvbnRyb2wsIGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChjb250cm9sLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2VsZiwgYnV0dG9uQ29uZmlnLmNsaWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZW5kZXJzIHRoZSBjb250cm9sIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4dGVuc2lvbi1wb2ludAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sRGVzY3JpcHRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gQWxwYWNhLnRtcGwodGhpcy5jb250cm9sRGVzY3JpcHRvciwgbW9kZWwpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvbnRyb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIGxhYmVsCiAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbERpdiA9ICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1jb250cm9sZmllbGQtbGFiZWwiKTsKICAgICAgICAgICAgICAgICB2YXIgbGFiZWxEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1sYWJlbCcsIHRoaXMub3V0ZXJFbCk7CiAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGl2Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRoaXMubGFiZWxEaXYgPSBsYWJlbERpdjsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHZhciBoZWxwZXJEaXYgPSAkKCcuYWxwYWNhLWNvbnRyb2xmaWVsZC1oZWxwZXInLCB0aGlzLm91dGVyRWwpOwogICAgICAgICAgICAgICAgIGlmIChoZWxwZXJEaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJEaXYgPSBoZWxwZXJEaXY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVwZGF0ZURPTUVsZW1lbnQ6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lIGZpZWxkCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuYXR0cigibmFtZSIsIHRoaXMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXREZWZhdWx0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGF0YSA9IEFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hWydkZWZhdWx0J10pID8gIiIgOiB0aGlzLnNjaGVtYVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkZWZhdWx0RGF0YSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHJldHVybnMge0FueX0gdmFsdWUgRmllbGQgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzcGxheU9ubHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0Q29udHJvbFZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc29tZSBjb3JyZWN0aW9uIGZvciB0eXBlCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgY29udHJvbCB2YWx1ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogRXh0ZW5zaW9uIHBvaW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZWxlbWVudCB2YWx1ZSBpcyBwYXJ0IG9mIHRoZSBlbnVtIGxpc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF92YWxpZGF0ZUVudW06IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldEVudW0oKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5pbkFycmF5KHRoaXMuZ2V0RW51bSgpLCB2YWwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUVudW0oKTsKCiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHZhbHVlcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaW4gdGhlIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBvcHRpb25MYWJlbHMsIHVzZSB0aGVtIGluCiAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlIHRvIHRoZSByYXcgZW51bSB2YWx1ZXMuCiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgLy8gdXNlIG9wdGlvbiBsYWJlbHMgaWYgdGhvc2UgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVZhbHVlcyA9IG9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXSA9IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkVmFsdWVPZkVudW0iKSwgW21lc3NhZ2VWYWx1ZXMuam9pbignLCAnKSwgdGhpcy5nZXRWYWx1ZSgpXSksCiAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJpbnZhbGlkVmFsdWVPZkVudW0iXVsic3RhdHVzIl07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjaW5pdEV2ZW50cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5pdEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRDb250cm9sRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgICAgICBjb250cm9sLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImNsaWNrIiwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNvbnRyb2wgbGV2ZWwgaGFuZGxlcnMgZm9yIHRoaW5ncyB0aGF0IGhhcHBlbiB0byBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAgICBjb250cm9sLmNoYW5nZShmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byBydW4gQUZURVIgY29udHJvbCBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DaGFuZ2UuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5mb2N1cyhmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYud2FzRm9jdXNlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb250cm9sLmJsdXIoZnVuY3Rpb24oZSkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhc0JsdXJyZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbkJsdXIuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5cHJlc3MoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVByZXNzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5dXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzZWxmLnRyaWdnZXIoImtleXVwIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBzZWxmLm9uS2V5RG93bi5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IHByZXNzIGV2ZW50IGlzIHJlY2VpdmVkIGZvciB0aGUgZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGVkaXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy50eXBlICYmIHNlbGYudmlldy50eXBlID09PSAnZWRpdCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbnZhbGlkLCB0aGVuIHdlIHByb3ZpZGUgZWFybHkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgYXMgdG8gd2hlbiB0aGV5IGVudGVyCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkIHdhcyB2YWxpZCwgd2UgZG9uJ3QgcmVuZGVyIGludmFsaWRhdGlvbiBmZWVkYmFjayB1bnRpbCB0aGV5IGJsdXIgdGhlIGZpZWxkCgogICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0aGUgY29udHJvbCB2YWxpZCBwcmV2aW91c2x5PwogICAgICAgICAgICAgICAgICAgIHZhciB3YXNWYWxpZCA9IHRoaXMuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsaWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnZpZXcudHlwZSAmJiBzZWxmLnZpZXcudHlwZSA9PT0gJ2NyZWF0ZScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdhc1ZhbGlkID0gdGhpcy5pc1ZhbGlkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNWYWxpZCAmJiBzZWxmLndhc0JsdXJyZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgdGltZW91dCBiZWNhdXNlIGF0IHRoaXMgZXhhY3QgbW9tZW50LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaXMgc3RpbGwgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeSByYWlzZXMgdGhlIGtleXByZXNzIGV2ZW50IGFoZWFkIG9mIHRoZSBpbnB1dCByZWNlaXZpbmcgdGhlIG5ldyBkYXRhIHdoaWNoIHdvdWxkIGluY29ycG9yYXRlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSB0aGF0IHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRpbWVvdXQgcHJvdmlkZXMgdGhlIGJyb3dzZXIgd2l0aCBlbm91Z2ggdGltZSB0byBwbHVnIHRoZSB2YWx1ZSBpbnRvIHRoZSBpbnB1dCBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHZhbGlkYXRpb24gbG9naWMgdXNlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29udHJvbCBpcyBub3cgaW4gYSB2YWxpZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIGEga2V5IGRvd24gZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIHRoZSBmaWVsZCBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZSBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleURvd246IGZ1bmN0aW9uKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGtleSB1cCBldmVudCBpcyByZWNlaXZlZCBmb3IgdGhlIGZpZWxkIGNvbnRyb2wuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbktleVVwOiBmdW5jdGlvbihlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlciBmb3IgY2xpY2sgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIENsaWNrIGV2ZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNlbmFibGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5wcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNpc0Rpc2FibGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHRoaXMuY29udHJvbCkucHJvcCgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBlbnVtIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5zY2hlbWFbImVudW0iXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgZW51bSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHthcnJheX0gZW51bUFycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRFbnVtOiBmdW5jdGlvbihlbnVtQXJyYXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5zYWZlU2V0T2JqZWN0QXJyYXkodGhpcy5zY2hlbWEsICJlbnVtIiwgZW51bUFycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IHRoZSBvcHRpb24gbGFiZWxzIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uTGFiZWxzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbIm9wdGlvbkxhYmVscyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdGhpcy5vcHRpb25zWyJvcHRpb25MYWJlbHMiXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0cyB0aGUgb3B0aW9uIGxhYmVscyB0byB1c2UgZm9yIHRoaXMgZmllbGQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IG9wdGlvbkxhYmVsc0FycmF5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKG9wdGlvbkxhYmVsc0FycmF5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2Euc2FmZVNldE9iamVjdEFycmF5KHRoaXMub3B0aW9ucywgIm9wdGlvbkxhYmVscyIsIG9wdGlvbkxhYmVsc0FycmF5KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gZW51bWVyYXRlZCB2YWx1ZXMgdXNpbmcgdGhlIGxvY2FsIHNvcnRTZWxlY3RhYmxlT3B0aW9ucyBtZXRob2QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzb3J0RW51bTogZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlcyA9IHRoaXMuZ2V0RW51bSgpOwogICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSB0aGlzLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnVtVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGVudW1WYWx1ZXNbaV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzICYmIG9wdGlvbkxhYmVscy5sZW5ndGggPj0gaSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb25MYWJlbHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZU9wdGlvbnMoc2VsZWN0YWJsZU9wdGlvbnMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgc2V0IGJhY2sKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RW51bVZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdPcHRpb25MYWJlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVPcHRpb25zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bVZhbHVlcy5wdXNoKHNlbGVjdGFibGVPcHRpb25zW2ldLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheShvcHRpb25MYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25MYWJlbHMucHVzaChzZWxlY3RhYmxlT3B0aW9uc1tpXS50ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbnVtKG5ld0VudW1WYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uTGFiZWxzKG5ld09wdGlvbkxhYmVscyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU29ydHMgYSBzZWxlY3Qgb3B0aW9ucyBhcnJheSBieSBvcmRlciBvZiBkaXNwbGF5YWJsZSB0ZXh0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB5b3UncmUgbG9va2luZyB0byBwcm92aWRlIGEgY3VzdG9tIHNvcnQgb3JkZXIsIHlvdSBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgogICAgICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9ucy5zb3J0IGZ1bmN0aW9uIC0gZm4oYSwgYikuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc29ydFNlbGVjdGFibGVPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RhYmxlT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHNvcnQgaXMgZmFsc2UsIGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNvcnQgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgYSBkZWZhdWx0IHNvcnQgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBBbHBhY2EuZGVmYXVsdFNvcnQ7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlIGEgY3VzdG9tIHNvcnQgZnVuY3Rpb24sIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc29ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnNvcnQpID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbiA9IHNlbGYub3B0aW9ucy5zb3J0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb3J0IGl0CiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlT3B0aW9ucy5zb3J0KHNvcnRGbik7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBhIGRhdGFzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhpcyBjb250cm9sLiAgVGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW50byB0aGUKICAgICAgICAgICAgICogZ2l2ZW4gYXJyYXkgYW5kIHRoZSBvbkZpbmlzaCBtZXRob2QgaXMgdGhlbiBjYWxsZWQgd2l0aCAoZXJyLCBhcnJheSkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAgICAgKiBAcGFyYW0gb25GaW5pc2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGludm9rZURhdGFTb3VyY2U6IGZ1bmN0aW9uKGFycmF5LCBtb2RlbCwgb25GaW5pc2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJMb2FkRGF0YVNvdXJjZU9wdGlvbnMoYXJyYXksIG1vZGVsLCBmdW5jdGlvbihlcnIsIGFycmF5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25GaW5pc2goZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgc29ydGluZyB0byB3aGF0ZXZlciB3ZSBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydFNlbGVjdGFibGVPcHRpb25zKGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluaXNoKG51bGwsIGFycmF5KTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfS5iaW5kKHNlbGYpOwoKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY2FsbChzZWxmLCBmdW5jdGlvbih2YWx1ZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlc1tpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzT2JqZWN0KHZhbHVlc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZXNba10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNVcmkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbGUgPSBzZWxmLnZpZXcubG9jYWxlOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gIiIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCI/IikgPT09IC0xKSA/ICI/IiA6ICImIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAibG9jYWxlPSIgKyBsb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uRG9jdW1lbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHMgPSBqc29uRG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIgJiYgQWxwYWNhLmlzRnVuY3Rpb24oc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gc2VsZi5vcHRpb25zLmRzVHJhbnNmb3JtZXIoZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KGRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzLCB3ZSB3YWxrIHRocm91Z2ggb25lIGtleSBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXIgb2YgdGhlIGtleXMgZnJvbSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXNlcnZlIG9yZGVyLCBjb25zaWRlciB1c2luZyBhbiBhcnJheSBhcyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cywgd2Ugd2FsayB0aHJvdWdoIG9uZSBpbmRleCBhdCBhIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc2VydGlvbiBvcmRlciBpcyBkaWN0YXRlZCBieSB0aGUgb3JkZXIgb2YgdGhlIGluZGljZXMgaW50byB0aGUgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcmVzZXJ2ZXMgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRzLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWUudGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhZ2UiOiAiREFUQVNPVVJDRV9MT0FESU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpxWEhSIiA6IGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dFN0YXR1cyIgOiB0ZXh0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQWxwYWNhLmlzQXJyYXkoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkcyA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihkc1tpXSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IGRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IGRzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QoZHNbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3Qoc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdG9yID0gc2VsZi5jb25uZWN0b3I7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzT2JqZWN0KHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3RvcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JJZCA9IHNlbGYub3B0aW9ucy5kYXRhU291cmNlLmNvbm5lY3Rvci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0b3JDb25maWcgPSBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZS5jb25uZWN0b3IuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0b3JDb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29ubmVjdG9yQ2xhc3MgPSBBbHBhY2EuZ2V0Q29ubmVjdG9yQ2xhc3MoY29ubmVjdG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbm5lY3RvckNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvckNsYXNzKGNvbm5lY3RvcklkLCBjb25uZWN0b3JDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdXNpbmcgY29ubmVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5sb2FkRGF0YVNvdXJjZShjb25maWcsIGZ1bmN0aW9uKHZhbHVlcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodmFsdWVzW2ldKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IjogdmFsdWVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNPYmplY3QodmFsdWVzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGZyb20gc3RhbmRhcmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0Ijogc2VsZi5vcHRpb25zLmRhdGFTb3VyY2Vba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFmdGVyTG9hZERhdGFTb3VyY2VPcHRpb25zOiBmdW5jdGlvbihhcnJheSwgbW9kZWwsIGNhbGxiYWNrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBhcnJheSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAgICAgLAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1MYWJlbCI6IlZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBOYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBOYW1lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNvcnQgRnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmluZXMgYW4gZihhLGIpIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBhcnJheSBvZiBlbnVtZXJhdGVkIHZhbHVlcyBbe3RleHQsIHZhbHVlfV0uICBUaGlzIGlzIHVzZWQgdG8gc29ydCBlbnVtIGFuZCBvcHRpb25MYWJlbHMgYXMgd2VsbCBhcyByZXN1bHRzIHRoYXQgY29tZSBiYWNrIGZyb20gYW55IGRhdGEgc291cmNlcyAoZm9yIHNlbGVjdCBhbmQgcmFkaW8gY29udHJvbHMpLiAgQnkgZGVmYXVsdCB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gICBEb24ndCBhcHBseSBhbnkgc29ydGluZyBpZiBmYWxzZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBpbiB7MH0uICBDdXJyZW50IHZhbHVlIGlzOiB7MX0iCiAgICB9KTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Db250YWluZXJGaWVsZCA9IEFscGFjYS5GaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuQ29udGFpbmVyRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBzaWduYWwgdGhhdCB0aGlzIGZpZWxkIGlzIGEgY29udGFpbmVyIGZpZWxkLgogICAgICAgICAqLwogICAgICAgIG9uQ29uc3RydWN0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlzQ29udGFpbmVyRmllbGQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGdldENvbnRhaW5lckVsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGNvbnRhaW5lciBmaWVsZHMsIHdlIHVzZSB0aGUgImNvbnRhaW5lciIgdGVtcGxhdGUgYXMgdGhlIHByaW1hcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUZW1wbGF0ZURlc2NyaXB0b3JJZAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVtcGxhdGVEZXNjcmlwdG9ySWQgOiBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJjb250YWluZXIiOwogICAgICAgIH0sCgogICAgICAgIHJlc29sdmVDb250YWluZXJUZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHlwZSA9IGIuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uc3RydWN0b3IuYW5jZXN0b3IucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoIWZpbmlzaGVkKTsKCiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgcmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZmllbGQgdHlwZSBhbmQgdGhlbiBjaGVjayB0aGUgdmlldyB0byBzZWUgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB2aWV3CiAgICAgICAgICAgIC8vIGlmIG5vdCwgd2Ugd2FsayB0aGUgcGFyZW50IGNoYWluIHVudGlsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0eXBlCgogICAgICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IG51bGw7CgogICAgICAgICAgICB2YXIgYiA9IHRoaXM7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghYi5nZXRGaWVsZFR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBiLmdldEZpZWxkVHlwZSgpICsgIi1pdGVtIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFR5cGUgPSBiLmdldEZpZWxkVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmNvbnN0cnVjdG9yLmFuY2VzdG9yLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCk7CgogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUeXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lclRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lclRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lclRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXI6ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJEZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJUZW1wbGF0ZVR5cGUsIHNlbGYpOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgICAgICAgICB2YXIgY29sbGFwc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLnZpZXcuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlKSkgewogICAgICAgICAgICAgICAgY29sbGFwc2libGUgPSB0aGlzLm9wdGlvbnMuY29sbGFwc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOwoKICAgICAgICAgICAgdmFyIGxlZ2VuZFN0eWxlID0gImJ1dHRvbiI7CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMudmlldy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy52aWV3LmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMub3B0aW9ucy5sZWdlbmRTdHlsZSkpIHsKICAgICAgICAgICAgICAgIGxlZ2VuZFN0eWxlID0gdGhpcy5vcHRpb25zLmxlZ2VuZFN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMubGVnZW5kU3R5bGUgPSBsZWdlbmRTdHlsZTsKCiAgICAgICAgICAgIC8vTGF6eSBsb2FkaW5nCiAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMubGF6eUxvYWRpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkaW5nID0gdGhpcy5vcHRpb25zLmxhenlMb2FkaW5nOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sbGFwc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMub3B0aW9ucy5sYXp5TG9hZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBob2xkZXJzIG9mIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4KICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZCA9IHt9OwogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgY29udGFpbmVyIGlzIERPTS13cmFwcGVkIHdpdGggYSBmb3JtLCB0aGVuIHJlbGVhc2UgdGhlIGZvcm0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7IC8vIHBhc3MgaW4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGNhbGwgYmFjayByZWN1cnNpdmVseQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9ybTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVzdHJveSBhbnkgY2hpbGQgY29udHJvbHMKICAgICAgICAgICAgQWxwYWNhLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSAiY29udGFpbmVyIiBkb20gZWxlbWVudCBpbnNpZGUgb2YgdGhlIGZpZWxkIHdoaWNoIGhvdXNlcyBvdXIgY3VzdG9tIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3JlbmRlckZpZWxkCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyRmllbGRFbGVtZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZmllbGQpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTEQpOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRCk7CgogICAgICAgICAgICAvLyByZW5kZXIKICAgICAgICAgICAgc2VsZi5wcmVwYXJlQ29udGFpbmVyTW9kZWwoZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlUmVuZGVyQ29udGFpbmVyKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlckNvbnRhaW5lcihtb2RlbCwgZnVuY3Rpb24oY29udGFpbmVyRmllbGQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIucmVwbGFjZVdpdGgoY29udGFpbmVyRmllbGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXIgPSBjb250YWluZXJGaWVsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcyhBbHBhY2EuQ0xBU1NfQ09OVEFJTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgZm9ybSBmaWVsZCB3aXRoICJhbHBhY2EtaG9yaXpvbnRhbCIgb3IgImFscGFjYS12ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudmlldy5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5hZGRDbGFzcygiYWxwYWNhLWhvcml6b250YWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFkZENsYXNzKCJhbHBhY2EtdmVydGljYWwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJjb250YWluZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJjb250YWluZXIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXJSZW5kZXJDb250YWluZXIobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHVzZSBpbiByZW5kZXJpbmcgdGhlIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbihtb2RlbCkKICAgICAgICAgKi8KICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG1vZGVsID0gewogICAgICAgICAgICAgICAgImlkIjogdGhpcy5nZXRJZCgpLAogICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgICJ2aWV3IjogdGhpcy52aWV3CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBsb2FkIGl0ZW1zIGludG8gYXJyYXkgYW5kIHN0b3JlIG9uIG1vZGVsIGZvciBmdXR1cmUgdXNlCiAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbXMoZnVuY3Rpb24oaXRlbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQ6IGFzc3VtZSBjb250YWluZXJJdGVtRWwgPSBmaWVsZEVsCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbaV0uY29udGFpbmVySXRlbUVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNvbnRhaW5lckl0ZW1FbCA9IGl0ZW1zW2ldLmdldEZpZWxkRWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuaXRlbXMgPSBpdGVtczsKCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uLXBvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbW9kZWwKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGhlIGZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJEZXNjcmlwdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBBbHBhY2EudG1wbCh0aGlzLmNvbnRhaW5lckRlc2NyaXB0b3IsIG1vZGVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBpcyByZW5kZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBleHRlbnNpb24tcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBtb2RlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zKG1vZGVsLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmFmdGVyQXBwbHlDcmVhdGVkSXRlbXMobW9kZWwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2luaXRFdmVudHMKICAgICAgICAgKi8KICAgICAgICBpbml0RXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW55IHN1Yi1pdGVtcyBmb3IgdGhpcyBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAZXh0ZW5zaW9uX3BvaW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtczogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGJlZm9yZUFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbGF5b3V0QmluZGluZ3MgPSBudWxsOwogICAgICAgICAgICBpZiAoc2VsZi5pc1RvcExldmVsKCkgJiYgc2VsZi52aWV3LmdldExheW91dCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsYXlvdXRCaW5kaW5ncyA9IHNlbGYudmlldy5nZXRMYXlvdXQoKS5iaW5kaW5nczsKCiAgICAgICAgICAgICAgICAvLyBpZiBsYXlvdXQgYW5kIGJpbmRpbmdzIG5vdCBwcm92aWRlZCwgYXNzdW1lIGEgZGVmYXVsdCBzdHJhdGVneQogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCaW5kaW5ncyAmJiBzZWxmLnZpZXcuZ2V0TGF5b3V0KCkudGVtcGxhdGVEZXNjcmlwdG9yICYmIG1vZGVsLml0ZW1zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGF5b3V0QmluZGluZ3MgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbW9kZWwuaXRlbXNbaV0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEJpbmRpbmdzW25hbWVdID0gIltkYXRhLWFscGFjYS1sYXlvdXQtYmluZGluZz0nIiArIG5hbWUgKyAiJ10iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udGFpbmVyKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWNvdW50IiwgbW9kZWwuaXRlbXMubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcyIpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBtb2RlbC5pdGVtc1tpXTsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9ICQoc2VsZi5jb250YWluZXIpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTSArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9DT05UQUlORVJfRklFTERfSVRFTV9LRVkgKyAiPSciICsgaXRlbS5uYW1lICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoIWxheW91dEJpbmRpbmdzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGluc2VydGlvblBvaW50KS5wYXJlbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludCkucmVwbGFjZVdpdGgoaXRlbS5jb250YWluZXJJdGVtRWwpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkb21FbCB0byBhbGxvdyBmb3IgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9tRWwgPSBob2xkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IGxheW91dEJpbmRpbmdzW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdJZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xkZXIgPSAkKGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob2xkZXIubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0LCBmYWxsYmFjayB0byBJRCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSAkKCcjJyArIGJpbmRpbmdJZCwgc2VsZi5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZGVyLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgKHdoaWNoIHdpbGwgc2VydmUgYXMgdGhlIGRvbUVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kb21FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmFkZENsYXNzKCJhbHBhY2EtbGF5b3V0LWJpbmRpbmctaG9sZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW0uZG9tRWwpLmF0dHIoImFscGFjYS1sYXlvdXQtYmluZGluZy1maWVsZC1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5hcHBlbmQoaXRlbS5kb21FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRvbUVsLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpdGVtLmNvbnRhaW5lckl0ZW1FbCkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4IiwgaSk7CiAgICAgICAgICAgICAgICAkKGl0ZW0uY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1uYW1lIiwgaXRlbS5uYW1lKTsKICAgICAgICAgICAgICAgICQoaXRlbS5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZCIsIHNlbGYuZ2V0SWQoKSk7CgogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyQ2hpbGQoaXRlbSwgaSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuY29sbGFwc2libGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiY29sbGFwc2libGUiCiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiY29sbGFwc2libGUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB0byBhZGQgY2hpbGQgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0FscGFjYS5Db250cm9sfSBjaGlsZCBDaGlsZCBmaWVsZCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBuZXcgY2hpbGQuCiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShpbmRleCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXSA9IGNoaWxkOwogICAgICAgICAgICBpZiAoY2hpbGQucHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtjaGlsZC5wcm9wZXJ0eUlkXSA9IGNoaWxkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmVtb3ZlIGNoaWxkIGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGluZGV4CiAgICAgICAgICovCiAgICAgICAgdW5yZWdpc3RlckNoaWxkOiBmdW5jdGlvbihpbmRleCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baW5kZXhdOwogICAgICAgICAgICBpZiAoIWNoaWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoaW5kZXgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlJZFtjaGlsZC5nZXRJZCgpXTsKICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BlcnR5SWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW2NoaWxkLnByb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgaW52b2tlZCBhZnRlciBpdGVtcyBhcmUgZHluYW1pY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgbW92ZWQgYXJvdW5kIGluIHRoZSBjaGlsZCBjaGFpbi4KICAgICAgICAgKiBJdCBhZGp1c3RzIGNsYXNzZXMgb24gY2hpbGQgRE9NIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYWRkQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkuYXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiLCBzZWxmLmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaGFzLWl0ZW1zIik7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udGFpbmVyRWwoKSkucmVtb3ZlQXR0cigiZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tY291bnQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgIC8vIHNldCBwYXRoIGlmIG5vdCBzZXQKICAgICAgICAgICAgICAgIGlmICghY2hpbGQucGF0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wYXRoID0gc2VsZi5wYXRoICsgIlsiICsgaSArICJdIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGF0aCA9IHNlbGYucGF0aCArICIvIiArIGNoaWxkLnByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkLmNhbGN1bGF0ZU5hbWUoKTsKCiAgICAgICAgICAgICAgICAkKGNoaWxkLmNvbnRhaW5lckl0ZW1FbCkucmVtb3ZlQ2xhc3MoImFscGFjYS1jb250YWluZXItaXRlbS1maXJzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLnJlbW92ZUNsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXgiKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5yZW1vdmVDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtLWtleSIpOwoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hZGRDbGFzcygiYWxwYWNhLWNvbnRhaW5lci1pdGVtIik7CgogICAgICAgICAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tZmlyc3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmFkZENsYXNzKCJhbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIsIGkpOwogICAgICAgICAgICAgICAgJChjaGlsZC5jb250YWluZXJJdGVtRWwpLmF0dHIoImRhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLW5hbWUiLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgICAgICQoY2hpbGQuY29udGFpbmVySXRlbUVsKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQiLCBzZWxmLmdldElkKCkpOwoKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ2hpbGRET01XcmFwcGVyRWxlbWVudChpLCBjaGlsZCk7CgogICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRVhURU5TSU9OIFBPSU5UIHRoYXQgYWxsb3dzIGNvbnRhaW5lcnMgdG8gdXBkYXRlIGFueSBjdXN0b20gd3JhcHBlciBlbGVtZW50cyBmb3IgY2hpbGQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaQogICAgICAgICAqIEBwYXJhbSBjaGlsZAogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUNoaWxkRE9NV3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKGksIGNoaWxkKQogICAgICAgIHsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcyBkeW5hbWljYWxseSBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuICBUaGlzIGFsbG93cyBhbGwgb2YgdGhlCiAgICAgICAgICogY29udGFpbmVyIG1hcmtlcnMgdG8gcmVmcmVzaCBvbiB0aGUgRE9NLgogICAgICAgICAqLwogICAgICAgIGhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJlbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2FsbCB1cGRhdGUgZG9tIG1hcmtlcnMgZm9yIHBhcmVudCB3aGljaCB3aWxsIHRyaWNrbGUgZG93biB0byB0byBjb3ZlciB0aGlzIGZpZWxkIGFuZCBvdXIgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuZ2V0UGFyZW50KCkudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8ganVzdCBvdXJzZWx2ZXMKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlRE9NRWxlbWVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5vbkRlcGVuZGVudFJldmVhbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvcGFnYXRlcyBzaWduYWwgZG93biB0byBhbGwgY2hpbGRyZW4uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRDb25jZWFsOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGb2N1cyBhbiBlbGVtZW50IGluIHRoZSBjb250YWluZXIuICBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgb3IgaWYgbm8gaW52YWxpZCBlbGVtZW50cywgcGljawogICAgICAgICAqIHRoZSBmaXJzdCBjaGlsZC4gIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayBpcyBmaXJlZCBhbmQgcGFzc2VkIHRoZSBjb250cm9sIGVsZW1lbnQKICAgICAgICAgKiB0aGF0IHJlY2VpdmVkIHRoZSBmb2N1cy4KICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGludmFsaWRJbmRleCA9IC0xOwoKICAgICAgICAgICAgLy8gdXNlIHRoZSBkb20gdG8gY3JlYXRlIGFuIGFycmF5IHRoYXQgb3JkZXJzIHRoaW5ncyBhcyB0aGV5IGFyZSBsYWlkIG91dCBvbiB0aGUgcGFnZQogICAgICAgICAgICB2YXIgcGFnZU9yZGVyZWRDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0pIHsKICAgICAgICAgICAgICAgIGVsID0gdGhpcy5mb3JtLmdldEZvcm1FbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tcGFyZW50LWZpZWxkLWlkPSciICsgdGhpcy5nZXRJZCgpICsgIiddIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIHdhbGsgdGhlIG9yZGVyZWQgY2hpbGRyZW4gYW5kIGZpbmQgZmlyc3QgaW52YWxpZAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VPcmRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYWdlT3JkZXJlZENoaWxkcmVuW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc1ZhbGlkKHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VPcmRlcmVkQ2hpbGRyZW5baV0uaXNDb250cm9sRmllbGQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5pc0F1dG9Gb2N1c2FibGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhcGFnZU9yZGVyZWRDaGlsZHJlbltpXS5vcHRpb25zLnJlYWRvbmx5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyBpbnZhbGlkLCBqdXN0IGZvY3VzIG9uIGZpcnN0IGl0ZW0KICAgICAgICAgICAgaWYgKGludmFsaWRJbmRleCA9PT0gLTEgJiYgcGFnZU9yZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnZhbGlkSW5kZXggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgZm9jdXMgaWYgd2UgZm91bmQgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChpbnZhbGlkSW5kZXggPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdLmZvY3VzKCk7CgogICAgICAgICAgICAgICAgaWYgKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvbkZvY3VzQ2FsbGJhY2socGFnZU9yZGVyZWRDaGlsZHJlbltpbnZhbGlkSW5kZXhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLmRpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5lbmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7QW55fSB2YWx1ZSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5nZXRDb250YWluZXJWYWx1ZSgpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9LAoKICAgICAgICBsYXN0Q2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJMYXp5IExvYWRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2hpbGQgZmllbGRzIHdpbGwgb25seSBiZSByZW5kZXJlZCB3aGVuIHRoZSBmaWVsZHNldCBpcyBleHBhbmRlZCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ29sbGFwc2libGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjb2xsYXBzZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDb2xsYXBzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgc2V0IGlzIGluaXRpYWxseSBjb2xsYXBzZWQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxlZ2VuZFN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGVnZW5kIFN0eWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBsZWdlbmQgc3R5bGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiYnV0dG9uIiwibGluayJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJidXR0b24iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVcCBhbmQgZG93biB0cmFuc2l0aW9ucyB3aWxsIGJlIGFuaW1hdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibGF6eUxvYWRpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkxhenkgbG9hZGluZyBjaGlsZCBmaWVsZHMgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTGF6eSBsb2FkaW5nIHdpbGwgYmUgZW5hYmxlZCBpZiBjaGVja2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbGxhcHNpYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgY29sbGFwc2libGUgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgc2V0IGlzIGNvbGxhcHNpYmxlIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sbGFwc2VkIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJGaWVsZCBzZXQgaW5pdGlhbGx5IGNvbGxhcHNlZCA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNldCBpcyBpbml0aWFsbHkgY29sbGFwc2VkIGlmIGNoZWNrZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibGVnZW5kU3R5bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjoic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFuaW1hdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkFuaW1hdGUgbW92ZW1lbnRzIGFuZCB0cmFuc2l0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5Gb3JtID0gQmFzZS5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRm9ybS5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICoKICAgICAgICAgKiBAY2xhc3MgVGhpcyBjbGFzcyBpcyBmb3IgbWFuYWdpbmcgSFRNTCBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZG9tRWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGRvbUVsLCBvcHRpb25zLCB2aWV3SWQsIGNvbm5lY3RvciwgZXJyb3JDYWxsYmFjaykgewoKICAgICAgICAgICAgLy8gY29udGFpbmVyCiAgICAgICAgICAgIHRoaXMuZG9tRWwgPSBkb21FbDsKCiAgICAgICAgICAgIC8vIHBhcmVudAogICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7CgogICAgICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKICAgICAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjazsKCiAgICAgICAgICAgIC8vIG9wdGlvbnMKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b25zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudHlwZSA9ICdzdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC5uYW1lID0gJ3N1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnN1Ym1pdC52YWx1ZSA9ICdTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnV0dG9ucy5yZXNldC50eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudHlwZSA9ICdyZXNldCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQubmFtZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0Lm5hbWUgPSAncmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zLnJlc2V0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnMucmVzZXQudmFsdWUgPSAnUmVzZXQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzb21lIGdlbmVyYWwgY29ycmVjdGlvbgogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm9wdGlvbnMuYnV0dG9ucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10ubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnNba10udGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5idXR0b25zW2tdLnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idXR0b25zW2tdLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYnV0dG9uc1trXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5hdHRyaWJ1dGVzLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IEFscGFjYS5nZW5lcmF0ZUlkKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3VibWl0IGJ1dHRvbiBzcGVjaWZpZWQsIGFuZCB0b2dnbGVTdWJtaXRWYWxpZFN0YXRlIGlzbid0IGRlZmluZWQsIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZvcm0gdG8gc3VibWl0IHVubGVzcyB2YWxpZAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbnMgJiYgdGhpcy5vcHRpb25zLmJ1dHRvbnMuc3VibWl0ICYmIEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMudG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy52aWV3VHlwZSA9IG9wdGlvbnMudmlld1R5cGU7CgogICAgICAgICAgICAvLyBzZXQgYSBydW50aW1lIHZpZXcKICAgICAgICAgICAgdGhpcy52aWV3ID0gbmV3IEFscGFjYS5SdW50aW1lVmlldyh2aWV3SWQsIHRoaXMpOwoKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCBjbGFzc2VzIGlzIHNldCBtaW5pbWFsbHkgdG8gdmlldy5zdHlsZXMuYnV0dG9uCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJ1dHRvbnNba10uc3R5bGVzID0gdGhpcy52aWV3LnN0eWxlcy5idXR0b247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGlzIGZvcm0gaW50byB0aGUgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUgYW5kIHJlbmRlciBpdAogICAgICAgICAgICB0aGlzLnByb2Nlc3NSZW5kZXIodGhpcy5kb21FbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gYmluZCBvdXIgZmllbGQgZG9tIGVsZW1lbnQgaW50byB0aGUgZG9tRWwKICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5hcHBlbmRUbyhzZWxmLmRvbUVsKTsKCiAgICAgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBjbGFzcwogICAgICAgICAgICAgICAgc2VsZi5mb3JtLmFkZENsYXNzKCJhbHBhY2EtZm9ybSIpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiZm9ybSIKICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJmb3JtIik7CgogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBjYWxsYmFjawogICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVySW5pdGlhbGl6ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b2dnbGVTdWJtaXRWYWxpZFN0YXRlKSB7CgogICAgICAgICAgICAgICAgLy8gYWRqdXN0IHN1Ym1pdCBidXR0b24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0b3AgY29udHJvbCBpcyBlbnRpcmVseSB2YWxpZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICovCiAgICAgICAgaXNGb3JtVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlLWNvbXB1dGUgdmFsaWRhdGlvbiBmb3IgdGhlIGZ1bGwgY29udHJvbCBzZXQKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLnZhbGlkYXRlKHRydWUpOwoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdGhpcy50b3BDb250cm9sLmlzVmFsaWQodHJ1ZSk7CiAgICAgICAgICAgIC8vdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRm9ybVZhbGlkKCk7CiAgICAgICAgfSwKCiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKGNoaWxkcmVuKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wQ29udHJvbC52YWxpZGF0ZShjaGlsZHJlbik7CiAgICAgICAgfSwKCiAgICAgICAgZW5hYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICgkLm1vYmlsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJ5IHsgJCgiLmFscGFjYS1mb3JtLWJ1dHRvbi1zdWJtaXQiKS5idXR0b24oJ3JlZnJlc2gnKTsgfSBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkaXNhYmxlU3VibWl0QnV0dG9uOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmF0dHJQcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICAgICAgaWYgKCQubW9iaWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkgeyAkKCIuYWxwYWNhLWZvcm0tYnV0dG9uLXN1Ym1pdCIpLmJ1dHRvbigncmVmcmVzaCcpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkanVzdFN1Ym1pdEJ1dHRvblN0YXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmRpc2FibGVTdWJtaXRCdXR0b24oKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3VibWl0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNwb25zaWJsZSBmb3IgZmV0Y2hpbmcgYW55IHRlbXBsYXRlcyBuZWVkZWQgc28gYXMgdG8gcmVuZGVyIHRoZQogICAgICAgICAqIGN1cnJlbnQgbW9kZSBmb3IgdGhpcyBmaWVsZC4KICAgICAgICAgKgogICAgICAgICAqIE9uY2UgY29tcGxldGVkLCB0aGUgb25TdWNjZXNzIG1ldGhvZCBpcyBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50RWwgRmllbGQgY29udGFpbmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc1JlbmRlcjogZnVuY3Rpb24ocGFyZW50RWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gbG9va3VwIHRoZSB0ZW1wbGF0ZSB3ZSBzaG91bGQgdXNlIHRvIHJlbmRlcgogICAgICAgICAgICB0aGlzLmZvcm1EZXNjcmlwdG9yID0gdGhpcy52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiZm9ybSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybURlc2NyaXB0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvcjogZm9ybSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVuZGVyZWREb21FbGVtZW50ID0gQWxwYWNhLnRtcGwodGhpcy5mb3JtRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0SWQoKSwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyZWREb21FbGVtZW50LmFwcGVuZFRvKHBhcmVudEVsKTsKCiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHJlbmRlcmVkRG9tRWxlbWVudDsKCiAgICAgICAgICAgIC8vIGZpbmQgb3VyIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAvLyB0aGlzIGlzIG1hcmtlZCBieSB0aGUgaGFuZGxlYmFycyBoZWxwZXIKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyID0gJCh0aGlzLmZvcm0pLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19GT1JNX0lURU1TX0ZJRUxEKTsKICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzQ29udGFpbmVyLnJlbW92ZUNsYXNzKEFscGFjYS5NQVJLRVJfQ0xBU1NfRk9STV9JVEVNU19GSUVMRCk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImlkIikpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYXR0cigiaWQiLCB0aGlzLmdldElkKCkgKyAiLWZvcm0tb3V0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5mb3JtLmF0dHIoImRhdGEtYWxwYWNhLWZvcm0taWQiKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hdHRyKCJkYXRhLWFscGFjYS1mb3JtLWlkIiwgdGhpcy5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIGZvcm0gZmllbGQKICAgICAgICAgICAgJChwYXJlbnRFbCkuZmluZCgiZm9ybSIpLmF0dHIodGhpcy5hdHRyaWJ1dGVzKTsKCiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBidXR0b25zIGFzIHdlbGwKICAgICAgICAgICAgdGhpcy5idXR0b25zID0ge307CiAgICAgICAgICAgICQocGFyZW50RWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24iKS5lYWNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiYnV0dG9uLXB1c2hlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGNsaWNrIGhhbmRsZXI/CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOwogICAgICAgICAgICAgICAgaWYgKGtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uQ29uZmlnID0gc2VsZi5vcHRpb25zLmJ1dHRvbnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uQ29uZmlnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkNvbmZpZy5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihmb3JtLCBoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwoZm9ybSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzZWxmLCBidXR0b25Db25maWcuY2xpY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybSBpZAogICAgICAgICAqLwogICAgICAgIGdldElkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZvcm0gdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEZvcm0gdHlwZS4KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhpcyBmb3JtJ3MgcGFyZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRm9ybSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0FueX0gVmFsdWUgb2YgdGhlIEpTT04gcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmdldFZhbHVlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIEpTT04gdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGV2ZW50cyBoYW5kbGluZyAoRm9ybSBTdWJtaXNzaW9uKSBmb3IgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGluaXRFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZm9ybVRhZyA9ICQodGhpcy5kb21FbCkuZmluZCgiZm9ybSIpOwoKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICQoZm9ybVRhZykuc3VibWl0KHYsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblN1Ym1pdChlLCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWVsZHVwZGF0ZXMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBmb3JtIGlzIHZhbGlkLgogICAgICAgICAgICAvLyBpZiBzbywgZW5hYmxlIHRoZSBzdWJtaXQgYnV0dG9uLi4uCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZGlzYWJsZSBpdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvZ2dsZVN1Ym1pdFZhbGlkU3RhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxkdXBkYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoX3RoaXMudG9wQ29udHJvbC5nZXRGaWVsZEVsKCkpLmJpbmQoImZpZWxka2V5dXAiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RTdWJtaXRCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJChfdGhpcy50b3BDb250cm9sLmdldEZpZWxkRWwoKSkuYmluZCgiZmllbGRibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRqdXN0U3VibWl0QnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJ1dHRvbkVsOiBmdW5jdGlvbihidXR0b25JZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkKHRoaXMuZG9tRWwpLmZpbmQoIi5hbHBhY2EtZm9ybS1idXR0b24tIiArIGJ1dHRvbklkKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvcm0gc3VibWl0IGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIFN1Ym1pdCBldmVudC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9ybSB0aGUgZm9ybQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0OiBmdW5jdGlvbihlLCBmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0SGFuZGxlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuc3VibWl0SGFuZGxlcihlLCBmb3JtKTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNVbmRlZmluZWQodikpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gc3VibWl0IGhhbmRsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZnVuYyBTdWJtaXQgaGFuZGxlciB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyU3VibWl0SGFuZGxlcjogZnVuY3Rpb24gKGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRnVuY3Rpb24oZnVuYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0SGFuZGxlciA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwbGF5cyB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIG9mIGFsbCBmaWVsZHMgb2YgdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGlsZHJlbiB3aGV0aGVyIHRvIHJlbmRlciB2YWxpZGF0aW9uIHN0YXRlIGZvciBjaGlsZCBmaWVsZHMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvcm0gdmFsaWRhdGlvbiBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoVmFsaWRhdGlvblN0YXRlOiBmdW5jdGlvbihjaGlsZHJlbiwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wucmVmcmVzaFZhbGlkYXRpb25TdGF0ZShjaGlsZHJlbiwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoaXMgZm9ybS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhpcyBmb3JtLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy50b3BDb250cm9sLmVuYWJsZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgb24gdGhpcyBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmb2N1c2VkIGNvbnRyb2wuCiAgICAgICAgICovCiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uKG9uRm9jdXNDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudG9wQ29udHJvbC5mb2N1cyhmdW5jdGlvbihjb250cm9sV2l0aEZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayhjb250cm9sV2l0aEZvY3VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUHVyZ2UgYW55IGV2ZW50IGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIERPTS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gc2tpcFBhcmVudCB3aGVuIHRydWUsIHRoZSBmb3JtIGNsZWFucyB1cCB3aXRob3V0IHRyYXZlcnNpbmcgdGhyb3VnaCBwYXJlbnQgY2hpbGQgY29udHJvbHMKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbihza2lwUGFyZW50KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIHdlIGFsbG93IGZvcm0uZGVzdHJveSgpIHdoaWNoIHRlbGxzIHBhcmVudCBjb250cm9sIHRvIGRlc3Ryb3kKICAgICAgICAgICAgLy8gaWYgc2tpcFBhcmVudCA9PSB0cnVlLCB0aGVuIHdlIGRvIG5vdCBjYWxsIHVwIChpbnZva2VkIGZyb20gY29udGFpbmVyKQogICAgICAgICAgICBpZiAoIXNraXBQYXJlbnQgJiYgdGhpcy5wYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSBmb3JtLgogICAgICAgICAqLwogICAgICAgIHNob3c6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUVsKCkuY3NzKHsKICAgICAgICAgICAgICAgICJkaXNwbGF5IjogIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGZvcm0uCiAgICAgICAgICovCiAgICAgICAgaGlkZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRGb3JtRWwoKS5jc3MoewogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAibm9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBmb3JtIGFuZCByZXNldHMgdmFsdWVzIG9mIGl0cyBmaWVsZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcFVwZGF0ZVRyaWdnZXIgSWYgZmFsc2UsIHRyaWdnZXJzIHRoZSB1cGRhdGUgZXZlbnQgb2YgdGhpcyBldmVudC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcjogZnVuY3Rpb24oc3RvcFVwZGF0ZVRyaWdnZXIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnRvcENvbnRyb2wuY2xlYXIoc3RvcFVwZGF0ZVRyaWdnZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBmb3JtIGlzIGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGZvcm0gaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3BDb250cm9sLmlzRW1wdHkoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlcyBhIHZpZXcgY2FsbGJhY2sgZm9yIHRoZSBjdXJyZW50IGZvcm0uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gaWQKICAgICAgICAgKiBAcGFyYW0gYXJnMQogICAgICAgICAqIEBwYXJhbSBhcmcyCiAgICAgICAgICogQHBhcmFtIGFyZzMKICAgICAgICAgKiBAcGFyYW0gYXJnNAogICAgICAgICAqIEBwYXJhbSBhcmc1CiAgICAgICAgICovCiAgICAgICAgZmlyZUNhbGxiYWNrOiBmdW5jdGlvbihpZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMudmlldy5maXJlQ2FsbGJhY2sodGhpcywgaWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZm9ybSBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbmRlcmVkIERPTSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIGdldEZvcm1FbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSByZWd1bGFyIG9sZCBzdWJtaXQuCiAgICAgICAgICovCiAgICAgICAgc3VibWl0OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZvcm0uc3VibWl0KCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZXMgdGhlIHN1Ym1pdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgaGFuZHMgYmFjayB0aGUgalF1ZXJ5IHByb21pc2UuCiAgICAgICAgICoKICAgICAgICAgKiBBbiBvcHRpb25hbCBjb25maWcgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250cm9sIHRoZSB1bmRlcmx5aW5nIGpRdWVyeSBhamF4IFhIUi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGFqYXhTdWJtaXQ6IGZ1bmN0aW9uKGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uZmlnLnVybCA9IHNlbGYub3B0aW9ucy5hdHRyaWJ1dGVzLmFjdGlvbjsKICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBzZWxmLm9wdGlvbnMuYXR0cmlidXRlcy5tZXRob2Q7CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5kYXRhKSB7CiAgICAgICAgICAgICAgICBjb25maWcuZGF0YSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YVR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhVHlwZSA9ICJqc29uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IENTUkYgaGVyZQogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikgewogICAgICAgICAgICAgICAgY29uZmlnLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJC5hamF4KGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZXJtaW5lQ3NyZlRva2VuOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGRpcmVjdCB0b2tlbiBzcGVjaWZpZWQ/CiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBBbHBhY2EuQ1NSRl9UT0tFTjsKICAgICAgICAgICAgaWYgKCFjc3JmVG9rZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgY29va2llIHRoYXQgd2UgY2FuIHB1bGwgdGhlIHZhbHVlIGZyb20/CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FUy5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IEFscGFjYS5DU1JGX0NPT0tJRV9OQU1FU1t0XTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gQWxwYWNhLnJlYWRDb29raWUoY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZVZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyZlRva2VuID0gY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNzcmZUb2tlbjsKICAgICAgICB9CgogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk1lbW9yeUNhY2hlID0gZnVuY3Rpb24oY29uZmlnKQogICAgewogICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGNhY2hlID0ge307CgogICAgICAgIHJldHVybiBmdW5jdGlvbihrLCB2LCB0dGwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc1VuZGVmaW5lZCh2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba10gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHY6IHYKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXR0bCAmJiBjb25maWcudHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0bCA9IGNvbmZpZy50dGw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAodHRsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tdLmV4cGlyZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHR0bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IGZvciAiY2xlYXIiIG1ldGhvZCAtIHJlbW92ZXMgZXZlcnl0aGluZyBmcm9tIGNhY2hlCiAgICAgICAgICAgIGlmIChrID09ICJjbGVhciIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB6YSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeiBpbiBjYWNoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6YS5wdXNoKHopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbemFbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZCA9IGNhY2hlW2tdOwogICAgICAgICAgICBpZiAoIWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGQuZXhwaXJlcyAmJiBkLmV4cGlyZXMgPCBub3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrXTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkLnY7CiAgICAgICAgfTsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyQ2FjaGUoIm1lbW9yeSIsIEFscGFjYS5NZW1vcnlDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLk51bGxDYWNoZSA9IGZ1bmN0aW9uKGNvbmZpZykKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaywgdiwgdHRsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICB9OwoKICAgIEFscGFjYS5yZWdpc3RlckNhY2hlKCJudWxsIiwgQWxwYWNhLk51bGxDYWNoZSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkNvbm5lY3RvciA9IEJhc2UuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNvbm5lY3Rvci5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RzCiAgICAgICAgICogQGNsYXNzIENvbm5lY3RzIEFscGFjYSB0byByZW1vdGUgZGF0YSBzdG9yZXMuCgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBDb25uZWN0b3IgSUQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIENvbm5lY3RvciBDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oaWQsIGNvbmZpZykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhIHVyaQogICAgICAgICAgICB0aGlzLmlzVXJpID0gZnVuY3Rpb24ocmVzb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAhQWxwYWNhLmlzRW1wdHkocmVzb3VyY2UpICYmIEFscGFjYS5pc1VyaShyZXNvdXJjZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZSkgewogICAgICAgICAgICAgICAgY29uZmlnLmNhY2hlID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbmZpZy5jYWNoZS50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUudHlwZSA9ICJudWxsIjsKICAgICAgICAgICAgICAgIGNvbmZpZy5jYWNoZS5jb25maWcgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEFscGFjYS5nZXRDYWNoZShjb25maWcuY2FjaGUudHlwZSkoY29uZmlnLmNhY2hlLmNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIHRlbXBsYXRlIChIVE1MIG9yIFRleHQpLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIHNvdXJjZSBpcyBhIFVSSSwgdGhlbiBpdCBpcyBsb2FkZWQuCiAgICAgICAgICogSWYgaXQgaXMgbm90IGEgVVJJLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2ltcGx5IGhhbmRlZCBiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzb3VyY2UgU291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uIChzb3VyY2UsIG9uU3VjY2Vzcywgb25FcnJvcikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc291cmNlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VyaShzb3VyY2UpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFVyaShzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbihsb2FkZWREYXRhKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25TdWNjZXNzICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uU3VjY2VzcykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcyhsb2FkZWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobG9hZEVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihsb2FkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVycm9yKHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IkVtcHR5IGRhdGEgc291cmNlLiIsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICJURU1QTEFURV9MT0FESU5HX0VSUk9SIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBKU09OIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgTWFwIG9mIHJlc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gc2NoZW1hLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFNjaGVtYTogZnVuY3Rpb24gKHJlc291cmNlLCByZXNvdXJjZXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkSnNvblJlc291cmNlKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjawogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGxvYWRPcHRpb25zOiBmdW5jdGlvbiAocmVzb3VyY2UsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgSlNPTiB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBsb2FkZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZFZpZXc6IGZ1bmN0aW9uIChyZXNvdXJjZSwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBzY2hlbWEsIGZvcm0sIHZpZXcgYW5kIGRhdGEgaW4gYSBzaW5nbGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZXMgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZEFsbDogZnVuY3Rpb24gKHJlc291cmNlcywgb25TdWNjZXNzLCBvbkVycm9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdFN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZGF0YVNvdXJjZSA9IHJlc291cmNlcy5kYXRhU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHNjaGVtYVNvdXJjZSA9IHJlc291cmNlcy5zY2hlbWFTb3VyY2U7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1NvdXJjZSA9IHJlc291cmNlcy5vcHRpb25zU291cmNlOwogICAgICAgICAgICAgICAgdmFyIHZpZXdTb3VyY2UgPSByZXNvdXJjZXMudmlld1NvdXJjZTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAic2NoZW1hIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFTb3VyY2UgJiYgdHlwZW9mKHJlc291cmNlcy5zY2hlbWEpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzY2hlbWFTb3VyY2UgPSByZXNvdXJjZXMuc2NoZW1hOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdlIGFsbG93ICJvcHRpb25zIiB0byBjb250YWluIGEgVVJJIGFzIHdlbGwgKGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KQogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zU291cmNlICYmIHR5cGVvZihyZXNvdXJjZXMub3B0aW9ucykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTb3VyY2UgPSByZXNvdXJjZXMub3B0aW9uczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyAidmlldyIgdG8gY29udGFpbiBhIFVSSSBhcyB3ZWxsIChiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSkKICAgICAgICAgICAgICAgIGlmICghdmlld1NvdXJjZSAmJiB0eXBlb2YocmVzb3VyY2VzLnZpZXcpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2aWV3U291cmNlID0gcmVzb3VyY2VzLnZpZXc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGxvYWRlZCA9IHt9OwoKICAgICAgICAgICAgICAgIHZhciBsb2FkQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgaW52b2NhdGlvbkNvdW50ID0gMDsKCiAgICAgICAgICAgICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ291bnRlciA9PT0gaW52b2NhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MobG9hZGVkLmRhdGEsIGxvYWRlZC5vcHRpb25zLCBsb2FkZWQuc2NoZW1hLCBsb2FkZWQudmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGxvYWRFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob25FcnJvciAmJiBBbHBhY2EuaXNGdW5jdGlvbihvbkVycm9yKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IobG9hZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIGNvdW50IG91dCB0aGUgdG90YWwgIyBvZiBpbnZva2VzIHdlJ3JlIGdvaW5nIHRvIGZpcmUgb2ZmCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2hlbWFTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1NvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGludm9rZSwgc28ganVzdCBoYW5kIGJhY2sKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGRvTWVyZ2UgPSBmdW5jdGlvbihwLCB2MSwgdjIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbG9hZGVkW3BdID0gdjE7CgogICAgICAgICAgICAgICAgICAgIGlmICh2MikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGxvYWRlZFtwXSkgPT09ICJvYmplY3QiKSAmJiAodHlwZW9mKHYyKSA9PT0gIm9iamVjdCIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QobG9hZGVkW3BdLCB2Mik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRbcF0gPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gZmlyZSBvZmYgYWxsIG9mIHRoZSBpbnZva2VzCiAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWREYXRhKGRhdGFTb3VyY2UsIHJlc291cmNlcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgiZGF0YSIsIHJlc291cmNlcy5kYXRhLCBkYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjaGVtYVNvdXJjZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRTY2hlbWEoc2NoZW1hU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKHNjaGVtYSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9NZXJnZSgic2NoZW1hIiwgcmVzb3VyY2VzLnNjaGVtYSwgc2NoZW1hKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNTb3VyY2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkT3B0aW9ucyhvcHRpb25zU291cmNlLCByZXNvdXJjZXMsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvTWVyZ2UoIm9wdGlvbnMiLCByZXNvdXJjZXMub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2FkQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2aWV3U291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZFZpZXcodmlld1NvdXJjZSwgcmVzb3VyY2VzLCBmdW5jdGlvbih2aWV3KSB7CgogICAgICAgICAgICAgICAgICAgICAgICBkb01lcmdlKCJ2aWV3IiwgcmVzb3VyY2VzLnZpZXcsIHZpZXcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIG9uQ29ubmVjdEVycm9yICA9IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgJiYgQWxwYWNhLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZWxmLmNvbm5lY3Qob25Db25uZWN0U3VjY2Vzcywgb25Db25uZWN0RXJyb3IpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgSlNPTiB0aHJvdWdoIEFqYXggY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgbG9jYXRpb24gb2YgdGhlIGpzb24gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkSnNvbiA6IGZ1bmN0aW9uKHVyaSwgb25TdWNjZXNzLCBvbkVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9hZFVyaSh1cmksIHRydWUsIG9uU3VjY2Vzcywgb25FcnJvcik7CiAgICAgICAgfSAsCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludC4gIFNldCB1cCBkZWZhdWx0IGFqYXggY29uZmlndXJhdGlvbiBmb3IgVVJMIHJldHJpZXZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkKICAgICAgICAgKiBAcGFyYW0gaXNKc29uCiAgICAgICAgICogQHJldHVybnMge3t1cmw6ICosIHR5cGU6IHN0cmluZ319CiAgICAgICAgICovCiAgICAgICAgYnVpbGRBamF4Q29uZmlnOiBmdW5jdGlvbih1cmksIGlzSnNvbikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gewogICAgICAgICAgICAgICAgInVybCI6IHVyaSwKICAgICAgICAgICAgICAgICJ0eXBlIjogImdldCIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0pzb24pIHsKICAgICAgICAgICAgICAgIGFqYXhDb25maWcuZGF0YVR5cGUgPSAianNvbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgaWYgKHVyaSAmJiB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuaHRtbCIpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhamF4Q29uZmlnLmRhdGFUeXBlID0gImh0bWwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYWpheENvbmZpZzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBhIGdlbmVyYWwgZG9jdW1lbnQgdGhyb3VnaCBBamF4IGNhbGwuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHVzZXMgalF1ZXJ5IHRvIHBlcmZvcm0gdGhlIEFqYXggY2FsbC4gIElmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBjb25uZWN0aXZpdHkgdG8geW91ciBvd24gcmVtb3RlIHNlcnZlciwKICAgICAgICAgKiB0aGlzIHdvdWxkIGJlIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBkbyBzby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgdXJpIHRvIGJlIGxvYWRlZAogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNKc29uIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgSlNPTiBvciBub3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFVyaSA6IGZ1bmN0aW9uKHVyaSwgaXNKc29uLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBhamF4Q29uZmlnID0gc2VsZi5idWlsZEFqYXhDb25maWcodXJpLCBpc0pzb24pOwoKICAgICAgICAgICAgYWpheENvbmZpZ1sic3VjY2VzcyJdID0gZnVuY3Rpb24oanNvbkRvY3VtZW50KSB7CgogICAgICAgICAgICAgICAgc2VsZi5jYWNoZSh1cmksIGpzb25Eb2N1bWVudCk7CgogICAgICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzKGpzb25Eb2N1bWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFqYXhDb25maWdbImVycm9yIl0gPSBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICYmIEFscGFjYS5pc0Z1bmN0aW9uKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjoiVW5hYmxlIHRvIGxvYWQgZGF0YSBmcm9tIHVyaSA6ICIgKyB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICJzdGFnZSI6ICJEQVRBX0xPQURJTkdfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGV0YWlscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqcVhIUiIgOiBqcVhIUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0U3RhdHVzIiA6IHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JUaHJvd24iIDogZXJyb3JUaHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZSh1cmkpOwoKICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50ICYmIG9uU3VjY2VzcyAmJiBBbHBhY2EuaXNGdW5jdGlvbihvblN1Y2Nlc3MpKSB7CiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJC5hamF4KGFqYXhDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcmVzb3VyY2UgUmVzb3VyY2UgdG8gYmUgbG9hZGVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VTY2hlbWE6IGZ1bmN0aW9uIChyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UocmVzb3VyY2UsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTG9hZHMgcmVmZXJlbmNlZCBKU09OIG9wdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHJlc291cmNlIFJlc291cmNlIHRvIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkUmVmZXJlbmNlT3B0aW9uczogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShyZXNvdXJjZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlTG9hZEpzb25SZXNvdXJjZTogZnVuY3Rpb24gKHJlc291cmNlLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5pc1VyaShyZXNvdXJjZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMubG9hZEpzb24ocmVzb3VyY2UsIGZ1bmN0aW9uKGxvYWRlZFJlc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGxvYWRlZFJlc291cmNlKTsKICAgICAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlICh2YWx1ZS90ZXh0KSBwYWlycyBmcm9tIGEgcmVtb3RlIHNvdXJjZS4KICAgICAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZvciBjb25maWcgdG8gYmUgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVMb2FkRGF0YVNvdXJjZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUxvYWREYXRhU291cmNlOiBmdW5jdGlvbihjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWc7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodXJsKSkgewogICAgICAgICAgICAgICAgdXJsID0gY29uZmlnLnVybDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2UodXJsLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiZGVmYXVsdCIsIEFscGFjYS5Db25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5DbG91ZENtc0Nvbm5lY3RvciA9IEFscGFjYS5Db25uZWN0b3IuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkNsb3VkQ21zQ29ubmVjdG9yLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAY2xhc3MgQ29ubmVjdHMgQWxwYWNhIHRvIENsb3VkIENNUwoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgQ29ubmVjdG9yIElECiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBDb25uZWN0b3IgQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGlkLCBjb25maWcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWNvbmZpZykgewogICAgICAgICAgICAgICAgY29uZmlnID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBvdGhlcndpc2UgY29uZmlndXJlZCB0byB1c2UgYSBjYWNoZSwgd2UgZGVmYXVsdCB0byBhIG1lbW9yeSBjYWNoZSB3aXRoIGEgNSBtaW51dGUgVFRMCiAgICAgICAgICAgIGlmICghY29uZmlnLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25maWcuY2FjaGUgPSB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibWVtb3J5IiwKICAgICAgICAgICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHRsIjogMTAwMCAqIDYwICogNSAvLyBmaXZlIG1pbnV0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UoaWQsIGNvbmZpZyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgaW5pdGlhbCBjb25uZWN0aW9ucyB0byBkYXRhIHNvdXJjZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChvblN1Y2Nlc3MsIG9uRXJyb3IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY2ZuID0gZnVuY3Rpb24oZXJyLCBicmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gQ2hhaW4oYnJhbmNoKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kSGVscGVyRnVuY3Rpb25zKHNlbGYuYnJhbmNoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvblN1Y2Nlc3MoKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuZ2xvYmFsQ29udGV4dCAmJiBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNmbihudWxsLCBBbHBhY2EuZ2xvYmFsQ29udGV4dC5icmFuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5icmFuY2ggPSBudWxsOwoKICAgICAgICAgICAgICAgIHNlbGYuZG9Db25uZWN0KGZ1bmN0aW9uIChlcnIsIGJyYW5jaCkgewogICAgICAgICAgICAgICAgICAgIGNmbihlcnIsIGJyYW5jaCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQ29ubmVjdDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmtleSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25maWcua2V5ID0gImRlZmF1bHQiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBHaXRhbmEuY29ubmVjdCh0aGlzLmNvbmZpZywgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldERyaXZlcigpLmdldE9yaWdpbmFsQ29uZmlndXJhdGlvbigpLmxvYWRBcHBIZWxwZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc3RvcmUoImNvbnRlbnQiKS5yZWFkQnJhbmNoKCJtYXN0ZXIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiaW5kSGVscGVyRnVuY3Rpb25zOiBmdW5jdGlvbihicmFuY2gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhU2NoZW1hKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBicmFuY2gubG9hZEFscGFjYVNjaGVtYSA9IGZ1bmN0aW9uKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShzY2hlbWFJZGVudGlmaWVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgY2FjaGVkRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL3NjaGVtYSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHBhcmFtc1siaWQiXSA9IHNjaGVtYUlkZW50aWZpZXI7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluR2V0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlKHNjaGVtYUlkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0gc2VsZi5jYWNoZShvcHRpb25zSWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZERvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG51bGwsIGNhY2hlZERvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciB1cmlGdW5jdGlvbiA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBicmFuY2guZ2V0VXJpKCkgKyAiL2FscGFjYS9vcHRpb25zIjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzY2hlbWFJZCJdID0gcmVzb3VyY2VzLnNjaGVtYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBvcHRpb25zSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUob3B0aW9uc0lkZW50aWZpZXIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBudWxsLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWJyYW5jaC5sb2FkQWxwYWNhRGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJhbmNoLmxvYWRBbHBhY2FEYXRhID0gZnVuY3Rpb24oZGF0YUlkZW50aWZpZXIsIHJlc291cmNlcywgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVyaUZ1bmN0aW9uID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyYW5jaC5nZXRVcmkoKSArICIvYWxwYWNhL2RhdGEiOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImlkIl0gPSBkYXRhSWRlbnRpZmllcjsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5HZXRSZXNwb25zZSh0aGlzLCB1cmlGdW5jdGlvbiwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFicmFuY2gubG9hZEFscGFjYURhdGFTb3VyY2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGNvbmZpZywgcGFnaW5hdGlvbiwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNvcHlJbnRvKHBhcmFtcywgcGFnaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgdXJpRnVuY3Rpb24gPSBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJhbmNoLmdldFVyaSgpICsgIi9hbHBhY2EvZGF0YXNvdXJjZSI7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5Qb3N0UmVzcG9uc2UodGhpcywgdXJpRnVuY3Rpb24sIHBhcmFtcywgY29uZmlnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbnVsbCwgcmVzcG9uc2UuZGF0YXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbm9kZUlkIHRoZSBub2RlIGlkIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGE6IGZ1bmN0aW9uIChub2RlSWQsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNvbm5lY3QgdG8gYSBicmFuY2gsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZAogICAgICAgICAgICBpZiAoIXNlbGYuYnJhbmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKG5vZGVJZCwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FEYXRhKG5vZGVJZCwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG9iaik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGpzb24gc2NoZW1hIGZyb20gQ2xvdWQgQ01TLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHRoZSBkZWZpbml0aW9uIHFuYW1lIHRvIGxvYWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2VzIE1hcCBvZiByZXNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblN1Y2Nlc3Mgb25TdWNjZXNzIGNhbGxiYWNrLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3Igb25FcnJvciBjYWxsYmFjay4KICAgICAgICAgKi8KICAgICAgICBsb2FkU2NoZW1hOiBmdW5jdGlvbiAoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsb2FkIGZyb20gY2xvdWQgY21zCiAgICAgICAgICAgIHNlbGYuYnJhbmNoLmxvYWRBbHBhY2FTY2hlbWEoc2NoZW1hSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIHNjaGVtYSkgewoKICAgICAgICAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIHNjaGVtYQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhzY2hlbWEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyBqc29uIG9wdGlvbnMgZnJvbSBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnNJZGVudGlmaWVyIHRoZSBmb3JtIGtleSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlcyBNYXAgb2YgcmVzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZE9wdGlvbnM6IGZ1bmN0aW9uIChvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgY29ubmVjdCB0byBhIGJyYW5jaCwgdGhlbiB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kCiAgICAgICAgICAgIGlmICghc2VsZi5icmFuY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2Uob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbG9hZCBmcm9tIGNsb3VkIGNtcwogICAgICAgICAgICBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhT3B0aW9ucyhvcHRpb25zSWRlbnRpZmllciwgcmVzb3VyY2VzLCBmdW5jdGlvbihlcnIsIG9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgb3B0aW9ucwoKICAgICAgICAgICAgICAgIC8vIG1peCBpbiBidXR0b25zIG9udG8gZm9ybQogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmJ1dHRvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgInN1Ym1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1Ym1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IHRoaXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmFqYXhTdWJtaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aHJGaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoQ3JlZGVudGlhbHMiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvc3NEb21haW4iOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzRGF0YSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogSlNPTi5zdHJpbmdpZnkodmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50VHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0U3VjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udG9wQ29udHJvbC50cmlnZ2VyKCJmb3JtU3VibWl0RmFpbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0aW9ucy5mb2N1cykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9jdXMgPSBBbHBhY2EuZGVmYXVsdEZvY3VzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgYWN0aW9uIGhhbmRsZXIgcmVsYXRpdmUgdG8gYmFzZVVSTAogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLmF0dHJpYnV0ZXMuYWN0aW9uID0gc2VsZi5jb25maWcuYmFzZVVSTCArIG9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLmFjdGlvbjsKCiAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2sob3B0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGEgcmVmZXJlbmNlZCBKU09OIHNjaGVtYS4KICAgICAgICAgKgogICAgICAgICAqIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0KICAgICAgICAgKgogICAgICAgICAqIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBzY2hlbWFJZGVudGlmaWVyIHNjaGVtYSB0byBsb2FkCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25TdWNjZXNzIG9uU3VjY2VzcyBjYWxsYmFjay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIG9uRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgbG9hZFJlZmVyZW5jZVNjaGVtYTogZnVuY3Rpb24gKHNjaGVtYUlkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHRoZSByZWZlcmVuY2UgY29tZXMgaW4gZm9ybSAicW5hbWU6Ly97bmFtZXNwYWNlfS97bG9jYWxOYW1lfSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAoc2NoZW1hSWRlbnRpZmllci5pbmRleE9mKCJxbmFtZTovLyIpID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBzY2hlbWFJZGVudGlmaWVyLnN1YnN0cmluZyg4KS5zcGxpdCgiLyIpOwoKICAgICAgICAgICAgICAgIHNjaGVtYUlkZW50aWZpZXIgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpcyBpdCBIVFRQIG9yIEhUVFBTPwogICAgICAgICAgICBpZiAoKHNjaGVtYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChzY2hlbWFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiaHR0cHM6Ly8iKSA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGxvYWQgSlNPTiBmcm9tIGVuZHBvaW50CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEpzb25SZXNvdXJjZShzY2hlbWFJZGVudGlmaWVyLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gbnVsbDsKCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhc3N1bWUgaXQgaXMgYSBRTmFtZQogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkU2NoZW1hKHNjaGVtYUlkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyByZWZlcmVuY2VkIEpTT04gb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC8vIFN1cHBvcnRzIHFuYW1lOi8ve25hbWVzcGFjZX0ve2xvY2FsTmFtZX0ve2Zvcm1LZXl9CiAgICAgICAgICoKICAgICAgICAgKiBBdCBwcmVzZW50LCB0aGlzIGlnbm9yZXMgUU5hbWUuCiAgICAgICAgICoKICAgICAgICAgKiBPdGhlcndpc2UsIGZhbGxzIGJhY2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9uc0lkZW50aWZpZXIgZm9ybSB0byBsb2FkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uU3VjY2VzcyBvblN1Y2Nlc3MgY2FsbGJhY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciBvbkVycm9yIGNhbGxiYWNrLgogICAgICAgICAqLwogICAgICAgIGxvYWRSZWZlcmVuY2VPcHRpb25zOiBmdW5jdGlvbiAob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlzIGl0IEhUVFAgb3IgSFRUUFM/CiAgICAgICAgICAgIGlmICgob3B0aW9uc0lkZW50aWZpZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJodHRwOi8vIikgPT09IDApIHx8IChvcHRpb25zSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImh0dHBzOi8vIikgPT09IDApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBsb2FkIEpTT04gZnJvbSBlbmRwb2ludAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRKc29uUmVzb3VyY2Uob3B0aW9uc0lkZW50aWZpZXIsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSBudWxsOwoKICAgICAgICAgICAgLy8gaWYgdGhlIHJlZmVyZW5jZSBjb21lcyBpbiBmb3JtICJxbmFtZTovL3tuYW1lc3BhY2V9L3tsb2NhbE5hbWV9L3tmb3JtS2V5fSIgKHdoaWNoIGlzIHRoZSBDbG91ZCBDTVMgb2ZmaWNpYWwgZm9ybWF0KQogICAgICAgICAgICAvLyB0aGVuIGNvbnZlcnQgdG8gYmFzaWMgUU5hbWUgd2hpY2ggd2Ugc3VwcG9ydCBoZXJlIHdpdGhpbiBBbHBhY2EgQ2xvdWQgQ01TIGNvbm5lY3RvcgogICAgICAgICAgICBpZiAob3B0aW9uc0lkZW50aWZpZXIuaW5kZXhPZigicW5hbWU6Ly8iKSA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3B0aW9uc0lkZW50aWZpZXIuc3Vic3RyaW5nKDgpLnNwbGl0KCIvIik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZQogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zY2hlbWFTb3VyY2UgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGlkCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0lkZW50aWZpZXIgPSBwYXJ0c1syXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZE9wdGlvbnMob3B0aW9uc0lkZW50aWZpZXIsIHJlc291cmNlcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKG51bGwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIGRhdGEgc291cmNlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29udGVudCBxdWVyeSB0byBDbG91ZCBDTVMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29uZmlnCiAgICAgICAgICogQHBhcmFtIHN1Y2Nlc3NDYWxsYmFjawogICAgICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMgeyp9CiAgICAgICAgICovCiAgICAgICAgbG9hZERhdGFTb3VyY2U6IGZ1bmN0aW9uIChjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBjb25uZWN0IHRvIGEgYnJhbmNoLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QKICAgICAgICAgICAgaWYgKCFzZWxmLmJyYW5jaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZShjb25maWcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gY29uZmlnLnBhZ2luYXRpb247CiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGFnaW5hdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBzZWxmLmJyYW5jaC5sb2FkQWxwYWNhRGF0YVNvdXJjZShjb25maWcsIHBhZ2luYXRpb24sIGZ1bmN0aW9uKGVyciwgYXJyYXkpIHsKICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhhcnJheSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJDb25uZWN0b3JDbGFzcygiY2xvdWRjbXMiLCBBbHBhY2EuQ2xvdWRDbXNDb25uZWN0b3IpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2l6ZSA9IDQwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCgogICAgICAgICAgICAvLyBhc3N1bWUgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0ZXh0IgogICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dFR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gdGhpcy5vcHRpb25zLmlucHV0VHlwZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NIGRhdGEtKiBhdHRyaWJ1dGVzIHN1cHBvcnQKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICogYXR0cmlidXRlcyBzdXBwb3J0CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRE9NICJhdXRvY29tcGxldGUiCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlICYmIHR5cGVvZih0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJvbiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0b2NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUudG9Mb3dlckNhc2UoKSA9PT0gInllcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5hdXRvY29tcGxldGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd0VtcHR5U3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmRpc2FsbG93T25seUVtcHR5U3BhY2VzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kaXNhbGxvd09ubHlFbXB0eVNwYWNlcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGVzdHJveQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gY2xlYW4gdXAgdHlwZWFoZWFkCiAgICAgICAgICAgIGlmICggdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC50eXBlYWhlYWQgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnR5cGVhaGVhZCgnZGVzdHJveScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseUF1dG9jb21wbGV0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBtYXNrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseU1hc2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseVR5cGVBaGVhZCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU1heExlbmd0aEluZGljYXRvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFwcGx5QXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBhdXRvY29tcGxldGUKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuYXV0b2NvbXBsZXRlKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuYWRkQ2xhc3MoImFscGFjYS1hdXRvY29tcGxldGUiKTsKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5hdHRyKCJhdXRvY29tcGxldGUiLCAoc2VsZi5vcHRpb25zLmF1dG9jb21wbGV0ZSA/ICJvbiIgOiAib2ZmIikpOwoKICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAiYXV0b2NvbXBsZXRlIgogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImF1dG9jb21wbGV0ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlNYXNrOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBtYXNrIGl0CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm1hc2soc2VsZi5vcHRpb25zLm1hc2tTdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXBwbHlUeXBlQWhlYWQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wudHlwZWFoZWFkICYmIHNlbGYub3B0aW9ucy50eXBlYWhlYWQgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYub3B0aW9ucy50eXBlYWhlYWQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdENvbmZpZyA9IHNlbGYub3B0aW9ucy50eXBlYWhlYWQuY29uZmlnOwogICAgICAgICAgICAgICAgaWYgKCF0Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgdENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0RGF0YXNldHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmRhdGFzZXRzOwogICAgICAgICAgICAgICAgaWYgKCF0RGF0YXNldHMpIHsKICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXREYXRhc2V0cy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdERhdGFzZXRzLm5hbWUgPSBzZWxmLmdldElkKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRFdmVudHMgPSBzZWxmLm9wdGlvbnMudHlwZWFoZWFkLmV2ZW50czsKICAgICAgICAgICAgICAgIGlmICghdEV2ZW50cykgewogICAgICAgICAgICAgICAgICAgIHRFdmVudHMgPSB7fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBlYWNoIGRhdGFzZXRzIChsb2NhbCwgcmVtb3RlLCBwcmVmZXRjaCkKICAgICAgICAgICAgICAgIGlmICghdERhdGFzZXRzLmluaXQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHREYXRhc2V0cy50eXBlID09PSAibG9jYWwiIHx8IHREYXRhc2V0cy50eXBlID09PSAicmVtb3RlIiB8fCB0RGF0YXNldHMudHlwZSA9PT0gInByZWZldGNoIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBibG9vZEhvdW5kQ29uZmlnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1Ub2tlbml6ZXI6IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGspIHx8IGRba10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyArPSAiICIgKyBkW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZSh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5VG9rZW5pemVyOiBCbG9vZGhvdW5kLnRva2VuaXplcnMud2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMudHlwZSA9PT0gImxvY2FsIiApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbCA9IFtdOwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHREYXRhc2V0cy5zb3VyY2UpID09PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMuc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0RGF0YXNldHMuc291cmNlLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsRWxlbWVudCA9IHREYXRhc2V0cy5zb3VyY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobG9jYWxFbGVtZW50KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRWxlbWVudCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiBsb2NhbEVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKGxvY2FsRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZy5sb2NhbCA9IGxvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmxvY2FsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcubG9jYWwgPSB0RGF0YXNldHMubG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJwcmVmZXRjaCIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucHJlZmV0Y2ggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0RGF0YXNldHMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLmZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnByZWZldGNoLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnR5cGUgPT09ICJyZW1vdGUiKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHREYXRhc2V0cy5zb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29kSG91bmRDb25maWcucmVtb3RlLmZpbHRlciA9IHREYXRhc2V0cy5maWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0RGF0YXNldHMucmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vZEhvdW5kQ29uZmlnLnJlbW90ZS5yZXBsYWNlID0gdERhdGFzZXRzLnJlcGxhY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGRhdGFzZXQgY29uZmlnIHBhcmFtcyBpbiB0aGUgQmxvb2Rob3VuZCBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHREYXRhc2V0cywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gJ3R5cGUnIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4ICE9PSAnc291cmNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2ZpbHRlcicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggIT09ICdyZXBsYWNlJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ2xvY2FsJyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCAhPT0gJ3RlbXBsYXRlcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb2RIb3VuZENvbmZpZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZSA9IG5ldyBCbG9vZGhvdW5kKGJsb29kSG91bmRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuc291cmNlID0gZW5naW5lLnR0QWRhcHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB0RGF0YXNldHMuaW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICBpZiAodERhdGFzZXRzLnRlbXBsYXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHREYXRhc2V0cy50ZW1wbGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSB0RGF0YXNldHMudGVtcGxhdGVzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRlbXBsYXRlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYXRhc2V0cy50ZW1wbGF0ZXNba10gPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudHlwZWFoZWFkKHRDb25maWcsIHREYXRhc2V0cyk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAiYXV0b2NvbXBsZXRlZCIgZXZlbnQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkub24oInR5cGVhaGVhZDphdXRvY29tcGxldGVkIiwgZnVuY3Rpb24oZXZlbnQsIGRhdHVtKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShkYXR1bS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciAic2VsZWN0ZWQiIGV2ZW50IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGRhdHVtLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXZlbnRzCiAgICAgICAgICAgICAgICBpZiAodEV2ZW50cykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodEV2ZW50cy5hdXRvY29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbigidHlwZWFoZWFkOmF1dG9jb21wbGV0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuYXV0b2NvbXBsZXRlZChldmVudCwgZGF0dW0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRFdmVudHMuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJ0eXBlYWhlYWQ6c2VsZWN0ZWQiLCBmdW5jdGlvbihldmVudCwgZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFdmVudHMuc2VsZWN0ZWQoZXZlbnQsIGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMsIGNoYW5nZSB0aGUgcXVlcnkgaW4gdHlwZWFoZWFkCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGtlZXAgdGhlIHR5cGVhaGVhZCBjb250cm9sIHN5bmMnZCB3aXRoIHRoZSBhY3R1YWwgZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgaWYgdGhlIHF1ZXJ5IGRvZXNuJ3QgYWxyZWFkeSBtYXRjaAogICAgICAgICAgICAgICAgdmFyIGZpID0gJChzZWxmLmNvbnRyb2wpOwogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNoYW5nZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gJChmaSkudHlwZWFoZWFkKCd2YWwnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChmaSkudHlwZWFoZWFkKCd2YWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHNvbWUgVUkgY2xlYW51cCAod2UgZG9uJ3Qgd2FudCB0eXBlYWhlYWQgdG8gcmVzdHlsZSkKICAgICAgICAgICAgICAgICQoc2VsZi5maWVsZCkuZmluZCgic3Bhbi50d2l0dGVyLXR5cGVhaGVhZCIpLmZpcnN0KCkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7IC8vIFNQQU4gdG8gYmVoYXZlIG1vcmUgbGlrZSBESVYsIG5leHQgbGluZQogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5maW5kKCJzcGFuLnR3aXR0ZXItdHlwZWFoZWFkIGlucHV0LnR0LWlucHV0IikuZmlyc3QoKS5jc3MoImJhY2tncm91bmQtY29sb3IiLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLmlucHV0VHlwZSA9IHNlbGYuaW5wdXRUeXBlOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZXJyU3RhdGUgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gIiI7CiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4TGVuZ3RoKSAmJiBzZWxmLm9wdGlvbnMuc2hvd01heExlbmd0aEluZGljYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKCiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYuc2NoZW1hLm1heExlbmd0aCAtIHZhbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiWW91IGhhdmUgIiArIGRpZmYgKyAiIGNoYXJhY3RlcnMgcmVtYWluaW5nIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIllvdXIgbWVzc2FnZSBpcyB0b28gbG9uZyBieSAiICsgKGRpZmYqLTEpICsgIiBjaGFyYWN0ZXJzIjsKICAgICAgICAgICAgICAgICAgICBlcnJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGluZGljYXRvciA9ICQoc2VsZi5maWVsZCkuZmluZCgiLmFscGFjYS1maWVsZC10ZXh0LW1heC1sZW5ndGgtaW5kaWNhdG9yIik7CiAgICAgICAgICAgICAgICBpZiAoaW5kaWNhdG9yLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAkKCI8cCBjbGFzcz0nYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3InPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuYWZ0ZXIoaW5kaWNhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGluZGljYXRvcikuaHRtbChtZXNzYWdlKTsKICAgICAgICAgICAgICAgICQoaW5kaWNhdG9yKS5yZW1vdmVDbGFzcygiZXJyIik7CiAgICAgICAgICAgICAgICBpZiAoZXJyU3RhdGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChpbmRpY2F0b3IpLmFkZENsYXNzKCJlcnIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wubWFzayAmJiBzZWxmLm9wdGlvbnMubWFza1N0cmluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHVubWFza2VkIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgZm4gPSAkKHRoaXMuY29udHJvbCkuZGF0YSgkLm1hc2suZGF0YU5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGZuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZm4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZW5zdXJlUHJvcGVyVHlwZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCgiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLCB1cGRhdGUgdGhlIG1heCBsZW5ndGggaW5kaWNhdG9yCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWF4TGVuZ3RoSW5kaWNhdG9yKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSAgdGhpcy5fdmFsaWRhdGVQYXR0ZXJuKCk7CiAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGF0dGVybiIpLCBbdGhpcy5zY2hlbWEucGF0dGVybl0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhMZW5ndGgoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vTG9uZyIpLCBbdGhpcy5zY2hlbWEubWF4TGVuZ3RoXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkxlbmd0aCgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVG9vU2hvcnQiKSwgW3RoaXMuc2NoZW1hLm1pbkxlbmd0aF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVG9vTG9uZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29TaG9ydCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIHBhdHRlcm4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUGF0dGVybjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIgJiYgdGhpcy5vcHRpb25zLmFsbG93T3B0aW9uYWxFbXB0eSAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC5tYXRjaCh0aGlzLnNjaGVtYS5wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgbWluTGVuZ3RoIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1pbkxlbmd0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkxlbmd0aDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5MZW5ndGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgaWYodmFsICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICIiICYmIHRoaXMub3B0aW9ucy5hbGxvd09wdGlvbmFsRW1wdHkgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKCIiK3ZhbCkubGVuZ3RoIDwgdGhpcy5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgYWdhaW5zdCB0aGUgc2NoZW1hIG1heExlbmd0aCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiBtYXhMZW5ndGggLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4TGVuZ3RoOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMuc2NoZW1hLm1heExlbmd0aCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsID09PSAiIiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dPcHRpb25hbEVtcHR5ICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCgiIit2YWwpLmxlbmd0aCA+IHRoaXMuc2NoZW1hLm1heExlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZm9jdXNlcyB0aGUgY29udHJvbCBhbmQgYWxzbyBwb3NpdGlvbnMgdGhlIGlucHV0IGF0IHRoZSBlbmQKCiAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKHRoaXMuY29udHJvbCkuZ2V0KDApOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1MZW4gPSBlbC52YWx1ZSA/IGVsLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbGVtTGVuOwogICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IGVsZW1MZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUgZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbiBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZm9jdXMoKTsKCiAgICAgICAgICAgICAgICBpZiAob25Gb2N1c0NhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZ25vcmUgdGFiIGFuZCBhcnJvdyBrZXlzCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDkgfHwgZS5rZXlDb2RlID09PSAzNyB8fCBlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gMzkgfHwgZS5rZXlDb2RlID09PSA0MCApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gOCkgLy8gYmFja3NwYWNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWluTGVuZ3RoKSAmJiAoc2VsZi5vcHRpb25zLmNvbnN0cmFpbkxlbmd0aHMgfHwgc2VsZi5vcHRpb25zLmNvbnN0cmFpbk1pbkxlbmd0aCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpIHx8ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gc2VsZi5zY2hlbWEubWluTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShzZWxmLnNjaGVtYS5tYXhMZW5ndGgpICYmIChzZWxmLm9wdGlvbnMuY29uc3RyYWluTGVuZ3RocyB8fCBzZWxmLm9wdGlvbnMuY29uc3RyYWluTWF4TGVuZ3RoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBzZWxmLmdldFZhbHVlKCkgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNpbmdsZS1MaW5lIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIHNpbmdsZS1saW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1pbkxlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltYWwgTGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4TGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiRmllbGQgZGVmYXVsdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluTGVuZ3RoIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heExlbmd0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGaWVsZCBTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOjQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1hc2sgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHByZXNzaW9uIGZvciB0aGUgZmllbGQgbWFzay4gRmllbGQgbWFza2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgbm90IGVtcHR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIFBsYWNlaG9sZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZpZWxkIHBsYWNlaG9sZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0eXBlYWhlYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUeXBlIEFoZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSAkLnR5cGVhaGVhZCBwbHVnaW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRm9yIGZ1bGwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09wdGlvbmFsRW1wdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBPcHRpb25hbCBFbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgdGhpcyBub24tcmVxdWlyZWQgZmllbGQgdG8gdmFsaWRhdGUgd2hlbiB0aGUgdmFsdWUgaXMgZW1wdHkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRUeXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTDUgSW5wdXQgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIHRoZSBvdmVycmlkZSBvZiB0aGUgdW5kZXJseWluZyBIVE1MNSBpbnB1dCB0eXBlLiAgSWYgbm90IHNwZWNpZmllZCwgYW4gYXNzdW1lZCB2YWx1ZSBpcyBwcm92aWRlZCBiYXNlZCBvbiB0aGUga2luZCBvZiBpbnB1dCBjb250cm9sIChpLmUuICd0ZXh0JywgJ2RhdGUnLCAnZW1haWwnIGFuZCBzbyBmb3J0aCkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGEgYXR0cmlidXRlcyBmb3IgdGhlIHVuZGVybHlpbmcgRE9NIGlucHV0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEga2V5L3ZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIERPTSBhdHRyaWJ1ZXRzIGZvciB0aGUgdW5kZXJseWluZyBpbnB1dCBjb250cm9sLiAgVGhlIGRhdGEgYXR0cmlidXRlcyB3aWxsIGJlIGFkZGVkIGFzIGRhdGEte25hbWV9PSd7dmFsdWV9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYXV0b2NvbXBsZXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiSFRNTCBhdXRvY29tcGxldGUgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBET00gaW5wdXQgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgZm9yIHRoZSB1bmRlcmx5aW5nIGlucHV0IGNvbnRyb2wgd2hldGhlciBvciBub3QgZmllbGQgc2hvdWxkIGhhdmUgYXV0b2NvbXBsZXRlIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRpc2FsbG93RW1wdHlTcGFjZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXNhbGxvdyBFbXB0eSBTcGFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBkaXNhbGxvdyB0aGUgZW50cnkgb2YgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXNhbGxvd09ubHlFbXB0eVNwYWNlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRpc2FsbG93IE9ubHkgRW1wdHkgU3BhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gZGlzYWxsb3cgdGhlIGVudHJ5IG9mIG9ubHkgZW1wdHkgc3BhY2VzIGluIHRoZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1hc2tTdHJpbmciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiYSAtIGFuIGFscGhhIGNoYXJhY3Rlcjs5IC0gYSBudW1lcmljIGNoYXJhY3RlcjsqIC0gYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidHlwZWFoZWFkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcHRpb25hbEVtcHR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbnB1dFR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJUaGlzIGZpZWxkIHNob3VsZCBoYXZlIHBhdHRlcm4gezB9IiwKICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiVGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBhdCBsZWFzdCB7MH0gbnVtYmVycyBvciBjaGFyYWN0ZXJzIiwKICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJUaGlzIGZpZWxkIHNob3VsZCBjb250YWluIGF0IG1vc3QgezB9IG51bWJlcnMgb3IgY2hhcmFjdGVycyIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGV4dCIsIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoInN0cmluZyIsICJ0ZXh0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAidGV4dGFyZWEiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucm93cyA9IDU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xzID0gNDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgdmFyIHN0YXR1cyA9ICB0aGlzLl92YWxpZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgICB2YWxJbmZvWyJ3b3JkTGltaXRFeGNlZWRlZCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgid29yZExpbWl0RXhjZWVkZWQiKSwgW3RoaXMub3B0aW9ucy53b3JkbGltaXRdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGZvciB3b3JkIGxpbWl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhlIHdvcmQgbGltaXQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlV29yZENvdW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmRsaW1pdCAmJiB0aGlzLm9wdGlvbnMud29yZGxpbWl0ID4gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiTXVsdGktTGluZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHRhcmVhIGZpZWxkIGZvciBtdWx0aXBsZSBsaW5lIHRleHQuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiByb3dzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29scyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJyb3dzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJUaGUgbWF4aW11bSB3b3JkIGxpbWl0IG9mIHswfSBoYXMgYmVlbiBleGNlZWRlZC4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0ZXh0YXJlYSIsIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DaGVja0JveEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNoZWNrQm94RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNoZWNrYm94IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMubXVsdGlwbGUpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEudHlwZSA9PT0gImFycmF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHNlbGYuc2NoZW1hWyJlbnVtIl0pICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBtb2RlCgogICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMgPSBbXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGVudW0gdmFsdWVzLCBjb3B5IHRoZW0gaW50byBjaGVja2JveCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25MYWJlbHMgPSBzZWxmLmdldE9wdGlvbkxhYmVscygpOwoKICAgICAgICAgICAgICAgICAgICAkLmVhY2goc2VsZi5nZXRFbnVtKCksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW2luZGV4XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQWxwYWNhLmlzRW1wdHkob3B0aW9uTGFiZWxzW3ZhbHVlXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1t2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tib3hPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCI6IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgdGhleSBwcm92aWRlZCAiZGF0YXNvdXJjZSIsIHdlIGNvcHkgdG8gImRhdGFTb3VyY2UiCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGFTb3VyY2UgPSBzZWxmLm9wdGlvbnMuZGF0YXNvdXJjZTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5vcHRpb25zLmRhdGFzb3VyY2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gd2Ugb3B0aW9uYWxseSBhbGxvdyB0aGUgZGF0YSBzb3VyY2UgcmV0dXJuIHZhbHVlcyB0byBvdmVycmlkZSB0aGUgc2NoZW1hIGFuZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy51c2VEYXRhU291cmNlQXNFbnVtKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIG1vZGUKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yaWdodExhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJpZ2h0TGFiZWwgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hlY2tib3hPcHRpb25zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmNoZWNrYm94T3B0aW9ucyA9IHNlbGYuY2hlY2tib3hPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQE9WRVJSSURFCiAgICAgICAgICovCiAgICAgICAgZ2V0RW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLmVudW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5zY2hlbWEuaXRlbXMuZW51bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25MYWJlbHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLml0ZW1zICYmIHRoaXMub3B0aW9ucy5pdGVtcy5vcHRpb25MYWJlbHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGhpcy5vcHRpb25zLml0ZW1zLm9wdGlvbkxhYmVsczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVyIGZvciB0aGUgZXZlbnQgdGhhdCB0aGUgY2hlY2tib3ggaXMgY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBlIEV2ZW50LgogICAgICAgICAqLwogICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjYmVmb3JlUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGJlZm9yZVJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBtdWx0aXBsZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmNoZWNrYm94T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaGVja2JveE9wdGlvbnMgPSBzZWxmLmNoZWNrYm94T3B0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2JveE9wdGlvbnMubGVuZ3RoID0gMDsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnZva2VEYXRhU291cmNlKHNlbGYuY2hlY2tib3hPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oZXJyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW51bS5wdXNoKHNlbGYuY2hlY2tib3hPcHRpb25zW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3B0aW9uTGFiZWxzLnB1c2goc2VsZi5jaGVja2JveE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgbGl0dGxlIHRyaWNrIHNvIHRoYXQgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsIGl0IGdldHMgc2V0IGR1cmluZyBmaXJzdCByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiB0eXBlb2Yoc2VsZi5kYXRhKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZSBtb2RlLCBtYXJrIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBub25lIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dDpjaGVja2JveCIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRhdGEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gc2VsZi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYuZGF0YSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXkgPSBzZWxmLmRhdGEuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZGF0YUFycmF5Lmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheVthXSA9ICQudHJpbShkYXRhQXJyYXlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFBcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXQ6Y2hlY2tib3hbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyBkYXRhQXJyYXlba10gKyAiXCJdIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2RlCgogICAgICAgICAgICAgICAgLy8gd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIG9uZSBvZiBvdXIgaW5wdXQ6Y2hlY2tib3ggY29udHJvbHMgaXMgY2hhbmdlZCAoZWl0aGVyIHZpYSBhIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkpLAogICAgICAgICAgICAgICAgLy8gd2Ugc2lnbmFsIHRvIHRoZSB0b3AtbGV2ZWwgZmllbGQgdG8gZmlyZSB1cCBhIGNoYW5nZQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IHN5c3RlbSB0byByZWNhbGN1bGF0ZSBhbmQgc3VjaAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0OmNoZWNrYm94IikuY2hhbmdlKGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2NhbGFyIHZhbHVlCiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHZhbHVlcwogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoZWNrYm94T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRGaWVsZCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0W2RhdGEtY2hlY2tib3gtaW5kZXg9JyIgKyBpICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFscGFjYS5jaGVja2VkKGlucHV0RmllbGQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkKGlucHV0RmllbGQpLmF0dHIoImRhdGEtY2hlY2tib3gtdmFsdWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZCB0aGlzIHZhbHVlIGJhY2sKCiAgICAgICAgICAgICAgICAvLyBpZiB0eXBlID09ICJhcnJheSIsIHdlIGp1c3QgaGFuZCBiYWNrIHRoZSBhcnJheQogICAgICAgICAgICAgICAgLy8gaWYgdHlwZSA9PSAic3RyaW5nIiwgd2UgYnVpbGQgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdAogICAgICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5qb2luKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWx1ZSk7CgogICAgICAgICAgICAvLyB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLCBzdHJpbmcgKCJ0cnVlIiksIHN0cmluZyAoImEsYixjIikgb3IgYW4gYXJyYXkgb2YgdmFsdWVzCgogICAgICAgICAgICB2YXIgYXBwbHlTaW5nbGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzU3RyaW5nKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFwcGx5TXVsdGlWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmdzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgiLCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhpbmdzIHRvIHJlbW92ZSBhbnkgZXhjZXNzIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBBbHBhY2EudHJpbSh2YWx1ZXNbaV0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB2YWx1ZXMgYW5kIGFzc2lnbiBpbnRvIGFwcHJvcHJpYXRlIGlucHV0cwogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZV0iKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiaW5wdXRbZGF0YS1jaGVja2JveC12YWx1ZT1cIiIgKyB2YWx1ZXNbal0gKyAiXCJdIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKGlucHV0WzBdKSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhcHBsaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIG1vZGUKCiAgICAgICAgICAgICAgICAvLyBib29sZWFuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5U2luZ2xlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlTaW5nbGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB2YWx1ZSBtb2RlCgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5TXVsdGlWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbGllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheSh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlNdWx0aVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhcHBsaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcHBsaWVkICYmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBbHBhY2EubG9nRXJyb3IoIkNoZWNrYm94RmllbGQgY2Fubm90IHNldCB2YWx1ZSBmb3Igc2NoZW1hLnR5cGU9IiArIHNlbGYuc2NoZW1hLnR5cGUgKyAiIGFuZCB2YWx1ZT0iICsgdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlIGFnYWluc3QgZW51bSBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGVja2JveCBmaWVsZCBpcyBpbiBtdWx0aXBsZSBtb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlwbGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdmFsID0gc2VsZi5kYXRhOwoKICAgICAgICAgICAgdmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLmlzUmVxdWlyZWQoKSAmJiBBbHBhY2EuaXNWYWxFbXB0eSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdmFsIGlzIGEgc3RyaW5nLCBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgiLCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLmFueUVxdWFsaXR5KHZhbCwgc2VsZi5nZXRFbnVtKCkpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rpc2FibGUKICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0IikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRvU2NhbGFyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9EYXRhVmFsdWU6IGZ1bmN0aW9uKHNjYWxhclZhbHVlLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNjYWxhclZhbHVlKTsKICAgICAgICB9LAoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDaGVja2JveCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ2hlY2tib3ggRmllbGQgZm9yIGJvb2xlYW4gKHRydWUvZmFsc2UpLCBzdHJpbmcgKCd0cnVlJywgJ2ZhbHNlJyBvciBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIG9mIHZhbHVlcykgb3IgZGF0YSBhcnJheS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3B0aW9uIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbmFsIHJpZ2h0LWhhbmQgc2lkZSBsYWJlbCBmb3Igc2luZ2xlIGNoZWNrYm94IGZpZWxkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gcmVuZGVyIG11bHRpcGxlIGNoZWNrYm94ZXMgZm9yIG11bHRpLXZhbHVlZCB0eXBlIChzdWNoIGFzIGFuIGFycmF5IG9yIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJPcHRpb24gRGF0YVNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEYXRhIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiAgSWYgYSBzdHJpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBVUkkgdG8gYSBzZXJ2aWNlIHRoYXQgcHJvZHVjZXMgYSBvYmplY3QgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2Ygc3RydWN0dXJlIHsndGV4dCc6ICcnLCAndmFsdWUnOiAnJ30uICBUaGlzIGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjaGVja2JveCIsIEFscGFjYS5GaWVsZHMuQ2hlY2tCb3hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJib29sZWFuIiwgImNoZWNrYm94Iik7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkZpbGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRmlsZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJmaWxlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7CgogICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2YWJsZSgpOwoKICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXBkYXRlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdGlvbkhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXIoZS50YXJnZXQuZmlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc1NlbGVjdGlvbkhhbmRsZXI6IGZ1bmN0aW9uKGZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEhUTUw1IEZpbGVSZWFkZXIsIHdlIGNhbiBwdWxsIGluIHRoZSBzdHJlYW0gZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoRmlsZVJlYWRlcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBwcmV2aW91cyBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZWREYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb3VudCA9IDA7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVVyaSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkRGF0YS5wdXNoKGRhdGFVcmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRDb3VudCA9PT0gZmlsZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuc2VsZWN0aW9uSGFuZGxlci5jYWxsKGZpZWxkLCBmaWxlcywgbG9hZGVkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmlsZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgdXBsb2FkaW5nIGZpbGVzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZWxlY3Rpb24gSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuICBSZXF1aXJlcyBIVE1MNS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbkhhbmRsZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJmaWxlIiwgQWxwYWNhLkZpZWxkcy5GaWxlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuTGlzdEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuYmFzZSgpOwoKICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zID0gW107CgogICAgICAgICAgICBpZiAoc2VsZi5nZXRFbnVtKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGVudW1lcmF0ZWQgdmFsdWVzCiAgICAgICAgICAgICAgICBzZWxmLnNvcnRFbnVtKCk7CgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbkxhYmVscyA9IHNlbGYuZ2V0T3B0aW9uTGFiZWxzKCk7CgogICAgICAgICAgICAgICAgJC5lYWNoKHNlbGYuZ2V0RW51bSgpLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTGFiZWxzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShvcHRpb25MYWJlbHNbaW5kZXhdKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9wdGlvbkxhYmVsc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFscGFjYS5pc0VtcHR5KG9wdGlvbkxhYmVsc1t2YWx1ZV0pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uTGFiZWxzW3ZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RPcHRpb25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB0ZXh0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF1dG8gYXNzaWduIGRhdGEgaWYgd2UgaGF2ZSBkYXRhIGFuZCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHJlbW92ZURlZmF1bHROb25lIGlzIGVpdGhlciB1bnNwZWNpZmllZCBvciB0cnVlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2VsZi5pc1JlcXVpcmVkKCkgJiYgIXNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUgPT09IHRydWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnVtVmFsdWVzID0gc2VsZi5nZXRFbnVtKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZXMgJiYgZW51bVZhbHVlcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW51bVZhbHVlc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHRoZXkgcHJvdmlkZWQgImRhdGFzb3VyY2UiLCB3ZSBjb3B5IHRvICJkYXRhU291cmNlIgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRhdGFzb3VyY2UgJiYgIXNlbGYub3B0aW9ucy5kYXRhU291cmNlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YVNvdXJjZSA9IHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICAgICAgZGVsZXRlIHNlbGYub3B0aW9ucy5kYXRhc291cmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3ZSBvcHRpb25hbGx5IGFsbG93IHRoZSBkYXRhIHNvdXJjZSByZXR1cm4gdmFsdWVzIHRvIG92ZXJyaWRlIHRoZSBzY2hlbWEgYW5kIG9wdGlvbnMKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXNlRGF0YVNvdXJjZUFzRW51bSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udHJvbE1vZGVsOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbihtb2RlbCkgewoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm5vbmVMYWJlbCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5ub25lTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoIm5vbmVMYWJlbCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVOb25lKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucmVtb3ZlRGVmYXVsdE5vbmUpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHNlbGYub3B0aW9ucy5yZW1vdmVEZWZhdWx0Tm9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmhpZGVOb25lID0gc2VsZi5pc1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2JlZm9yZVJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZuID0gZnVuY3Rpb24oKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmNvbnZlcnRUb1NjYWxhclZhbHVlKHNlbGYuZGF0YSk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxhclZhbHVlID09PSBzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE9wdGlvbnNbaV0uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRhU291cmNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBhcnJheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0T3B0aW9ucy5sZW5ndGggPSAwOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmludm9rZURhdGFTb3VyY2Uoc2VsZi5zZWxlY3RPcHRpb25zLCBtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVzZURhdGFTb3VyY2VBc0VudW0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBidWlsZCBvdXQgdGhlIGVudW0gYW5kIG9wdGlvbkxhYmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lbnVtID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29wdGlvbkxhYmVscyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudW0ucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcHRpb25MYWJlbHMucHVzaChzZWxmLnNlbGVjdE9wdGlvbnNbaV0udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRFbnVtKF9lbnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uTGFiZWxzKF9vcHRpb25MYWJlbHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRm4oKTsKCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0VG9TY2FsYXJWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRUb0RhdGFWYWx1ZTogZnVuY3Rpb24oc2NhbGFyVmFsdWUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc2NhbGFyVmFsdWUpOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW51bWVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBmaWVsZCB2YWx1ZSBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YVNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk9wdGlvbiBEYXRhc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRhdGFzb3VyY2UgZm9yIGdlbmVyYXRpbmcgbGlzdCBvZiBvcHRpb25zLiAgVGhpcyBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi4gIElmIGEgc3RyaW5nLCBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgVVJJIHRvIGEgc2VydmljZSB0aGF0IHByb2R1Y2VzIGEgb2JqZWN0IGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIG9yIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHN0cnVjdHVyZSB7J3RleHQnOiAnJywgJ3ZhbHVlJzogJyd9LiAgVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHNhbWUgbGlzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSZW1vdmUgRGVmYXVsdCBOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBkZWZhdWx0ICdOb25lJyBvcHRpb24gd2lsbCBub3QgYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJOb25lIExhYmVsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsYWJlbCB0byB1c2UgZm9yIHRoZSAnTm9uZScgb3B0aW9uIGluIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIE5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBoaWRlIHRoZSBOb25lIG9wdGlvbiBmcm9tIGEgbGlzdCAoc2VsZWN0LCByYWRpbyBvciBvdGhlcndpc2UpLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VEYXRhU291cmNlQXNFbnVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVXNlIERhdGEgU291cmNlIGFzIEVudW1lcmF0ZWQgVmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gY29uc3RyYWluIHRoZSBmaWVsZCdzIHNjaGVtYSBlbnVtIHByb3BlcnR5IHRvIHRoZSB2YWx1ZXMgdGhhdCBjb21lIGJhY2sgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGFTb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVmYXVsdE5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiUmVtb3ZlIERlZmF1bHQgTm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJub25lTGFiZWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGlkZU5vbmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiSGlkZSB0aGUgJ05vbmUnIG9wdGlvbiBmcm9tIHRoZSBsaXN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBSZWdpc3RlcnMgYWRkaXRpb25hbCBtZXNzYWdlcwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJub25lTGFiZWwiOiAiTm9uZSIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKXsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5SYWRpb0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJyYWRpbyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7CgkJCX0KCQkJZWxzZSBpZiAoIXRoaXMubmFtZSkKICAgICAgICAgICAgewoJCQkJdGhpcy5uYW1lID0gdGhpcy5nZXRJZCgpICsgIi1uYW1lIjsKCQkJfQoKICAgICAgICAgICAgLy8gZW1wdHkgc2VsZWN0IGZpcnN0IHRvIGZhbHNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB2ZXJ0aWNhbCBvcmllbnRhdGlvbgogICAgICAgICAgICAvLyBlbXB0eSBzZWxlY3QgZmlyc3QgdG8gZmFsc2UgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy52ZXJ0aWNhbCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbCA9IG51bGw7CgogICAgICAgICAgICAkKHRoaXMuY29udHJvbCkuZmluZCgiOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFsID0gJCh0aGlzKS52YWwoKTsKCiAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLmVuc3VyZVByb3BlclR5cGUodmFsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2xlYXIgYWxsCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dCIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHRoaXMpLCBudWxsKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBtYXJrIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIGlmICh0eXBlb2YodmFsKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0W3ZhbHVlPVwiIiArIHZhbCArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgbm9uZSBzZWxlY3RlZCBhbmQgImVtcHR5U2VsZWN0Rmlyc3QiLCB0aGVuIHNlbGVjdAogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVtcHR5U2VsZWN0Rmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY29udHJvbCkuZmluZCgiaW5wdXQ6Y2hlY2tlZCIpLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuY2hlY2tlZCgkKHNlbGYuY29udHJvbCkuZmluZCgiaW5wdXQ6cmFkaW8iKS5maXJzdCgpLCAiY2hlY2tlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsKTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICB2YXIgaW5wdXRzID0gJCh0aGlzLmNvbnRyb2wpLmZpbmQoImlucHV0Iik7CgogICAgICAgICAgICBpbnB1dHMuZm9jdXMoZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlucHV0cy5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZi5zdXNwZW5kQmx1ckZvY3VzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJibHVyIiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHByZXBhcmVDb250cm9sTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0T3B0aW9ucyA9IHNlbGYuc2VsZWN0T3B0aW9uczsKICAgICAgICAgICAgICAgIG1vZGVsLnJlbW92ZURlZmF1bHROb25lID0gc2VsZi5vcHRpb25zLnJlbW92ZURlZmF1bHROb25lOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gaWYgZW1wdHlTZWxlY3RGaXJzdCBhbmQgbm90aGluZyBjdXJyZW50bHkgY2hlY2tlZCwgdGhlbiBwaWNrIGZpcnN0IGl0ZW0gaW4gdGhlIHZhbHVlIGxpc3QKICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhIGFuZCB2aXN1YWxseSBzZWxlY3QgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZW1wdHlTZWxlY3RGaXJzdCAmJiBzZWxmLnNlbGVjdE9wdGlvbnMgJiYgc2VsZi5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5zZWxlY3RPcHRpb25zWzBdLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJCgiaW5wdXQ6cmFkaW86Y2hlY2tlZCIsIHNlbGYuY29udHJvbCkubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmNoZWNrZWQoJChzZWxmLmNvbnRyb2wpLmZpbmQoImlucHV0OnJhZGlvW3ZhbHVlPVwiIiArIHNlbGYuZGF0YSArICJcIl0iKSwgImNoZWNrZWQiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3RhY2sgcmFkaW8gc2VsZWN0b3JzIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMudmVydGljYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5jc3MoImRpc3BsYXkiLCAiaW5saW5lLWJsb2NrIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgIm5hbWUiIHByb3BlcnR5IG9uIHRoZSBjb250cm9sIGlzIGtlcHQgaW4gc3luYy4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVET01FbGVtZW50OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgICQodGhpcy5jb250cm9sKS5maW5kKCJpbnB1dDpyYWRpbyIpLmF0dHIoIm5hbWUiLCB0aGlzLmdldE5hbWUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uQ2xpY2sKICAgICAgICAgKi8KICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIHZhbCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKCJpbnB1dCIpLnZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBtYW51YWxseSB0cmlnZ2VyIGNoYW5nZSBldmVudAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdmFsKSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkaXNhYmxlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBmb3IgcmFkaW8gYnV0dG9ucywgd2UgYWxzbyBtYXJrIHRoZSBvdXRlciBESVYgYXMgZGlzYWJsZWQgdG8gcHJldmVudCBsYWJlbCBjbGlja3MKICAgICAgICAgICAgLy8gYW5kIGFwcGx5IHNvbWUgQ1NTIHN0eWxpbmcKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuYWRkQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRFbCgpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSYWRpbyBHcm91cCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmFkaW8gR3JvdXAgRmllbGQgd2l0aCBsaXN0IG9mIG9wdGlvbnMuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCgkJZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLHsKCQkJCSJwcm9wZXJ0aWVzIjogewoJCQkJCSJuYW1lIjogewoJCQkJCQkidGl0bGUiOiAiRmllbGQgbmFtZSIsCgkJCQkJCSJkZXNjcmlwdGlvbiI6ICJGaWVsZCBuYW1lLiIsCgkJCQkJCSJ0eXBlIjogInN0cmluZyIKCQkJCQl9LAogICAgICAgICAgICAgICAgICAgICJlbXB0eVNlbGVjdEZpcnN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoZSBkYXRhIGlzIGVtcHR5LCB0aGVuIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQb3NpdGlvbiB0aGUgcmFkaW8gc2VsZWN0b3IgaXRlbXMgdmVydGljYWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCeSBkZWZhdWx0LCByYWRpbyBjb250cm9scyBhcmUgc3RhY2tlZCB2ZXJ0aWNhbGx5LiAgU2V0IHRvIGZhbHNlIGlmIHlvdSdkIGxpa2UgcmFkaW8gY29udHJvbHMgdG8gbGF5IG91dCBob3Jpem9udGFsbHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgCiAgICB9KTsKICAgIAogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygicmFkaW8iLCBBbHBhY2EuRmllbGRzLlJhZGlvRmllbGQpOwogICAgCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkID0gQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJzZWxlY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWFbInR5cGUiXSAmJiBzZWxmLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gb24gImhpZGVOb25lIiBpZiB3ZSdyZSBpbiBtdWx0aXNlbGVjdCBtb2RlIGFuZCBoYXZlIHRoZSBtdWx0aXNlbGVjdCBwbHVnaW4KICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSAmJiAkLmZuLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5oaWRlTm9uZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlTm9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9mZmVyIHNvbWUgYmFja3dhcmQgY29tcGFiaWxpdHkgaGVyZSBhcyBvbGRlciB2ZXJzaW9uIG9mIEFscGFjYSB1c2VkIHRvIGluY29ycmVjdGx5IGxvb2sgZm9yCiAgICAgICAgICAgIC8vIG1heEl0ZW1zIGFuZCBtaW5JdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgJC5mbi5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0ID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QgJiYgdHlwZW9mKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdC5kaXNhYmxlSWZFbXB0eSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlzZWxlY3QuZGlzYWJsZUlmRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09PSAib2JqZWN0IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgbmV3U2NhbGFyVmFsID0gc2VsZi5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwogICAgICAgICAgICB2YXIgY3VycmVudFNjYWxhclZhbCA9IHNlbGYuY29udmVydFRvU2NhbGFyVmFsdWUoc2VsZi5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNBcnJheSh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlbiBzZXQKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmNvbXBhcmVBcnJheUNvbnRlbnQobmV3U2NhbGFyVmFsLCBjdXJyZW50U2NhbGFyVmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KG5ld1NjYWxhclZhbCkgJiYgdGhpcy5jb250cm9sKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbChuZXdTY2FsYXJWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShuZXdTY2FsYXJWYWwpICYmIEFscGFjYS5pc0VtcHR5KGN1cnJlbnRTY2FsYXJWYWwpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1NjYWxhclZhbCAhPT0gY3VycmVudFNjYWxhclZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhcHBseSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGFwcGx5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wgJiYgdHlwZW9mKG5ld1NjYWxhclZhbCkgIT09ICJ1bmRlZmluZWQiICYmIG5ld1NjYWxhclZhbCAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC52YWwobmV3U2NhbGFyVmFsKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuTGlzdEZpZWxkI2dldEVudW0KICAgICAgICAgKi8KICAgICAgICBnZXRFbnVtOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVsiZW51bSJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2hlbWFbInR5cGUiXSAmJiB0aGlzLnNjaGVtYVsidHlwZSJdID09PSAiYXJyYXkiICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdICYmIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hWyJpdGVtcyJdWyJlbnVtIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0Q29udHJvbEV2ZW50czogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gdGhpcy5jb250cm9sLnBhcmVudCgpLmZpbmQoImJ1dHRvbi5tdWx0aXNlbGVjdCIpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5mb2N1cyhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLnN1c3BlbmRCbHVyRm9jdXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGJ1dHRvbi5ibHVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuc3VzcGVuZEJsdXJGb2N1cykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25CbHVyLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uIChtb2RlbCkgewoKICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdE9wdGlvbnMgPSBzZWxmLnNlbGVjdE9wdGlvbnM7CgogICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG91dCAiZGlzcGxheWFibGVUZXh0IgogICAgICAgICAgICAgICAgdmFyIGRpc3BsYXlhYmxlVGV4dHMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuc2VsZWN0T3B0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXBbbW9kZWwuc2VsZWN0T3B0aW9uc1tpXS52YWx1ZV0gPSBtb2RlbC5zZWxlY3RPcHRpb25zW2ldLnRleHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KG1vZGVsLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gbWFwW21vZGVsLmRhdGFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGVUZXh0cy5wdXNoKHRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kaXNwbGF5YWJsZVRleHQgPSBkaXNwbGF5YWJsZVRleHRzLmpvaW4oIiwgIik7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiBlbXB0eVNlbGVjdEZpcnN0IGFuZCBub3RoaW5nIGN1cnJlbnRseSBjaGVja2VkLCB0aGVuIHBpY2sgZmlyc3QgaXRlbSBpbiB0aGUgdmFsdWUgbGlzdAogICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgYW5kIHZpc3VhbGx5IHNlbGVjdCBpdAogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZChzZWxmLmRhdGEpICYmIHNlbGYub3B0aW9ucy5lbXB0eVNlbGVjdEZpcnN0ICYmIHNlbGYuc2VsZWN0T3B0aW9ucyAmJiBzZWxmLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnNlbGVjdE9wdGlvbnNbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG8gdGhpcyBsaXR0bGUgdHJpY2sgc28gdGhhdCBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgaXQgZ2V0cyBzZXQgZHVyaW5nIGZpcnN0IHJlbmRlcgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gbXVsdGlwbGUgbW9kZSBhbmQgdGhlIGJvb3RzdHJhcCBtdWx0aXNlbGVjdCBwbHVnaW4gaXMgYXZhaWxhYmxlLCBiaW5kIGl0IGluCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpcGxlICYmICQuZm4ubXVsdGlzZWxlY3QgJiYgIXNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSAiTm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubm9uZUxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ub25TZWxlY3RlZFRleHQgPSBzZWxmLm9wdGlvbnMubm9uZUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KHNldHRpbmdzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgYWdhaW5zdCBlbnVtIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIGVsZW1lbnQgdmFsdWUgaXMgcGFydCBvZiB0aGUgZW51bSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRW51bTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYVsiZW51bSJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5kYXRhOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkodmFsKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodmFsKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGksdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxhclZhbHVlID0gX3RoaXMuY29udmVydFRvU2NhbGFyVmFsdWUodik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5BcnJheSA9IEFscGFjYS5pbkFycmF5KF90aGlzLnNjaGVtYVsiZW51bSJdLCBzY2FsYXJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5BcnJheSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIGFuIGFycmF5IG1vZGVsZWQgb24gYSBzaW5nbGUgc2VsZWN0LCBqdXN0IHVzZSB0aGUgMHRoIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWxbMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBfdGhpcy5jb252ZXJ0VG9TY2FsYXJWYWx1ZSh2YWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLmluQXJyYXkodGhpcy5zY2hlbWFbImVudW0iXSwgc2NhbGFyVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgc2NhbGFyVmFsdWUgPSBzZWxmLmdldENvbnRyb2xWYWx1ZSgpOwoKICAgICAgICAgICAgc2VsZi5jb252ZXJ0VG9EYXRhVmFsdWUoc2NhbGFyVmFsdWUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewoKICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgaW50byBkYXRhIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7CgogICAgICAgICAgICAgICAgLy8gc3RvcmUgc2NhbGFyIHZhbHVlIG9udG8gY29udHJvbAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnZhbChzY2FsYXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBvYnNlcnZhYmxlcyBhbmQgdXBkYXRlcwogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbnVtYmVyIG9mIGl0ZW1zIGhhcyBiZWVuIGxlc3MgdGhhbiBtaW5JdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1pbkl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWluSXRlbXMgJiYgdGhpcy5zY2hlbWEubWluSXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPCB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcy4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gb3ZlciBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU1heEl0ZW1zOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEubWF4SXRlbXMgJiYgdGhpcy5zY2hlbWEubWF4SXRlbXMgPj0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCQoIjpzZWxlY3RlZCIsdGhpcy5jb250cm9sKS5sZW5ndGggPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1heEl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgidG9vTWFueUl0ZW1zIiksIFt0aGlzLnNjaGVtYS5tYXhJdGVtc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5JdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgibm90RW5vdWdoSXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1pbkl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJ0b29NYW55SXRlbXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sibm90RW5vdWdoSXRlbXMiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZm9jdXMKICAgICAgICAgKi8KICAgICAgICBmb2N1czogZnVuY3Rpb24ob25Gb2N1c0NhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIG9udG8gdGhlIHNlbGVjdAogICAgICAgICAgICAgICAgdmFyIGVsID0gJCh0aGlzLmNvbnRyb2wpLmdldCgwKTsKCiAgICAgICAgICAgICAgICBlbC5mb2N1cygpOwoKICAgICAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb25Gb2N1c0NhbGxiYWNrKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm11bHRpc2VsZWN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0Q29udHJvbEVsKCkpLm11bHRpc2VsZWN0KCJkaXNhYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXNlbGVjdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmdldENvbnRyb2xFbCgpKS5tdWx0aXNlbGVjdCgiZW5hYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU2VsZWN0IEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkxpc3RGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNdWxpdHBsZSBTZWxlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGlzcGxheWVkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgc2hvd24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJFbXB0eSBTZWxlY3QgRmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhlIGRhdGEgaXMgZW1wdHksIHRoZW4gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXNlbGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpc2VsZWN0IFBsdWdpbiBTZXR0aW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5MaXN0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaXplIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtcHR5U2VsZWN0Rmlyc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiRW1wdHkgU2VsZWN0IEZpcnN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm11bHRpc2VsZWN0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJNdWx0aXNlbGVjdCBwbHVnaW4gcHJvcGVydGllcyAtIGh0dHA6Ly9kYXZpZHN0dXR6LmdpdGh1Yi5pby9ib290c3RyYXAtbXVsdGlzZWxlY3QiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJzZWxlY3QiLCBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gIm51bWJlciI7CiAgICAgICAgICAgIC8vdGhpcy5pbnB1dFR5cGUgPSAibnVtYmVyIjsKICAgICAgICAgICAgLy8gVE9ETzogd2UgY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIENocm9tZSBzY3Jld3MgdXAgaXQncyBoYW5kbGluZyBvZiBudW1iZXIgdHlwZQogICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgdXMgZnJvbSB2YWxpZGF0aW5nIHByb3Blcmx5CiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjQyMDgyOC9qcXVlcnktdmFsLXJlZnVzZXMtdG8tcmV0dXJuLW5vbi1udW1lcmljLWlucHV0LWZyb20tYS1udW1iZXItZmllbGQtdW5kZXItY2hyb21lCgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLm51bWVyaWNFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubnVtZXJpY0VudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGUgfHwgMDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm51bWVyaWNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAoa2V5ID49IDQ4ICYmIGtleSA8PSA1Nyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlbiBhbGxvdyBlbnRyeSBvZiBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldENvbnRyb2xWYWwodHJ1ZSk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT0gInVuZGVmaW5lZCIgfHwgIiIgPT0gdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU51bWJlcigpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdOb3RBTnVtYmVyIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdOb3RBTnVtYmVyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURpdmlzaWJsZUJ5KCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ0RpdmlzaWJsZUJ5Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJzdHJpbmdEaXZpc2libGVCeSIpLCBbdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnldKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4aW11bSgpOwogICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICIiLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb0xhcmdlIl1bIm1lc3NhZ2UiXSA9IEFscGFjYS5zdWJzdGl0dXRlVG9rZW5zKHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nVmFsdWVUb29MYXJnZSIpLCBbdGhpcy5zY2hlbWEubWF4aW11bV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbmltdW0oKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29TbWFsbCJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlVG9vU21hbGwiKSwgW3RoaXMuc2NoZW1hLm1pbmltdW1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNdWx0aXBsZU9mKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiAiIiwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJtZXNzYWdlIl0gPSBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiIpLCBbdGhpcy5zY2hlbWEubXVsdGlwbGVPZl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kIGJhY2sgYSB0cnVlL2ZhbHNlCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInN0cmluZ05vdEFOdW1iZXIiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nRGl2aXNpYmxlQnkiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sic3RyaW5nVmFsdWVUb29MYXJnZSJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdWYWx1ZVRvb1NtYWxsIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJzdHJpbmdUb29Mb25nIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInN0cmluZ1Rvb1Nob3J0Il1bInN0YXR1cyJdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBhZ2FpbnN0IHJlcXVpcmVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IEZhbHNlIGlmIHRoaXMgZmllbGQgdmFsdWUgaXMgZW1wdHkgYnV0IHJlcXVpcmVkLCB0cnVlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVPcHRpb25hbDogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKCkgJiYgQWxwYWNhLmlzVmFsRW1wdHkoJCh0aGlzLmNvbnRyb2wpLnZhbCgpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBpdCBpcyBhIGZsb2F0IG51bWJlci4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIGZsb2F0IG51bWJlcgogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZU51bWJlcjogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBudW1iZXIgZm9ybWF0CiAgICAgICAgICAgIHZhciB2YWxpZE51bWJlciA9IEFscGFjYS50ZXN0UmVnZXgoQWxwYWNhLnJlZ2V4cHMubnVtYmVyLCB0ZXh0VmFsdWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB3aGF0IHRoZXkgZW50ZXJlZCB3YXMgYSBudW1iZXIKICAgICAgICAgICAgdmFyIGZsb2F0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgIGlmIChpc05hTihmbG9hdFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgZGl2aXNpYmxlQnkgY29uc3RyYWludC4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBwYXNzZXMgdGhlIGRpdmlzaWJsZUJ5IGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGl2aXNpYmxlQnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5kaXZpc2libGVCeSkpIHsKCiAgICAgICAgICAgICAgICAvLyBtb2QKICAgICAgICAgICAgICAgIGlmIChmbG9hdFZhbHVlICUgdGhpcy5zY2hlbWEuZGl2aXNpYmxlQnkgIT09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4aW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tYXhpbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPiB0aGlzLnNjaGVtYS5tYXhpbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5tYXhpbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtYXhpbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtaW5pbXVtIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluaW11bTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5taW5pbXVtKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgPCB0aGlzLnNjaGVtYS5taW5pbXVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkodGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA9PSB0aGlzLnNjaGVtYS5taW5pbXVtICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgcGFzc2VzIHRoZSBtdWx0aXBsZU9mIGNvbnN0cmFpbnQuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTXVsdGlwbGVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmbG9hdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnNjaGVtYS5tdWx0aXBsZU9mKSkgewogICAgICAgICAgICAgICAgaWYgKGZsb2F0VmFsdWUgJiYgdGhpcy5zY2hlbWEubXVsdGlwbGVPZiAhPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaWdub3JlIHRhYiBhbmQgYXJyb3cga2V5cwogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA5IHx8IGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDM5IHx8IGUua2V5Q29kZSA9PT0gNDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDgpIC8vIGJhY2tzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbkxlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NaW5MZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8PSBzZWxmLnNjaGVtYS5taW5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1heExlbmd0aCkgJiYgKHNlbGYub3B0aW9ucy5jb25zdHJhaW5MZW5ndGhzIHx8IHNlbGYub3B0aW9ucy5jb25zdHJhaW5NYXhMZW5ndGgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHNlbGYuZ2V0VmFsdWUoKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICBpZihBbHBhY2EuaXNOdW1iZXIobmV3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+PSBzZWxmLnNjaGVtYS5tYXhMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBraWxsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSAvLyBzcGFjZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRpc2FsbG93RW1wdHlTcGFjZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2lsbCBldmVudAogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25LZXlVcDogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGlmIGFwcGxpY2FibGUsIHVwZGF0ZSB0aGUgbWF4IGxlbmd0aCBpbmRpY2F0b3IKICAgICAgICAgICAgc2VsZi51cGRhdGVNYXhMZW5ndGhJbmRpY2F0b3IoKTsKCiAgICAgICAgICAgIC8vIHRyaWdnZXIgImZpZWxka2V5dXAiCiAgICAgICAgICAgICQodGhpcy5maWVsZCkudHJpZ2dlcigiZmllbGRrZXl1cCIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTXVsdGlwbGUgT2YiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBtdWx0aXBsZU9mIHNjaGVtYSBwcm9wZXJ0eSBzdWNoIHRoYXQgZGl2aXNpb24gYnkgdGhpcyB2YWx1ZSB5aWVsZHMgYW4gaW50ZXJnZXIgKG1vZCB6ZXJvKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTWluaW11bSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRXhjbHVzaXZlIE1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgY2FuIG5vdCBlcXVhbCB0aGUgbnVtYmVyIGRlZmluZWQgYnkgdGhlIG1pbmltdW0gc2NoZW1hIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkV4Y2x1c2l2ZSBNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IHZhbHVlIGNhbiBub3QgZXF1YWwgdGhlIG51bWJlciBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIHNjaGVtYSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIE9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBtdXN0IGJlIGEgaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1pbmltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBtaW5pbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImV4Y2x1c2l2ZU1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodExhYmVsIjogIkV4Y2x1c2l2ZSBNYXhpbXVtID8iLAogICAgICAgICAgICAgICAgICAgICAgICAiaGVscGVyIjogIkZpZWxkIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGJ1dCBub3QgZXF1YWwgdG8gdGhpcyBudW1iZXIgaWYgY2hlY2tlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm51bWVyaWNFbnRyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk51bWVyaWMgRW50cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBjb25zdHJhaW4gZGF0YSBlbnRyeSBrZXkgcHJlc3NlcyB0byBudW1lcmljIHZhbHVlcyAoMC05KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk51bWJlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgZmxvYXQgbnVtYmVycy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyB7MH0iLAogICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIlZhbHVlIG9mIHRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9IiwKICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWYWx1ZSBvZiB0aGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHswfSIsCiAgICAgICAgInN0cmluZ0RpdmlzaWJsZUJ5IjogIlRoZSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB7MH0iLAogICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlRoaXMgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsCiAgICAgICAgInN0cmluZ1ZhbHVlTm90TXVsdGlwbGVPZiI6ICJUaGlzIHZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygibnVtYmVyIiwgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJudW1iZXIiLCAibnVtYmVyIik7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwODMgKi8gLy8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgdXNlZCBzYWZlbHkKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgPSBzZWxmLnJlc29sdmVDb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKCk7CiAgICAgICAgICAgIGlmICghY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJVbmFibGUgdG8gZmluZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgaXRlbTogIiArIHNlbGYuZ2V0RmllbGRUeXBlKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJjb250YWluZXItIiArIGNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUgKyAiLWl0ZW0iLCBzZWxmKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9IEFscGFjYS5pc0VtcHR5KHRoaXMudmlldy50b29sYmFyU3R5bGUpID8gImJ1dHRvbiIgOiB0aGlzLnZpZXcudG9vbGJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdHlsZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY3Rpb25iYXJTdHlsZSkgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LmFjdGlvbmJhclN0eWxlKSA/ICJ0b3AiIDogdGhpcy52aWV3LmFjdGlvbmJhclN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFjdGlvbmJhclN0eWxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUgPSAidG9wIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gQWxwYWNhLmlzRW1wdHkodGhpcy52aWV3LnRvb2xiYXJQb3NpdGlvbikgPyAidG9wIiA6IHRoaXMudmlldy50b29sYmFyUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID0gInRvcCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEuaXRlbXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLml0ZW1zID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLml0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb2ZmZXIgc29tZSBiYWNrd2FyZCBjb21wYWJpbGl0eSBoZXJlIGFzIG9sZGVyIHZlcnNpb24gb2YgQWxwYWNhIHVzZWQgdG8gaW5jb3JyZWN0bHkgbG9vayBmb3IKICAgICAgICAgICAgLy8gbWF4SXRlbXMsIG1pbkl0ZW1zIGFuZCB1bmlxdWVJdGVtcyBvbiB0aGUgc2NoZW1hLml0ZW1zIHN1Ym9iamVjdC4KICAgICAgICAgICAgLy8gaWYgbm90IGRlZmluZWQgcHJvcGVybHksIHdlIG9mZmVyIHNvbWUgYXV0b21hdGljIGZvcndhcmQgbWlncmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zICYmIHR5cGVvZih0aGlzLnNjaGVtYS5tYXhJdGVtcykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXhJdGVtcyA9IHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NoZW1hLml0ZW1zLm1heEl0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtcyAmJiB0eXBlb2YodGhpcy5zY2hlbWEubWluSXRlbXMpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEubWluSXRlbXMgPSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYS5pdGVtcy5taW5JdGVtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEuaXRlbXMgJiYgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXMgJiYgdHlwZW9mKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zID0gdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWEuaXRlbXMudW5pcXVlSXRlbXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHdlIGFyZSB1c2luZyAicnVieSBvbiByYWlscyIgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ydWJ5cmFpbHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9wdGlvbnMgJiYgdGhpcy5wYXJlbnQub3B0aW9ucy5mb3JtICYmIHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KHRoaXMucGFyZW50Lm9wdGlvbnMuZm9ybS5hdHRyaWJ1dGVzLnJ1YnlyYWlscykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJ1YnlyYWlscyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0b29sYmFyU3RpY2t5ID0gQWxwYWNhLmRlZmF1bHRUb29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLnZpZXcudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLnZpZXcudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eSh0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRvb2xiYXJTdGlja3kgPSB0aGlzLm9wdGlvbnMudG9vbGJhclN0aWNreTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPSB0b29sYmFyU3RpY2t5OwoKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgaGlkZSB0b29sYmFyIHdoZW4gY2hpbGRyZW4uY291bnQgPiAwCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmhpZGVUb29sYmFyV2l0aENoaWxkcmVuKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuYWJsZSBmb3JjZVJldmFsaWRhdGlvbiBvcHRpb24gc28gdGhhdCBhbnkgY2hhbmdlIGluIGNoaWxkcmVuIHdpbGwgdHJpZ2dlciBwYXJlbnQncyByZXZhbGlkYXRpb24uCiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5pdGVtcyAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgICAgICJmb3JjZVJldmFsaWRhdGlvbiIgOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLmRhdGEpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCIiID09IHRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRvIGJlIGEgc2VyaWFsaXplZCBhcnJheSBvciBvYmplY3QsIGNvbnZlcnQKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRKU09OID0gQWxwYWNhLnBhcnNlSlNPTih0aGlzLmRhdGEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0FycmF5KHBhcnNlZEpTT04pICYmICFBbHBhY2EuaXNPYmplY3QocGFyc2VkSlNPTikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nV2FybigiQXJyYXlGaWVsZCBwYXJzZWQgc3RyaW5nIGRhdGEgYnV0IGl0IHdhcyBub3QgYW4gYXJyYXk6ICIgKyB0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBwYXJzZWRKU09OOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGp1c3QgYSBzdHJpbmcgdmFsdWUsIHB1dCBpbnRvIGFycmF5CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3RoaXMuZGF0YV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQWxwYWNhLmlzQXJyYXkodGhpcy5kYXRhKSAmJiAhQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5sb2dXYXJuKCJBcnJheUZpZWxkIGRhdGEgaXMgbm90IGFuIGFycmF5OiAiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAiICAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEFDVElPTlMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGFwcGx5QWN0aW9uID0gZnVuY3Rpb24oYWN0aW9ucywga2V5LCBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oYWN0aW9ucywga2V5KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29yZSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhY3Rpb25Db25maWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbltrXSkgewogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25ba10gPSBhY3Rpb25Db25maWdba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY2xlYW51cEFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zLCBzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICBkbyB7CgogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFjdGlvbnNbaV0uZW5hYmxlZCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGxhYmVsIGlmIGdsb2JhbCBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93TGFiZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3Rpb25zW2ldLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25zW2ldLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9IHdoaWxlIChpIDwgYWN0aW9ucy5sZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vIHNvcnQgc28gdGhhdCBjb3JlIGFjdGlvbnMgYXBwZWFyIGZpcnN0CiAgICAgICAgICAgICAgICBhY3Rpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICAgICAgICAgIGlmIChhLmNvcmUgJiYgIWIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghYS5jb3JlICYmIGIuY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0IGFjdGlvbnMgZm9yIHRoZSB0b3AgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnRvb2xiYXIgPSB7fTsKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYub3B0aW9ucy50b29sYmFyKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sYmFyW2tdID0gQWxwYWNhLmNvcHlPZihzZWxmLm9wdGlvbnMudG9vbGJhcltrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLnRvb2xiYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXIuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLnRvb2xiYXIuYWN0aW9ucykgewogICAgICAgICAgICAgICAgc2VsZi50b29sYmFyLmFjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLnRvb2xiYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkSXRlbUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImFkZCIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJhZGRJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVRvb2xCYXJBZGRJdGVtQ2xpY2soZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhbnVwQWN0aW9ucyhzZWxmLnRvb2xiYXIuYWN0aW9ucywgc2VsZi50b29sYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gYWRkIGludG8gdGhlIHBlci1pdGVtIGFjdGlvbmJhcgogICAgICAgICAgICBzZWxmLmFjdGlvbmJhciA9IHt9OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjdGlvbmJhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgazIgaW4gc2VsZi5vcHRpb25zLmFjdGlvbmJhcikgewogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uYmFyW2syXSA9IEFscGFjYS5jb3B5T2Yoc2VsZi5vcHRpb25zLmFjdGlvbmJhcltrMl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5hY3Rpb25iYXIuc2hvd0xhYmVscykgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5zaG93TGFiZWxzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLmFjdGlvbmJhci5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbmJhci5hY3Rpb25zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwbHlBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgImFkZCIsIHsKICAgICAgICAgICAgICAgICJsYWJlbCI6IHNlbGYuZ2V0TWVzc2FnZSgiYWRkQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiYWRkIiwKICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiBzZWxmLnZpZXcuZ2V0U3R5bGUoImFkZEljb24iKSwKICAgICAgICAgICAgICAgICJjbGljayI6IGZ1bmN0aW9uKGtleSwgYWN0aW9uLCBpdGVtSW5kZXgpIHsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVBY3Rpb25CYXJBZGRJdGVtQ2xpY2soaXRlbUluZGV4LCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJyZW1vdmUiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInJlbW92ZUJ1dHRvbkxhYmVsIiksCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJyZW1vdmVJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhcHBseUFjdGlvbihzZWxmLmFjdGlvbmJhci5hY3Rpb25zLCAidXAiLCB7CiAgICAgICAgICAgICAgICAibGFiZWwiOiBzZWxmLmdldE1lc3NhZ2UoInVwQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidXAiLAogICAgICAgICAgICAgICAgImljb25DbGFzcyI6IHNlbGYudmlldy5nZXRTdHlsZSgidXBJY29uIiksCiAgICAgICAgICAgICAgICAiY2xpY2siOiBmdW5jdGlvbihrZXksIGFjdGlvbiwgaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1VcENsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGFwcGx5QWN0aW9uKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsICJkb3duIiwgewogICAgICAgICAgICAgICAgImxhYmVsIjogc2VsZi5nZXRNZXNzYWdlKCJkb3duQnV0dG9uTGFiZWwiKSwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZG93biIsCiAgICAgICAgICAgICAgICAiaWNvbkNsYXNzIjogc2VsZi52aWV3LmdldFN0eWxlKCJkb3duSWNvbiIpLAogICAgICAgICAgICAgICAgImNsaWNrIjogZnVuY3Rpb24oa2V5LCBhY3Rpb24sIGl0ZW1JbmRleCkgewoKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUFjdGlvbkJhck1vdmVJdGVtRG93bkNsaWNrKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsZWFudXBBY3Rpb25zKHNlbGYuYWN0aW9uYmFyLmFjdGlvbnMsIHNlbGYuYWN0aW9uYmFyLnNob3dMYWJlbHMpOwoKICAgICAgICAgICAgdmFyIGxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBkYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gbGVuOwoKICAgICAgICAgICAgdGhpcy5kYXRhID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUGlja3MgYXBhcnQgdGhlIGFycmF5IGFuZCBzZXQgb250byBjaGlsZCBmaWVsZHMuCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhQWxwYWNhLmlzQXJyYXkoZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGZpZWxkcwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRmllbGQgPSBzZWxmLmNoaWxkcmVuW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWVsZC5zZXRWYWx1ZShkYXRhW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpIDwgc2VsZi5jaGlsZHJlbi5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBleGlzdGluZyBjaGlsZCBlbGVtZW50cwogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgZmllbGRzCiAgICAgICAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1TY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubG9nRGVidWcoIlVuYWJsZSB0byByZXNvbHZlIHNjaGVtYSBmb3IgaXRlbTogIiArIGkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgZGF0YS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IChmdW5jdGlvbihpLCBkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGksIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBkYXRhW2ldLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKGksIGRhdGEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MucHVzaChmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmdW5jcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGVtcHR5IGFuZCB3ZSdyZSBhbHNvIG5vdCByZXF1aXJlZCwgdGhlbiB3ZSBoYW5kIGJhY2sgZW1wdHkgc2V0CiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb25zdHJ1Y3QgYW4gYXJyYXkgYW5kIGhhbmQgaXQgYmFjawogICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKHYgIT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICB2ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG8ucHVzaCh2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSAmJiBzZWxmLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsSXRlbUNvdW50ID0gc2VsZi5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBpdGVtc0J5SW5kZXggPSB7fTsKCiAgICAgICAgICAgICAgICAvLyBhbGwgaXRlbXMgd2l0aGluIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIHNjaGVtYSBhbmQgb3B0aW9ucwogICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBuZWVkIHRvIGxvYWQgdGhpcyBvbmNlCiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVJdGVtU2NoZW1hT3B0aW9ucyhmdW5jdGlvbihpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgY2lyY3VsYXIpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyB3YXRlcmZhbGwgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlbGYuZGF0YS5sZW5ndGg7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmRhdGFbaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBmID0gKGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0J5SW5kZXhbaW5kZXhdID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkoaW5kZXgsIHZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2gocGYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKGZ1bmNzLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgaW50ZW5kZWQgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEl0ZW1Db3VudDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zQnlJbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgY3JlYXRlSXRlbS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBpbmRleAogICAgICAgICAqIEBwYXJhbSBpdGVtU2NoZW1hCiAgICAgICAgICogQHBhcmFtIGl0ZW1PcHRpb25zCiAgICAgICAgICogQHBhcmFtIGl0ZW1EYXRhCiAgICAgICAgICogQHBhcmFtIHBvc3RSZW5kZXJDYWxsYmFjawogICAgICAgICAqIEByZXR1cm4geyp9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGl0ZW1EYXRhLCBwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkKCI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgZm9ybUVsLmFscGFjYSh7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBpdGVtT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAic2NoZW1hIiA6IGl0ZW1TY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgICAgICJjb25uZWN0b3IiOiB0aGlzLmNvbm5lY3RvciwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBmdW5jdGlvbihlcnIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JDYWxsYmFjay5jYWxsKHNlbGYsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibm90VG9wTGV2ZWwiOnRydWUsCiAgICAgICAgICAgICAgICAgICAgInJlbmRlciI6IGZ1bmN0aW9uKGZpZWxkQ29udHJvbCwgY2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBpdGVtIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb250cm9sLnBhdGggPSBzZWxmLnBhdGggKyAiWyIgKyBpbmRleCArICJdIjsKICAgICAgICAgICAgICAgICAgICAgICAgLy9maWVsZENvbnRyb2wubmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucmVuZGVyKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicG9zdFJlbmRlciI6IGZ1bmN0aW9uKGNvbnRyb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJJdGVtRWwgPSBBbHBhY2EudG1wbChzZWxmLmNvbnRhaW5lckl0ZW1UZW1wbGF0ZURlc2NyaXB0b3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY29udHJvbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudEZpZWxkSWQiOiBzZWxmLmdldElkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCgkJCQkJCQkidG9vbGJhckxvY2F0aW9uIjogc2VsZi5vcHRpb25zLnRvb2xiYXJMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBpdGVtRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQ09OVEFJTkVSX0ZJRUxEX0lURU1fRklFTEQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGNvbnRhaW5lckl0ZW1FbCkuaGFzQ2xhc3MoQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvckNhbGxiYWNrLmNhbGwoc2VsZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogIkNhbm5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgZmllbGQ6ICIgKyBzZWxmLmdldElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5iZWZvcmUoY29udHJvbC5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnksIGFzIHBlcjogaHR0cHM6Ly9naXRodWIuY29tL2VtaXJjYWwvYWxwYWNhL2NvbW1pdC80MDYxYzMzNzg3YmQ3YTJiODZmYjYxMzMxNzM3NGQzNjVkOWFjYzkyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGhpZGVJbml0VmFsaWRhdGlvbkVycm9yIGFmdGVyIHJlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sLmhpZGVJbml0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFI6IGh0dHBzOi8vZ2l0aHViLmNvbS9naXRhbmEvYWxwYWNhL3B1bGwvMTI0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNGdW5jdGlvbihzZWxmLm9wdGlvbnMuaXRlbXMucG9zdFJlbmRlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5pdGVtcy5wb3N0UmVuZGVyLmNhbGwoY29udHJvbCwgaW5zZXJ0aW9uUG9pbnRFbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UmVuZGVyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgc2NoZW1hIGFuZCBvcHRpb25zIHRvIHV0aWxpemUgZm9yIGl0ZW1zIHdpdGhpbiB0aGlzIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB2YXIgY29tcGxldGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXZlYXQ6ICBpZiB3ZSdyZSBpbiByZWFkLW9ubHkgbW9kZSwgdGhlIGNoaWxkIG11c3QgYWxzbyBiZSBpbiByZWFkLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVhZG9ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1PcHRpb25zLnJlYWRvbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNvbHZlZEl0ZW1TY2hlbWEsIHJlc29sdmVkSXRlbU9wdGlvbnMsIGNpcmN1bGFyKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpdGVtT3B0aW9uczsKICAgICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIG9wdGlvbnMuZmllbGRzLml0ZW0KICAgICAgICAgICAgaWYgKCFpdGVtT3B0aW9ucyAmJiBfdGhpcy5vcHRpb25zICYmIF90aGlzLm9wdGlvbnMuZmllbGRzICYmIF90aGlzLm9wdGlvbnMuZmllbGRzLml0ZW0pIHsKICAgICAgICAgICAgICAgIGl0ZW1PcHRpb25zID0gX3RoaXMub3B0aW9ucy5maWVsZHMuaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWl0ZW1PcHRpb25zICYmIF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbU9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLml0ZW1zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpdGVtU2NoZW1hOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaXRlbVNjaGVtYSA9IF90aGlzLnNjaGVtYS5pdGVtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlICRyZWYKICAgICAgICAgICAgaWYgKGl0ZW1TY2hlbWEgJiYgaXRlbVNjaGVtYVsiJHJlZiJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NoZW1hUmVmZXJlbmNlSWQgPSBpdGVtU2NoZW1hWyIkcmVmIl07CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uc1JlZmVyZW5jZUlkID0gaXRlbVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKGl0ZW1PcHRpb25zWyIkcmVmIl0pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zUmVmZXJlbmNlSWQgPSBpdGVtT3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsSXRlbVNjaGVtYSA9IGl0ZW1TY2hlbWE7CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxJdGVtT3B0aW9ucyA9IGl0ZW1PcHRpb25zOwoKICAgICAgICAgICAgICAgIEFscGFjYS5sb2FkUmVmU2NoZW1hT3B0aW9ucyh0b3BGaWVsZCwgc2NoZW1hUmVmZXJlbmNlSWQsIG9wdGlvbnNSZWZlcmVuY2VJZCwgZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBzY2hlbWFSZWZlcmVuY2VJZCkgfHwgKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSAiIyIgKyBzY2hlbWFSZWZlcmVuY2VJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoZmllbGRDaGFpbltpXS5zY2hlbWFbIiRyZWYiXSA9PT0gc2NoZW1hUmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBhIGhpZ2hlciBsaW1pdCBmb3IgYXJyYXlzLCBwZXJoYXBzIDEwCiAgICAgICAgICAgICAgICAgICAgLy92YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2lyY3VsYXIgPSAocmVmQ291bnQgPiAxMCk7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1TY2hlbWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtU2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZEl0ZW1TY2hlbWEsIG9yaWdpbmFsSXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbVNjaGVtYSwgaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNvbHZlZEl0ZW1TY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZEl0ZW1PcHRpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSXRlbU9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkSXRlbU9wdGlvbnMsIG9yaWdpbmFsSXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbU9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRJdGVtT3B0aW9ucywgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocmVzb2x2ZWRJdGVtU2NoZW1hLCByZXNvbHZlZEl0ZW1PcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVVbmlxdWVJdGVtcygpOwogICAgICAgICAgICB2YWxJbmZvWyJ2YWx1ZU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgidmFsdWVOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuX3ZhbGlkYXRlTWF4SXRlbXMoKTsKICAgICAgICAgICAgdmFsSW5mb1sidG9vTWFueUl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55SXRlbXMiKSwgW3RoaXMuc2NoZW1hLm1heEl0ZW1zXSksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZU1pbkl0ZW1zKCk7CiAgICAgICAgICAgIHZhbEluZm9bIm5vdEVub3VnaEl0ZW1zIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJub3RFbm91Z2hJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluSXRlbXNdKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzICYmIHZhbEluZm9bInZhbHVlTm90VW5pcXVlIl1bInN0YXR1cyJdICYmIHZhbEluZm9bInRvb01hbnlJdGVtcyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJub3RFbm91Z2hJdGVtcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCB0byBtYXhJdGVtcwogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUVxdWFsTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPj0gdGhpcy5zY2hlbWEubWF4SXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiByZWFjaGVkIHRvIG1pbkl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRXF1YWxNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8PSB0aGlzLnNjaGVtYS5taW5JdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBudW1iZXIgb2YgaXRlbXMgaGFzIGJlZW4gbGVzcyB0aGFuIG1pbkl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBsZXNzIHRoYW4gbWluSXRlbXMKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNaW5JdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLm1pbkl0ZW1zICYmIHRoaXMuc2NoZW1hLm1pbkl0ZW1zID49IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNpemUoKSA8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIG51bWJlciBvZiBpdGVtcyBoYXMgYmVlbiBvdmVyIG1heEl0ZW1zCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4SXRlbXM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5tYXhJdGVtcyAmJiB0aGlzLnNjaGVtYS5tYXhJdGVtcyA+PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPiB0aGlzLnNjaGVtYS5tYXhJdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHVuaXF1ZS4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVVbmlxdWVJdGVtczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLml0ZW1zICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hba2V5XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGZpbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbnNBcnJheSwgYWN0aW9uS2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFjdGlvbiA9IG51bGw7CgogICAgICAgICAgICAkLmVhY2goYWN0aW9uc0FycmF5LCBmdW5jdGlvbihpLCB2KSB7CiAgICAgICAgICAgICAgICBpZiAodi5hY3Rpb24gPT09IGFjdGlvbktleSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gYWN0aW9uOwogICAgICAgIH0sCgogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgIGFmdGVyQXBwbHlDcmVhdGVkSXRlbXM6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vICBpZiB0aGVyZSBhcmUgemVybyBjaGlsZHJlbiwgc2hvdyB0aGUgYXJyYXkgdG9vbGJhcgogICAgICAgICAgICBzZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCiAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAT1ZFUlJJREUKICAgICAgICAgKgogICAgICAgICAqIEFkanVzdCB0aGUgcGF0aCBhbmQgbmFtZSBhaGVhZCBvZiByZWZyZXNoaW5nIHRoZSBET00uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NRWxlbWVudDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQYXRoQW5kTmFtZSgpOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2V0cyBpbnZva2VkIGFmdGVyIGl0ZW1zIGFyZSBkeW5hbWljYWxseSBhZGRlZCwgcmVtb3ZlZCBvciBtb3ZlZCBhcm91bmQgaW4gdGhlIGNoaWxkIGNoYWluLgogICAgICAgICAqIEl0IGFkanVzdHMgY2xhc3NlcyBvbiBjaGlsZCBET00gZWxlbWVudHMgdG8gbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQYXRoQW5kTmFtZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHVwZGF0ZUNoaWxkcmVuUGF0aEFuZE5hbWUgPSBmdW5jdGlvbihwYXJlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5wcmVQYXRoICYmIEFscGFjYS5zdGFydHNXaXRoKHYucGF0aCwgcGFyZW50LnByZVBhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGgucmVwbGFjZShwYXJlbnQucHJlUGF0aCwgcGFyZW50LnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnByZU5hbWUgJiYgQWxwYWNhLnN0YXJ0c1dpdGgodi5uYW1lLCBwYXJlbnQucHJlTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHJlTmFtZSA9IHYubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IHYubmFtZS5yZXBsYWNlKHBhcmVudC5wcmVOYW1lLCBwYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5maWVsZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdi5wYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTZWdtZW50ID0gdi5wYXRoLnN1YnN0cmluZyhpZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2VnbWVudC5pbmRleE9mKCJbIikgPiAwICYmIGxhc3RTZWdtZW50LmluZGV4T2YoIl0iKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBwYXJzZUludChsYXN0U2VnbWVudC5zdWJzdHJpbmcobGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpICsgMSwgbGFzdFNlZ21lbnQuaW5kZXhPZigiXSIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9PSBpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVQYXRoID0gdi5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB2LnBhdGggPSB2LnBhdGguc3Vic3RyaW5nKDAsIGlkeCkgKyAiLyIgKyBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnQuaW5kZXhPZigiWyIpKSArICJbIiArIGkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbmFtZQogICAgICAgICAgICAgICAgICAgIGlmICh2Lm5hbWVDYWxjdWxhdGVkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdi5wcmVOYW1lID0gdi5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYucGFyZW50ICYmIHYucGFyZW50Lm5hbWUgJiYgdi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWUgPSB2LnBhcmVudC5uYW1lICsgIl8iICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gdi5wYXRoLnJlcGxhY2UoL1wvL2csICIiKS5yZXBsYWNlKC9cWy9nLCAiXyIpLnJlcGxhY2UoL1xdL2csICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Lm9wdGlvbnMucnVieXJhaWxzICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh2LmZpZWxkKS5hdHRyKCJuYW1lIiwgdi5wYXJlbnQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHYuZmllbGQpLmF0dHIoIm5hbWUiLCB2Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF2LnByZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2LnByZVBhdGggPSB2LnBhdGg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlblBhdGhBbmROYW1lKHYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdGF0dXMgb2YgYXJyYXkgaXRlbSBhY3Rpb24gdG9vbGJhciBidXR0b25zLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVRvb2xiYXJzOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBkaXNwbGF5IG1vZGUsIHdlIGRvIG5vdCBkbyB0aGlzCiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcudHlwZSA9PT0gImRpc3BsYXkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHJlYWRvbmx5IG1vZGUsIGRvbid0IGRvIHRoaXMKICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnJlYWRvbmx5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgdG9vbGJhcgogICAgICAgICAgICBpZiAoc2VsZi50b29sYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlUb29sYmFyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpcmUgY2FsbGJhY2tzIHRvIHZpZXcgdG8gcmVtb3ZlIGFuZCBjcmVhdGUgYW4gYWN0aW9uYmFyIGZvciBlYWNoIGl0ZW0KICAgICAgICAgICAgaWYgKHNlbGYuYWN0aW9uYmFyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiYXJyYXlBY3Rpb25iYXJzIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRPT0xCQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIHZhciB0b29sYmFyRWwgPSAkKHRoaXMuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHNlbGYub3B0aW9ucy5oaWRlVG9vbGJhcldpdGhDaGlsZHJlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaGlkZSB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc2hvdyB0b29sYmFyCiAgICAgICAgICAgICAgICAkKHRvb2xiYXJFbCkuc2hvdygpOwoKICAgICAgICAgICAgICAgIC8vIENMSUNLOiBhcnJheSB0b29sYmFyIGJ1dHRvbnMKICAgICAgICAgICAgICAgICQodG9vbGJhckVsKS5maW5kKCJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gc2VsZi5maW5kQWN0aW9uKHNlbGYudG9vbGJhci5hY3Rpb25zLCBhY3Rpb25LZXkpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLm9mZigpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jbGljay5jYWxsKHNlbGYsIGFjdGlvbktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBQ1RJT05CQVIKICAgICAgICAgICAgLy8KCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgInN0aWNreSIgdG9vbGJhciwgdGhlbiBzaG93IGFuZCBoaWRlIHRoZSBpdGVtIGFjdGlvbiBidXR0b25zIHdoZW4gaG92ZXJlZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIgfHwgdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kgPT09IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBpdGVtCiAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEZpZWxkRWwoKS5maW5kKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICAiJ10iKTsKICAgICAgICAgICAgICAgICQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFjdGlvbmJhciBmb3IgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBmcm9tIGNvbnRhaW5lckl0ZW1FbAogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25iYXJFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAgIiddW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgaXRlbUluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbmJhckVsICYmIGFjdGlvbmJhckVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhvdmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhY3Rpb25iYXJFbCkuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWN0aW9uYmFyRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKGFjdGlvbmJhckVsKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBzaG93IHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5vcHRpb25zLnRvb2xiYXJTdGlja3kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoaWRlIHRoZSBhY3Rpb25iYXJzCiAgICAgICAgICAgICAgICAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LWFjdGlvbmJhcltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItcGFyZW50LWZpZWxkLWlkPSciICsgc2VsZi5nZXRJZCgpICsgICInXSIpLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ0xJQ0s6IGFjdGlvbmJhciBidXR0b25zCiAgICAgICAgICAgIC8vIE5PVEU6IGFjdGlvbmJhckVscyBzaXplIHNob3VsZCBiZSAwIG9yIDEKICAgICAgICAgICAgdmFyIGFjdGlvbmJhckVscyA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1wYXJlbnQtZmllbGQtaWQ9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgJChhY3Rpb25iYXJFbHMpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gJCh0aGlzKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gcGFyc2VJbnQodGFyZ2V0SW5kZXgsIDEwKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBiaW5kIGJ1dHRvbiBjbGljayBoYW5kbGVycwogICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb25dIikuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbktleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBzZWxmLmZpbmRBY3Rpb24oc2VsZi5hY3Rpb25iYXIuYWN0aW9ucywgYWN0aW9uS2V5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5vZmYoKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2xpY2suY2FsbChzZWxmLCBhY3Rpb25LZXksIGFjdGlvbiwgdGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhdCBtYXggY2FwYWNpdHksIGRpc2FibGUgImFkZCIgYnV0dG9ucwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3ZhbGlkYXRlRXF1YWxNYXhJdGVtcygpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS10b29sYmFyLWFjdGlvbj0nYWRkJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J2FkZCddIikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhbHBhY2EtYnV0dG9uLWRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKCJkaXNhYmxlQnV0dG9uIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYXQgbWluIGNhcGFjaXR5LCBkaXNhYmxlICJyZW1vdmUiIGJ1dHRvbnMKICAgICAgICAgICAgICAgIGlmIChzZWxmLl92YWxpZGF0ZUVxdWFsTWluSXRlbXMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWFjdGlvbj0ncmVtb3ZlJ10iKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FscGFjYS1idXR0b24tZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImVuYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdyZW1vdmUnXSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygiZGlzYWJsZUJ1dHRvbiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gZmlyc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgdXAiIGJ1dHRvbiBkaXNhYmxlZAogICAgICAgICAgICAkKGFjdGlvbmJhckVscykuZmlyc3QoKS5jaGlsZHJlbigiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb249J3VwJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGxhc3QgYWN0aW9uYmFyIGhhcyBpdHMgIm1vdmUgZG93biIgYnV0dG9uIGRpc2FibGVkCiAgICAgICAgICAgICQoYWN0aW9uYmFyRWxzKS5sYXN0KCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItYWN0aW9uPSdkb3duJ10iKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWxwYWNhLWJ1dHRvbi1kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soImRpc2FibGVCdXR0b24iLCB0aGlzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVUb29sQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZUl0ZW1TY2hlbWFPcHRpb25zKGZ1bmN0aW9uKGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBmb3Igc2NoZW1hOiAiICsgSlNPTi5zdHJpbmdpZnkoaXRlbVNjaGVtYSksIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSBjdXJyZW50bHk/CiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBzZWxmLmNoaWxkcmVuLmxlbmd0aDsKCiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBBbHBhY2EuY3JlYXRlRW1wdHlEYXRhSW5zdGFuY2UoaXRlbVNjaGVtYSk7CiAgICAgICAgICAgICAgICBzZWxmLmFkZEl0ZW0oaW5zZXJ0aW9uUG9pbnQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyQWRkSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbVNjaGVtYU9wdGlvbnMoZnVuY3Rpb24oaXRlbVNjaGVtYSwgaXRlbU9wdGlvbnMsIGNpcmN1bGFyKSB7CgogICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBhZGRpdGlvbiBpZiB0aGUgcmVzb2x2ZWQgc2NoZW1hIGlzbid0IGNpcmN1bGFybHkgcmVmZXJlbmNlZAogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHNjaGVtYSBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShpdGVtU2NoZW1hKSwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlWYWx1ZXMgPSBzZWxmLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW1EYXRhID0gQWxwYWNhLmNyZWF0ZUVtcHR5RGF0YUluc3RhbmNlKGl0ZW1TY2hlbWEpOwogICAgICAgICAgICAgICAgc2VsZi5hZGRJdGVtKGl0ZW1JbmRleCArIDEsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgZnVuY3Rpb24oaXRlbSkgewoKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdW5kZXJseWluZyBmaWVsZHMgcmVxdWlyZSB0aGVpciBkYXRhIHRvIGJlIHJlc2V0CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBkaXNwbGF5IHRvIHdvcmsgb3V0IHByb3Blcmx5IChyYWRpbyBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXMuc3BsaWNlKGl0ZW1JbmRleCArIDEsIDAsIGl0ZW0uZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZShhcnJheVZhbHVlcyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyUmVtb3ZlSXRlbUNsaWNrOiBmdW5jdGlvbihpdGVtSW5kZXgsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5yZW1vdmVJdGVtKGl0ZW1JbmRleCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVBY3Rpb25CYXJNb3ZlSXRlbVVwQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4IC0gMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGFuZGxlQWN0aW9uQmFyTW92ZUl0ZW1Eb3duQ2xpY2s6IGZ1bmN0aW9uKGl0ZW1JbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLnN3YXBJdGVtKGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgMSwgc2VsZi5vcHRpb25zLmFuaW1hdGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgYWRkSXRlbUNvbnRhaW5lciA9IHNlbGYuZG9SZXNvbHZlSXRlbUNvbnRhaW5lcigpOwoKICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZG9tCiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGZpcnN0IGludG8gY29udGFpbmVyCiAgICAgICAgICAgICAgICAkKGFkZEl0ZW1Db250YWluZXIpLmFwcGVuZChpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgYSBzcGVjaWZpYyBpbmRleAogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGFkZEl0ZW1Db250YWluZXIuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIChpbmRleC0xKSArICInXSIpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0VsZW1lbnQuYWZ0ZXIoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmLmRvQWZ0ZXJBZGRJdGVtKGl0ZW0sIGZ1bmN0aW9uKGVycikgewoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVhZHkKICAgICAgICAgICAgICAgIEFscGFjYS5maXJlUmVhZHkoaXRlbSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZnRlckFkZEl0ZW06IGZ1bmN0aW9uKGl0ZW0sIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBmcm9tIHRoZSB0b29sYmFyIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuICBUaGUgbWV0aG9kIGNhbiBhbHNvCiAgICAgICAgICogYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gaW5zZXJ0IGl0ZW1zIG9uIHRoZSBmbHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHRoZSBqc29uIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBqc29uIG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGluc2VydGVkIGl0ZW0KICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkCiAgICAgICAgICovCiAgICAgICAgYWRkSXRlbTogZnVuY3Rpb24oaW5kZXgsIHNjaGVtYSwgb3B0aW9ucywgZGF0YSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdGVFcXVhbE1heEl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlSXRlbShpbmRleCwgc2NoZW1hLCBvcHRpb25zLCBkYXRhLCBmdW5jdGlvbihpdGVtKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBjaGlsZAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChpdGVtLCBpbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBpdGVtLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgZG9tIG1hcmtlcnMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYW55IHNpYmxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlVG9vbGJhcnMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJhZGQiLCBpdGVtKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlclVwZGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciByZW1vdmVJdGVtQ29udGFpbmVyID0gc2VsZi5kb1Jlc29sdmVJdGVtQ29udGFpbmVyKCk7CgogICAgICAgICAgICByZW1vdmVJdGVtQ29udGFpbmVyLmNoaWxkcmVuKCIuYWxwYWNhLWNvbnRhaW5lci1pdGVtW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLWluZGV4PSciICsgY2hpbGRJbmRleCArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgc2VsZi5kb0FmdGVyUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gc2V0VmFsdWUoKSB3aGVuIHRoZSBudW1iZXIgb2YgaXRlbXMgYmVpbmcgc2V0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCiAgICAgICAgICogb2YgZmllbGQgZWxlbWVudHMuCgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjaGlsZEluZGV4IGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSByZW1vdmVkCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyByZW1vdmVkCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oY2hpbGRJbmRleCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGVFcXVhbE1pbkl0ZW1zKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGNoaWxkCiAgICAgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXJDaGlsZChjaGlsZEluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaXRlbUNvbnRhaW5lckVsIGZyb20gRE9NCiAgICAgICAgICAgICAgICBzZWxmLmRvUmVtb3ZlSXRlbShjaGlsZEluZGV4LCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgaXRlbSB0b29sYmFyIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVUb29sYmFycygpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IHJlbW92ZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigicmVtb3ZlIiwgY2hpbGRJbmRleCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3IgbW92aW5nIGFuIGl0ZW0gaW4gdGhlIGFycmF5IHRvIGEgbmV3IGluZGV4LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNvdXJjZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgbW92ZWQKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gdGFyZ2V0SW5kZXggdGhlIGluZGV4IHRvIGJlIG1vdmVkIHRvCiAgICAgICAgICogQHBhcmFtIFtCb29sZWFuXSBhbmltYXRlIHdoZXRoZXIgdG8gYW5pbWF0ZQogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb25dIGNhbGxiYWNrIGNhbGxlZCBhZnRlciB0aGUgY2hpbGQgaXMgYWRkZWQgYW5kIHJlZnJlc2ggb2NjdXJzCiAgICAgICAgICovCiAgICAgICAgbW92ZUl0ZW06IGZ1bmN0aW9uKHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCwgYW5pbWF0ZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodHlwZW9mKGFuaW1hdGUpID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gYW5pbWF0ZTsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYW5pbWF0ZSA9IHNlbGYub3B0aW9ucy5hbmltYXRlID8gc2VsZi5vcHRpb25zLmFuaW1hdGUgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNvdXJjZUluZGV4KSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4ID0gcGFyc2VJbnQoc291cmNlSW5kZXgsIDEwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0YXJnZXRJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHBhcnNlSW50KHRhcmdldEluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gc2VsZi5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gc2VsZi5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyB0YXJnZXQgaW5kZXgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGFyZ2V0Q2hpbGQgPSBzZWxmLmNoaWxkcmVuW3RhcmdldEluZGV4XTsKICAgICAgICAgICAgaWYgKCF0YXJnZXRDaGlsZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGNoaWxkIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkVGFyZ2V0SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNwbGljZSBvdXQgY2hpbGQKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHNlbGYuY2hpbGRyZW4uc3BsaWNlKHNvdXJjZUluZGV4LCAxKVswXTsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YSBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggZXZlbnQ6IG1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoIm1vdmUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAwOwogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWVsZElkID0gc2VsZi5nZXRJZCgpOwoKICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBET00gZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuZmluZCgiLmFscGFjYS1jb250YWluZXItaXRlbVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIHRhcmdldEluZGV4ICsgIiddW2RhdGEtYWxwYWNhLWNvbnRhaW5lci1pdGVtLXBhcmVudC1maWVsZC1pZD0nIiArIHBhcmVudEZpZWxkSWQgKyAiJ10iKTsKCiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdHdvIHRlbXAgZWxlbWVudHMgYXMgbWFya2VycyBmb3Igc3dpdGNoCiAgICAgICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5iZWZvcmUodGVtcFNvdXJjZU1hcmtlcik7CiAgICAgICAgICAgICAgICB2YXIgdGVtcFRhcmdldE1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIyJz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICAgICAgLy8gbW92ZXMgZGl2IHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRNb3ZlKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCBkdXJhdGlvbiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV29ya2hvcnNlIG1ldGhvZCBmb3Igc3dhcHBpbmcgYW4gaXRlbSBmcm9tIG9uZSBpbmRleCBpbiB0aGUgYXJyYXkgdG8gYW5vdGhlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzb3VyY2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIG1vdmVkCiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHRhcmdldEluZGV4IHRoZSBpbmRleCB0byBiZSBtb3ZlZCB0bwogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUKICAgICAgICAgKiBAcGFyYW0gW0Z1bmN0aW9uXSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgdGhlIGNoaWxkIGlzIGFkZGVkIGFuZCByZWZyZXNoIG9jY3VycwogICAgICAgICAqLwogICAgICAgIHN3YXBJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gdGFyZ2V0IGluZGV4CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdGFyZ2V0SW5kZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDaGlsZCA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzb3VyY2VJbmRleF0gPSB0YXJnZXRDaGlsZDsKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdID0gc291cmNlQ2hpbGQ7CgogICAgICAgICAgICAgICAgLy8gY29weSBiYWNrIGRhdGEgYW5kIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBtb3ZlCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gNTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RmllbGRJZCA9IHNlbGYuZ2V0SWQoKTsKCiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGFuZCB0YXJnZXQgRE9NIGVsZW1lbnRzCiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmZpbmQoIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXVtkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1wYXJlbnQtZmllbGQtaWQ9JyIgKyBwYXJlbnRGaWVsZElkICsgIiddIik7CgogICAgICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICAgICAgdmFyIHRlbXBTb3VyY2VNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMSc+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYmVmb3JlKHRlbXBTb3VyY2VNYXJrZXIpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIuYmVmb3JlKHRlbXBUYXJnZXRNYXJrZXIpOwoKICAgICAgICAgICAgICAgIC8vIHN3YXAgZGl2cyB2aXN1YWxseQogICAgICAgICAgICAgICAgQWxwYWNhLmFuaW1hdGVkU3dhcChzb3VyY2VDb250YWluZXIsIHRhcmdldENvbnRhaW5lciwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhcnJheSI7CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBcnJheSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGxpc3Qgb2YgaXRlbXMgd2l0aCBzYW1lIGRhdGEgdHlwZSBvciBzdHJ1Y3R1cmUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFycmF5IEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgYXJyYXkgaXRlbXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSBJdGVtcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIG51bWJlciBvZiBpdGVtcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIEl0ZW1zIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkl0ZW1zIFVuaXF1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJdGVtIHZhbHVlcyBzaG91bGQgYmUgdW5pcXVlIGlmIHRydWUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7CiAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2UocHJvcGVydGllcy5wcm9wZXJ0aWVzLml0ZW1zLnByb3BlcnRpZXMsIHRoaXMuY2hpbGRyZW5bMF0uZ2V0U2NoZW1hT2ZTY2hlbWEoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heEl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0aWNreSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0aWNreSBUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBhcnJheSBpdGVtIHRvb2xiYXIgd2lsbCBhbHdheXMgYmUgZW5hYmxlZC4gIElmIGZhbHNlLCB0aGUgdG9vbGJhciBpcyBhbHdheXMgZGlzYWJsZWQuICBJZiB1bmRlZmluZWQgb3IgbnVsbCwgdGhlIHRvb2xiYXIgd2lsbCBhcHBlYXIgd2hlbiBob3ZlcmVkIG92ZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9vbGJhclN0eWxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiB0b3AtbGV2ZWwgdG9vbGJhciB0byByZW5kZXIgZm9yIHRoZSBhcnJheSBmaWVsZC4gIEVpdGhlciAnYnV0dG9uJyBvciAnbGluaycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYnV0dG9uIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJQb3NpdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRvb2xiYXIgUG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTG9jYXRpb24gb2YgdGhlIHRvcC1sZXZlbCB0b29sYmFyIHRvIHJlbmRlciBmb3IgdGhlIGFycmF5IGZpZWxkLiAgRWl0aGVyICd0b3AnIG9yICdib3R0b20nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXJTdHlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbmJhciBTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUga2luZCBvZiBhY3Rpb25iYXIgdG8gcmVuZGVyIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiAgRWl0aGVyICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCBvciAncmlnaHQnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogInRvcCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBDb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvd0xhYmVscyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyBsYWJlbHMgbmV4dCB0byBhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVG9vbGJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25iYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3dMYWJlbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV2hldGhlciB0byBzaG93IGxhYmVscyBuZXh0IHRvIGFjdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb25zIEJhciBBY3Rpb25zIENvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWN0aW9uIEtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBY3Rpb24gTGFiZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpY29uQ2xhc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDU1MgQ2xhc3NlcyBmb3IgSWNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWNrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZnVuY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFjdGlvbiBDbGljayBIYW5kbGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gZW5hYmxlIHRoZSBhY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoaWRlVG9vbGJhcldpdGhDaGlsZHJlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIaWRlIFRvb2xiYXIgd2l0aCBDaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmRpY2F0ZXMgd2hldGhlciB0byBoaWRlIHRoZSB0b3AgdG9vbGJhciB3aGVuIGNoaWxkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlblswXSkgewogICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHByb3BlcnRpZXMucHJvcGVydGllcy5pdGVtcy5wcm9wZXJ0aWVzLCB0aGlzLmNoaWxkcmVuWzBdLmdldFNjaGVtYU9mU2NoZW1hKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ0b29sYmFyU3RpY2t5IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyBpcyB7MH0iLAogICAgICAgICJ0b29NYW55SXRlbXMiOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGlzIHswfSIsCiAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIlZhbHVlcyBhcmUgbm90IHVuaXF1ZSIsCiAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gQXJyYXkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImFycmF5IiwgQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImFycmF5IiwgImFycmF5Iik7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQWRkIE5ldyBJdGVtIiwKICAgICAgICAiYWRkQnV0dG9uTGFiZWwiOiAiQWRkIiwKICAgICAgICAicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUmVtb3ZlIiwKICAgICAgICAidXBCdXR0b25MYWJlbCI6ICJVcCIsCiAgICAgICAgImRvd25CdXR0b25MYWJlbCI6ICJEb3duIgogICAgfSk7Cgp9KShqUXVlcnkpOwoKLypqc2hpbnQgLVcwMDQgKi8gLy8gZHVwbGljYXRlIHZhcmlhYmxlcwovKmpzaGludCAtVzA4MyAqLyAvLyBpbmxpbmUgZnVuY3Rpb25zIGFyZSB1c2VkIHNhZmVseQooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkID0gQWxwYWNhLkNvbnRhaW5lckZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm9iamVjdCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbVRlbXBsYXRlVHlwZSA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHNlbGYucmVzb2x2ZUNvbnRhaW5lckl0ZW1UZW1wbGF0ZVR5cGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiVW5hYmxlIHRvIGZpbmQgdGVtcGxhdGUgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIGl0ZW06ICIgKyBzZWxmLmdldEZpZWxkVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldFRlbXBsYXRlRGVzY3JpcHRvcigiY29udGFpbmVyLSIgKyBjb250YWluZXJJdGVtVGVtcGxhdGVUeXBlICsgIi1pdGVtIiwgc2VsZik7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhID09PSAiIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdCh0aGlzLmRhdGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEFscGFjYS5wYXJzZUpTT04odGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ1dhcm4oIk9iamVjdEZpZWxkIHBhcnNlZCBkYXRhIGJ1dCBpdCB3YXMgbm90IGFuIG9iamVjdDogIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFBpY2tzIGFwYXJ0IHRoZSBkYXRhIG9iamVjdCBhbmQgc2V0IG9udG8gY2hpbGQgZmllbGRzLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24oZGF0YSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGRvbid0IGhhbmRsZSBpdAogICAgICAgICAgICBpZiAoIUFscGFjYS5pc09iamVjdChkYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzb3J0IGV4aXN0aW5nIGZpZWxkcyBieSBwcm9wZXJ0eSBpZAogICAgICAgICAgICB2YXIgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZmllbGRJZCBpbiB0aGlzLmNoaWxkcmVuQnlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SWQgPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbmV3IGRhdGEgbWFwcGVkIGJ5IHByb3BlcnR5IGlkCiAgICAgICAgICAgIHZhciBuZXdEYXRhQnlQcm9wZXJ0eUlkID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YUJ5UHJvcGVydHlJZFtrXSA9IGRhdGFba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBuZXcgcHJvcGVydHkgaWRzCiAgICAgICAgICAgIC8vIGlmIGEgZmllbGQgZXhpc3RzLCBzZXQgdmFsdWUgb250byBpdCBhbmQgcmVtb3ZlIGZyb20gbmV3RGF0YUJ5UHJvcGVydHlJZCBhbmQgZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWQKICAgICAgICAgICAgLy8gaWYgYSBmaWVsZCBkb2Vzbid0IGV4aXN0LCBsZXQgaXQgcmVtYWluIGluIGxpc3QKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXRhQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IGluIGV4aXN0aW5nRmllbGRzQnlQcm9wZXJ0eUlkIGRlc2NyaWJlcyBkYXRhIHRoYXQgaXMgbWlzc2luZywgbnVsbCBvciBlbXB0eQogICAgICAgICAgICAvLyB3ZSBudWxsIG91dCB0aG9zZSB2YWx1ZXMKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBleGlzdGluZ0ZpZWxkc0J5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZXhpc3RpbmdGaWVsZHNCeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYW55dGhpbmcgbGVmdCBpbiBuZXdEYXRhQnlQcm9wZXJ0eUlkIGlzIG5ldyBzdHVmZiB0aGF0IHdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgZmllbGQgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2luY2UgaXQgcnVucyBhZ2FpbnN0IGEgc2NoZW1hCiAgICAgICAgICAgIC8vIHNvIHdlIGRyb3AgdGhpcyBvZmYKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIGNoaWxkIGZpZWxkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldENvbnRhaW5lclZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGFpbmVyVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGFuZCB3ZSdyZSBub3QgcmVxdWlyZWQsIGhhbmQgYmFjayBlbXB0eSBvYmplY3QKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzUmVxdWlyZWQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmQgYmFjayBhbiBvYmplY3Qgd2l0aCBvdXIgY2hpbGQgcHJvcGVydGllcyBpbiBpdAogICAgICAgICAgICB2YXIgbyA9IHt9OwoKICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvYmplY3QKICAgICAgICAgICAgLy8gZm9yIGVhY2ggcHJvcGVydHksIHdlIGluc2VydCBpdCBpbnRvIGEgSlNPTiBvYmplY3QgdGhhdCB3ZSdsbCBoYW5kIGJhY2sgYXMgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHRoZW4gd2UgZXZhbHVhdGUgdGhvc2UgZGVwZW5kZW5jaWVzIGZpcnN0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICAgICAgICAgICAvLyByZXN1bHRpbmcgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIHZsYXVlCiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIHZhciBmaWVsZFZhbHVlID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmKGZpZWxkVmFsdWUgIT09IGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBOYU4KICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZmllbGRWYWx1ZSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluZUFsbERlcGVuZGVuY2llc1ZhbGlkKHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2lnbmVkVmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihmaWVsZFZhbHVlKSA9PT0gImJvb2xlYW4iKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gKGZpZWxkVmFsdWU/IHRydWU6IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShmaWVsZFZhbHVlKSB8fCBBbHBhY2EuaXNPYmplY3QoZmllbGRWYWx1ZSkgfHwgQWxwYWNhLmlzTnVtYmVyKGZpZWxkVmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFZhbHVlID0gZmllbGRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVmFsdWUgPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWduZWRWYWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1twcm9wZXJ0eUlkXSA9IGFzc2lnbmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgd2l6YXJkIGlmIHJlcXVlc3RlZAogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNUb3BMZXZlbCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZpZXcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpemFyZENvbmZpZ3MgPSBzZWxmLnZpZXcuZ2V0V2l6YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi53aXphcmRDb25maWdzKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLndpemFyZENvbmZpZ3MgfHwgc2VsZi53aXphcmRDb25maWdzID09PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2l6YXJkQ29uZmlncyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF5b3V0VGVtcGxhdGVEZXNjcmlwdG9yID0gc2VsZi52aWV3LmdldExheW91dCgpLnRlbXBsYXRlRGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYud2l6YXJkQ29uZmlncyAmJiBBbHBhY2EuaXNPYmplY3Qoc2VsZi53aXphcmRDb25maWdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRUZW1wbGF0ZURlc2NyaXB0b3IgfHwgc2VsZi53aXphcmRDb25maWdzLmJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB0aGUgYXV0b21hdGljIHdpemFyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXV0b1dpemFyZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbCB3aXphcmQgYmFzZWQgb24gbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aXphcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgc3ViLWl0ZW1zIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW1zOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdOwoKICAgICAgICAgICAgLy8gd2Uga2VlcCBhIG1hcCBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gb3VyIG9yaWdpbmFsIGRhdGEgb2JqZWN0CiAgICAgICAgICAgIC8vIGFzIHdlIHJlbmRlciBlbGVtZW50cyBvdXQgb2YgdGhlIHNjaGVtYSwgd2UgcmVtb3ZlIGZyb20gdGhlIGV4dHJhRGF0YVByb3BlcnRpZXMgbWFwCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGlzIGxlZnRvdmVyIGFyZSB0aGUgZGF0YSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBOT1QgcmVuZGVyZWQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHBhcnQKICAgICAgICAgICAgLy8gb2YgdGhlIHNjaGVtYQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBtYWludGFpbmVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvIGFzIHRvIGluZm9ybSB0aGUgZGV2ZWxvcGVyIG9mIG1pc21hdGNoZXMKICAgICAgICAgICAgdmFyIGV4dHJhRGF0YVByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgZGF0YUtleSBpbiBzZWxmLmRhdGEpIHsKICAgICAgICAgICAgICAgIGV4dHJhRGF0YVByb3BlcnRpZXNbZGF0YUtleV0gPSBkYXRhS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHNlbGYuZGF0YTsKICAgICAgICAgICAgaWYgKHNlbGYuc2NoZW1hICYmIHNlbGYuc2NoZW1hLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZWxmLnNjaGVtYS5wcm9wZXJ0aWVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2YgPSBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWEgYW5kIHRoZSBkYXRhIGxpbmUgdXAgcGVyZmVjdGx5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcHJvcGVydGllcyBpbiB0aGUgZGF0YSB0aGF0IGFyZQogICAgICAgICAgICAgICAgLy8gbm90IGFsc28gaW4gdGhlIHNjaGVtYSwgYW5kIHRodXMsIGV4dHJhRGF0YVByb3BlcnRpZXMgd2lsbCBiZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyBpbiBkYXRhIHRoYXQgd2VyZSBub3QgaW4gc2NoZW1hLCB0aGVuIHRoZXkgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVtYWluIGluIGV4dHJhRGF0YVByb3BlcnRpZXMgYW5kIHdlIGNhbiBpbmZvcm0gZGV2ZWxvcGVycyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUtleXMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGV4dHJhRGF0YUtleSBpbiBleHRyYURhdGFQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFEYXRhS2V5cy5wdXNoKGV4dHJhRGF0YUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXh0cmFEYXRhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJUaGVyZSB3ZXJlICIgKyBleHRyYURhdGFLZXlzLmxlbmd0aCArICIgZXh0cmEgZGF0YSBrZXlzIHRoYXQgd2VyZSBub3QgcGFydCBvZiB0aGUgc2NoZW1hICIgKyBKU09OLnN0cmluZ2lmeShleHRyYURhdGFLZXlzKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbXMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gZWFjaCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0IGNhbiBoYXZlIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQgb3B0aW9ucyBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGFsbCB0byBjb21wbGV0ZQoKICAgICAgICAgICAgdmFyIGl0ZW1zQnlQcm9wZXJ0eUlkID0ge307CgogICAgICAgICAgICAvLyB3cmFwIGludG8gd2F0ZXJmYWxsIGZ1bmN0aW9ucwogICAgICAgICAgICB2YXIgcHJvcGVydHlGdW5jdGlvbnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBwcm9wZXJ0aWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbURhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5SWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGEgPSBzZWxmLmRhdGFbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwZiA9IChmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtRGF0YSwgZXh0cmFEYXRhUHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oX2RvbmUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHRoaXMgaWYgd2UgaGF2ZSBkYXRhLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzb2x2ZVByb3BlcnR5U2NoZW1hT3B0aW9ucyhwcm9wZXJ0eUlkLCBmdW5jdGlvbiAoc2NoZW1hLCBvcHRpb25zLCBjaXJjdWxhcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgYWRkaXRpb24gaWYgdGhlIHJlc29sdmVkIHNjaGVtYSBpc24ndCBjaXJjdWxhcmx5IHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBzY2hlbWEgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzY2hlbWE6ICIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEpLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSBzY2hlbWEgZm9yIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIHNjaGVtYSwgb3B0aW9ucywgaXRlbURhdGEsIG51bGwsIGZ1bmN0aW9uIChhZGRlZEl0ZW1Db250cm9sKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdID0gYWRkZWRJdGVtQ29udHJvbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZXh0cmFEYXRhUHJvcGVydGllcyBoZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXh0cmFEYXRhUHJvcGVydGllc1twcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pKHByb3BlcnR5SWQsIGl0ZW1EYXRhLCBleHRyYURhdGFQcm9wZXJ0aWVzKTsKCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUZ1bmN0aW9ucy5wdXNoKHBmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWxwYWNhLnBhcmFsbGVsKHByb3BlcnR5RnVuY3Rpb25zLCBmdW5jdGlvbihlcnIpIHsKCiAgICAgICAgICAgICAgICAvLyBidWlsZCBpdGVtcyBhcnJheSBpbiBjb3JyZWN0IHByb3BlcnR5IG9yZGVyCiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUlkIGluIHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc0J5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICB2YXIgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbXNbaV0ub3B0aW9ucy5vcmRlcikgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09yZGVySW5mb3JtYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ydCBieSBvcmRlcj8KICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJCID0gYi5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmRlckEgLSBvcmRlckIpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNmKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gc3ViLWl0ZW0gZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogVGhlIHBvc3RSZW5kZXJDYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHVwb24gY29tcGxldGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUlkIENoaWxkIGZpZWxkIHByb3BlcnR5IElELgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtU2NoZW1hIHNjaGVtYQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9wdGlvbnMgQ2hpbGQgZmllbGQgb3B0aW9ucy4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gdmFsdWUgQ2hpbGQgZmllbGQgdmFsdWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5zZXJ0QWZ0ZXJJZCBMb2NhdGlvbiB3aGVyZSB0aGUgY2hpbGQgaXRlbSB3aWxsIGJlIGluc2VydGVkLgogICAgICAgICAqIEBwYXJhbSBbRnVuY3Rpb259IHBvc3RSZW5kZXJDYWxsYmFjayBjYWxsZWQgb25jZSB0aGUgaXRlbSBoYXMgYmVlbiBhZGRlZAogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgcG9zdFJlbmRlckNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZvcm1FbCA9ICQoIjxkaXY+PC9kaXY+Iik7CiAgICAgICAgICAgIGZvcm1FbC5hbHBhY2EoewogICAgICAgICAgICAgICAgImRhdGEiIDogaXRlbURhdGEsCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGl0ZW1PcHRpb25zLAogICAgICAgICAgICAgICAgInNjaGVtYSIgOiBpdGVtU2NoZW1hLAogICAgICAgICAgICAgICAgInZpZXciIDogdGhpcy52aWV3LmlkID8gdGhpcy52aWV3LmlkIDogdGhpcy52aWV3LAogICAgICAgICAgICAgICAgImNvbm5lY3RvciI6IHRoaXMuY29ubmVjdG9yLAogICAgICAgICAgICAgICAgImVycm9yIjogZnVuY3Rpb24oZXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCBlcnIpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RUb3BMZXZlbCI6dHJ1ZSwKICAgICAgICAgICAgICAgICJyZW5kZXIiIDogZnVuY3Rpb24oZmllbGRDb250cm9sLCBjYikgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXJlbnQgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJvcGVydHkgSWQKICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucHJvcGVydHlJZCA9IHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgaXRlbSBwYXRoCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGF0aCAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5wYXRoID0gc2VsZi5wYXRoICsgIi8iICsgcHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvbnRyb2wucGF0aCA9IHNlbGYucGF0aCArIHByb3BlcnR5SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5yZW5kZXIobnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBhbHBhY2EgZmluaXNoZWQKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBvdXRlciBjb250YWluZXIKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySXRlbUVsID0gQWxwYWNhLnRtcGwoc2VsZi5jb250YWluZXJJdGVtVGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjb250cm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRGaWVsZElkIjogc2VsZi5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aWV3Ijogc2VsZi52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGl0ZW1EYXRhCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJChjb250YWluZXJJdGVtRWwpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19DT05UQUlORVJfRklFTERfSVRFTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvblBvaW50RWwubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoY29udGFpbmVySXRlbUVsKS5oYXNDbGFzcyhBbHBhY2EuTUFSS0VSX0NMQVNTX0NPTlRBSU5FUl9GSUVMRF9JVEVNX0ZJRUxEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yQ2FsbGJhY2suY2FsbChzZWxmLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGZpZWxkOiAiICsgc2VsZi5nZXRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGludG8gcGxhY2UKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShjb250cm9sLmdldEZpZWxkRWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJChpbnNlcnRpb25Qb2ludEVsKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jb250YWluZXJJdGVtRWwgPSBjb250YWluZXJJdGVtRWw7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSwgYXMgcGVyOiBodHRwczovL2dpdGh1Yi5jb20vZW1pcmNhbC9hbHBhY2EvY29tbWl0LzQwNjFjMzM3ODdiZDdhMmI4NmZiNjEzMzE3Mzc0ZDM2NWQ5YWNjOTIKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBoaWRlSW5pdFZhbGlkYXRpb25FcnJvciBhZnRlciByZW5kZXIKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZmllbGRBcHBseUZpZWxkQW5kQ2hpbGRyZW4oY29udHJvbCwgZnVuY3Rpb24oX2NvbnRyb2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2wuaGlkZUluaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RSZW5kZXJDYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZW5kZXJDYWxsYmFjayhjb250cm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIHNjaGVtYSBhbmQgb3B0aW9ucyB0byB1dGlsaXplIGZvciBzdWItb2JqZWN0cyB3aXRoaW4gdGhpcyBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHJlc29sdmVQcm9wZXJ0eVNjaGVtYU9wdGlvbnM6IGZ1bmN0aW9uKHByb3BlcnR5SWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCByZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgY2lyY3VsYXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2F2ZWF0OiAgaWYgd2UncmUgaW4gcmVhZC1vbmx5IG1vZGUsIHRoZSBjaGlsZCBtdXN0IGFsc28gYmUgaW4gcmVhZC1vbmx5IG1vZGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlYWRvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMucmVhZG9ubHkgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMuc2NoZW1hICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzICYmIF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVNjaGVtYSA9IF90aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHMgJiYgX3RoaXMub3B0aW9ucy5maWVsZHNbcHJvcGVydHlJZF0pIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5T3B0aW9ucyA9IF90aGlzLm9wdGlvbnMuZmllbGRzW3Byb3BlcnR5SWRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGUgJHJlZgogICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEgJiYgcHJvcGVydHlTY2hlbWFbIiRyZWYiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5UmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgdmFyIGZpZWxkUmVmZXJlbmNlSWQgPSBwcm9wZXJ0eVNjaGVtYVsiJHJlZiJdOwogICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9uc1siJHJlZiJdKSB7CiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IHByb3BlcnR5T3B0aW9uc1siJHJlZiJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b3BGaWVsZCA9IHRoaXM7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRDaGFpbiA9IFt0b3BGaWVsZF07CiAgICAgICAgICAgICAgICB3aGlsZSAodG9wRmllbGQucGFyZW50KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRvcEZpZWxkID0gdG9wRmllbGQucGFyZW50OwogICAgICAgICAgICAgICAgICAgIGZpZWxkQ2hhaW4ucHVzaCh0b3BGaWVsZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEgPSBwcm9wZXJ0eVNjaGVtYTsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFByb3BlcnR5T3B0aW9ucyA9IHByb3BlcnR5T3B0aW9uczsKCiAgICAgICAgICAgICAgICBBbHBhY2EubG9hZFJlZlNjaGVtYU9wdGlvbnModG9wRmllbGQsIHByb3BlcnR5UmVmZXJlbmNlSWQsIGZpZWxkUmVmZXJlbmNlSWQsIGZ1bmN0aW9uKHByb3BlcnR5U2NoZW1hLCBwcm9wZXJ0eU9wdGlvbnMpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aGUgZmllbGQgY2hhaW4gdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNpcmN1bGFyaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkQ2hhaW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFpbltpXS5zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hLmlkID09PSBwcm9wZXJ0eVJlZmVyZW5jZUlkKSB8fCAoZmllbGRDaGFpbltpXS5zY2hlbWEuaWQgPT09ICIjIiArIHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKGZpZWxkQ2hhaW5baV0uc2NoZW1hWyIkcmVmIl0gPT09IHByb3BlcnR5UmVmZXJlbmNlSWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBjaXJjdWxhciA9IChyZWZDb3VudCA+IDEpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5U2NoZW1hLCBvcmlnaW5hbFByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHByb3BlcnR5U2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvcmlnaW5hbCBpZAogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5U2NoZW1hICYmIG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm9wZXJ0eVNjaGVtYS5pZCA9IG9yaWdpbmFsUHJvcGVydHlTY2hlbWEuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIHJlc29sdmVkUHJvcGVydHlTY2hlbWEuaWQ7CgogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFByb3BlcnR5T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFByb3BlcnR5T3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBBbHBhY2EubWVyZ2VPYmplY3QocmVzb2x2ZWRQcm9wZXJ0eU9wdGlvbnMsIG9yaWdpbmFsUHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5T3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5tZXJnZU9iamVjdChyZXNvbHZlZFByb3BlcnR5T3B0aW9ucywgcHJvcGVydHlPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkZ1bmN0aW9uKHJlc29sdmVkUHJvcGVydHlTY2hlbWEsIHJlc29sdmVkUHJvcGVydHlPcHRpb25zLCBjaXJjdWxhcik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFscGFjYS5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEsIHByb3BlcnR5T3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFwcGx5Q3JlYXRlZEl0ZW1zOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbW9kZWwuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG1vZGVsLml0ZW1zW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IGl0ZW0ucHJvcGVydHlJZDsKCiAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFIFBST1BFUlRZIERFUEVOREVOQ0lFUyAoSUYgVEhFIFBST1BFUlRZIEhBUyBUSEVNKQoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGhhcyBkZXBlbmRlbmNpZXMsIHNob3cgb3IgaGlkZSB0aGlzIGFkZGVkIGl0ZW0gcmlnaHQgYXdheQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd09ySGlkZVByb3BlcnR5QmFzZWRPbkRlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBoYXMgZGVwZW5kZW5jaWVzLCBiaW5kIHVwZGF0ZSBoYW5kbGVycyB0byBkZXBlbmRlbnQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kRGVwZW5kZW5jeUZpZWxkVXBkYXRlRXZlbnQocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaGFzIGRlcGVuZGVuY2llcywgdHJpZ2dlciB0aG9zZSB0byBlbnN1cmUgaXQgaXMgaW4gdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoRGVwZW5kZW50RmllbGRTdGF0ZXMocHJvcGVydHlJZCk7CgogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNYXhQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb01hbnlQcm9wZXJ0aWVzIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ0b29NYW55UHJvcGVydGllcyIpLCBbdGhpcy5zY2hlbWEubWF4UHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVNaW5Qcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIHZhbEluZm9bInRvb0Zld1Byb3BlcnRpZXMiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoInRvb01hbnlJdGVtcyIpLCBbdGhpcy5zY2hlbWEubWluUHJvcGVydGllc10pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sidG9vTWFueVByb3BlcnRpZXMiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1sidG9vRmV3UHJvcGVydGllcyJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWF4UHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWF4UHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtYXhQcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1heFByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPD0gbWF4UHJvcGVydGllczsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZSBtYXhQcm9wZXJ0aWVzIHNjaGVtYSBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB3aGV0aGVyIG1heFByb3BlcnRpZXMgaXMgc2F0aXNmaWVkCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWluUHJvcGVydGllczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNjaGVtYVsibWluUHJvcGVydGllcyJdKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtaW5Qcm9wZXJ0aWVzID0gdGhpcy5zY2hlbWFbIm1pblByb3BlcnRpZXMiXTsKCiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUNvdW50ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5Q291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q291bnQgPj0gbWluUHJvcGVydGllczsKICAgICAgICB9LAoKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gREVQRU5ERU5DSUVTCiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIG9yIGhpZGVzIGEgcHJvcGVydHkncyBmaWVsZCBiYXNlZCBvbiBob3cgaXRzIGRlcGVuZGVuY2llcyBldmFsdWF0ZS4KICAgICAgICAgKiBJZiBhIHByb3BlcnR5IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmNpZXMsIHRoaXMgbm8tb3BzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKi8KICAgICAgICBzaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB2YWxpZCA9IHRoaXMuZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7CiAgICAgICAgICAgICAgICBpdGVtLm9uRGVwZW5kZW50UmV2ZWFsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdGVtLmhpZGUoKTsKICAgICAgICAgICAgICAgIGl0ZW0ub25EZXBlbmRlbnRDb25jZWFsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZW0uZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZvciBhIGNoaWxkIHByb3BlcnR5LgogICAgICAgICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IEpTT04gU2NoZW1hIHY0IGFuZCBhbHNvIHByb3ZpZGVzIGZvciBsZWdhY3kgdjMgc3VwcG9ydC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hpbGREZXBlbmRlbmNpZXM6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1EZXBlbmRlbmNpZXMgPSB0aGlzLnNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHlJZF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHN1cHBvcnQgbGVnYWN5IHYzIGpzb24gc2NoZW1hCiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtRGVwZW5kZW5jaWVzID0gaXRlbS5zY2hlbWEuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXRlbURlcGVuZGVuY2llczsKICAgICAgICB9LAoKICAgICAgICBnZXRDaGlsZENvbmRpdGlvbmFsRGVwZW5kZW5jaWVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IG51bGw7CgogICAgICAgICAgICAvLyBzZWNvbmQsIGNoZWNrIGZvciBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgb24gdGhlIGl0ZW0gaXRzZWxmCiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gc3VwcG9ydCBsZWdhY3kgdjMganNvbiBvcHRpb25zCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0ZW1Db25kaXRpb25hbERlcGVuZGVuY2llcyA9IGl0ZW0ub3B0aW9ucy5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpdGVtQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvcGVydHkgcGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUlkCiAgICAgICAgICovCiAgICAgICAgZGV0ZXJtaW5lQWxsRGVwZW5kZW5jaWVzVmFsaWQ6IGZ1bmN0aW9uKHByb3BlcnR5SWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF07CiAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS50aHJvd0Vycm9yV2l0aENhbGxiYWNrKCJNaXNzaW5nIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCwgc2VsZi5lcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGRlcGVuZGVuY2llcyBkZWNsYXJlZCB3aXRoaW4gdGhlIG9iamVjdCAoY29udGFpbmVyKQogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7OwogICAgICAgICAgICBpZiAoIWl0ZW1EZXBlbmRlbmNpZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG5vIGRlcGVuZGVuY2llcywgc28geWVzLCB3ZSBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBzZWxmLmRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZChwcm9wZXJ0eUlkLCBpdGVtRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBbHBhY2EuaXNBcnJheShpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1EZXBlbmRlbmNpZXMsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgc2VsZi5kZXRlcm1pbmVTaW5nbGVEZXBlbmRlbmN5VmFsaWQocHJvcGVydHlJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCaW5kcyBmaWVsZCB1cGRhdGVzIHRvIGFueSBmaWVsZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAogICAgICAgICAqLwogICAgICAgIGJpbmREZXBlbmRlbmN5RmllbGRVcGRhdGVFdmVudDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKCFpdGVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQWxwYWNhLnRocm93RXJyb3JXaXRoQ2FsbGJhY2soIk1pc3NpbmcgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkLCBzZWxmLmVycm9yQ2FsbGJhY2spOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaXRlbURlcGVuZGVuY2llcyA9IHNlbGYuZ2V0Q2hpbGREZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghaXRlbURlcGVuZGVuY2llcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCBzbyBzaW1wbGUgcmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHZhciBiaW5kRXZlbnQgPSBmdW5jdGlvbihwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeVByb3BlcnR5SWQgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9wZXJ0eSB0aGF0IHRoZSBmaWVsZCAicHJvcGVydHlJZCIgaXMgZGVwZW5kZW50IG9uCgogICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVudEZpZWxkID0gQWxwYWNhLnJlc29sdmVGaWVsZChzZWxmLCBkZXBlbmRlbmN5UHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50RmllbGQuZ2V0RmllbGRFbCgpLmJpbmQoImZpZWxkdXBkYXRlIiwgKGZ1bmN0aW9uKHByb3BlcnR5RmllbGQsIGRlcGVuZGVuY3lGaWVsZCwgcHJvcGVydHlJZCwgZGVwZW5kZW5jeVByb3BlcnR5SWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5ICJkZXBlbmRlbmN5UHJvcGVydHlJZCIgY2hhbmdlZCBhbmQgYWZmZWN0cyB0YXJnZXQgcHJvcGVydHkgKCJwcm9wZXJ0eUlkIikKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgVUkgc3RhdGUgZm9yIHRhcmdldCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93T3JIaWRlUHJvcGVydHlCYXNlZE9uRGVwZW5kZW5jaWVzKHByb3BlcnR5SWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RmllbGQuZ2V0RmllbGRFbCgpLnRyaWdnZXIoImZpZWxkdXBkYXRlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH0pKGl0ZW0sIGRlcGVuZGVudEZpZWxkLCBwcm9wZXJ0eUlkLCBkZXBlbmRlbmN5UHJvcGVydHlJZCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZpZWxkLmdldEZpZWxkRWwoKS50cmlnZ2VyKCJmaWVsZHVwZGF0ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1N0cmluZyhpdGVtRGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZEV2ZW50KHByb3BlcnR5SWQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaERlcGVuZGVudEZpZWxkU3RhdGVzOiBmdW5jdGlvbihwcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHByb3BlcnR5RmllbGQgPSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICBpZiAoIXByb3BlcnR5RmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EudGhyb3dFcnJvcldpdGhDYWxsYmFjaygiTWlzc2luZyBwcm9wZXJ0eTogIiArIHByb3BlcnR5SWQsIHNlbGYuZXJyb3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpdGVtRGVwZW5kZW5jaWVzID0gc2VsZi5nZXRDaGlsZERlcGVuZGVuY2llcyhwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFpdGVtRGVwZW5kZW5jaWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbmNpZXMsIHNvIHNpbXBsZSByZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5ID0gZnVuY3Rpb24ob3RoZXJQcm9wZXJ0eUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVwZW5kZW50RmllbGQgPSBBbHBhY2EucmVzb2x2ZUZpZWxkKHNlbGYsIG90aGVyUHJvcGVydHlJZCk7CiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50RmllbGQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBmaWVsZCB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGaWVsZC5nZXRGaWVsZEVsKCkudHJpZ2dlcigiZmllbGR1cGRhdGUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNTdHJpbmcoaXRlbURlcGVuZGVuY2llcykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZFVwZGF0ZUZvclByb3BlcnR5KGl0ZW1EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc0FycmF5KGl0ZW1EZXBlbmRlbmNpZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkLmVhY2goaXRlbURlcGVuZGVuY2llcywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkVXBkYXRlRm9yUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSdzIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEluIG9yZGVyIHRvIGJlIHZhbGlkLCB0aGUgcHJvcGVydHkncyBkZXBlbmRlbmN5IG11c3QgZXhpc3QgKEpTT04gc2NoZW1hKSBhbmQgb3B0aW9uYWxseSBtdXN0IHNhdGlzZnkKICAgICAgICAgKiBhbnkgZGVwZW5kZW5jeSBvcHRpb25zICh2YWx1ZSBtYXRjaGVzIHVzaW5nIGFuIEFORCkuICBGaW5hbGx5LCB0aGUgZGVwZW5kZW5jeSBmaWVsZCBtdXN0IGJlIHNob3dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBGaWVsZCBwcm9wZXJ0eSBpZC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW50T25Qcm9wZXJ0eUlkIFByb3BlcnR5IGlkIG9mIHRoZSBkZXBlbmRlbmN5IGZpZWxkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gc2F0aXNmaWVkIGFuZCB0aGUgZmllbGQgbmVlZHMgdG8gYmUgc2hvd24sCiAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGRldGVybWluZVNpbmdsZURlcGVuZGVuY3lWYWxpZDogZnVuY3Rpb24ocHJvcGVydHlJZCwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCAiZGVwZW5kZW50LW9uIiBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQogICAgICAgICAgICAvLyBiYXNpYyBKU09OLXNjaGVtYSBzdXBwb3J0cyB0aGlzIChpZiBpdCBoYXMgQU5ZIHZhbHVlLCBpdCBpcyBjb25zaWRlcmVkIHZhbGlkCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBmb3IgYm9vbGVhbiBmYWxzZQogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25GaWVsZCA9IEFscGFjYS5yZXNvbHZlRmllbGQoc2VsZiwgZGVwZW5kZW50T25Qcm9wZXJ0eUlkKTsKICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRPbkZpZWxkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBubyBkZXBlbmRlbnQtb24gZmllbGQgZm91bmQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZGVwZW5kZW50T25EYXRhID0gZGVwZW5kZW50T25GaWVsZC5kYXRhOwoKICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzbid0IHZhbGlkCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gZ28gb25lIG9mIHR3byBkaXJlY3Rpb25zIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIG5vdAogICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB0aGlzLmdldENoaWxkQ29uZGl0aW9uYWxEZXBlbmRlbmNpZXMocHJvcGVydHlJZCk7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMgfHwgY29uZGl0aW9uYWxEZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gQkFTSUMgREVQRU5FTkRFTkNZIENIRUNLSU5HIChDT1JFIEpTT04gU0NIRU1BKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGlmIHRoZSBmaWVsZCBpcyBhIGJvb2xlYW4gZmllbGQgYW5kIHdlIGhhdmUgbm8gY29uZGl0aW9uYWwgZGVwZW5kZW5jeSBjaGVja2luZywKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2Ugc2V0IHZhbGlkID0gZmFsc2UgaWYgdGhlIGZpZWxkIGRhdGEgaXMgYSBib29sZWFuIGZhbHNlCiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50T25GaWVsZC5nZXRUeXBlKCkgPT09ICJib29sZWFuIiAmJiAhdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5vcHRpb25zLmRlcGVuZGVuY2llcyAmJiAhZGVwZW5kZW50T25EYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAhQWxwYWNhLmlzVmFsRW1wdHkoZGVwZW5kZW50T25GaWVsZC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBDT05ESVRJT05BTCBERVBFTkRFTkNZIENIRUNLSU5HIChBTFBBQ0EgRVhURU5TSU9OIFZJQSBPUFRJT05TKQogICAgICAgICAgICAgICAgLy8KCiAgICAgICAgICAgICAgICAvLyBBbHBhY2EgZXh0ZW5kcyBKU09OIHNjaGVtYSBieSBhbGxvd2luZyBkZXBlbmRlbmNpZXMgdG8gdHJpZ2dlciBvbmx5IGZvciBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbnQgZmllbGRzLiAgSWYgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHRvIGRlZmluZSB0aGlzLCB3ZSB3YWxrIHRocm91Z2ggYW5kIHBlcmZvcm0gYW4KICAgICAgICAgICAgICAgIC8vIEFORCBvcGVyYXRpb24gYWNyb3NzIGFueSBmaWVsZHMKCiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGRhdGEgc2FuaXR5IGNsZWFudXAKICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkLmdldFR5cGUoKSA9PT0gImJvb2xlYW4iICYmICFkZXBlbmRlbnRPbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRPbkRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uYWxEYXRhID0gY29uZGl0aW9uYWxEZXBlbmRlbmNpZXNbZGVwZW5kZW50T25Qcm9wZXJ0eUlkXTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgb3B0aW9uIGlzIGEgZnVuY3Rpb24sIHRoZW4gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNob3cKICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY2hlbWEtYmFzZWQgZmFsbGJhY2sgZGV0ZXJtaW5lZCB3ZSBzaG91bGQgc2hvdwogICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuaXNFbXB0eShjb25kaXRpb25hbERhdGEpICYmIEFscGFjYS5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsRGF0YSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBjb25kaXRpb25hbERhdGEuY2FsbCh0aGlzLCBkZXBlbmRlbnRPbkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0cnVlCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uYWwgZGF0YSBpcyBhbiBhcnJheSBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpZiAoQWxwYWNhLmlzQXJyYXkoY29uZGl0aW9uYWxEYXRhKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXJyYXkgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBbHBhY2EuYW55RXF1YWxpdHkoZGVwZW5kZW50T25EYXRhLCBjb25kaXRpb25hbERhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFscGFjYS5pc0VtcHR5KGNvbmRpdGlvbmFsRGF0YSkgJiYgIUFscGFjYS5hbnlFcXVhbGl0eShjb25kaXRpb25hbERhdGEsIGRlcGVuZGVudE9uRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIE5FU1RFRCBISURERU5TIERFUEVOREVOQ1kgSElERVMgKEFMUEFDQSBFWFRFTlNJT04pCiAgICAgICAgICAgIC8vCgogICAgICAgICAgICAvLyBmaW5hbCBjaGVjazogb25seSBzZXQgdmFsaWQgaWYgdGhlIGRlcGVuZGVudE9uUHJvcGVydHlJZCBpcyBzaG93aW5nCiAgICAgICAgICAgIGlmIChkZXBlbmRlbnRPbkZpZWxkICYmIGRlcGVuZGVudE9uRmllbGQuaXNIaWRkZW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgY2hpbGQgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlJZCBDaGlsZCBmaWVsZCBwcm9wZXJ0eSBJRC4KICAgICAgICAgKi8KICAgICAgICBnZXRJbmRleDogZnVuY3Rpb24ocHJvcGVydHlJZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eShwcm9wZXJ0eUlkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHBpZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgIGlmIChwaWQgPT0gcHJvcGVydHlJZCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSwKCgoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLwogICAgICAgIC8vIERZTkFNSUMgTUVUSE9EUwogICAgICAgIC8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5SWQgQ2hpbGQgZmllbGQgcHJvcGVydHkgSUQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1TY2hlbWEgc2NoZW1hCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT3B0aW9ucyBDaGlsZCBmaWVsZCBvcHRpb25zLgogICAgICAgICAqIEBwYXJhbSB7QW55fSB2YWx1ZSBDaGlsZCBmaWVsZCB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnNlcnRBZnRlcklkIExvY2F0aW9uIHdoZXJlIHRoZSBjaGlsZCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIG9uY2UgdGhlIGl0ZW0gaGFzIGJlZW4gYWRkZWQKICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBpdGVtU2NoZW1hLCBpdGVtT3B0aW9ucywgaXRlbURhdGEsIGluc2VydEFmdGVySWQsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHByb3BlcnR5SWQsIGl0ZW1TY2hlbWEsIGl0ZW1PcHRpb25zLCBpdGVtRGF0YSwgaW5zZXJ0QWZ0ZXJJZCwgZnVuY3Rpb24oY2hpbGQpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluc2VydEFmdGVySWQgJiYgc2VsZi5jaGlsZHJlbkJ5SWRbaW5zZXJ0QWZ0ZXJJZF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hpbGRyZW5bel0uZ2V0SWQoKSA9PSBpbnNlcnRBZnRlcklkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgY2hpbGQKICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJDaGlsZChjaGlsZCwgKChpbmRleCAhPSBudWxsKSA/IGluZGV4ICsgMSA6IDApKTsKCiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgaW50byBkb20KICAgICAgICAgICAgICAgIHNlbGYuZG9BZGRJdGVtKGluZGV4LCBjaGlsZCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlUmVwb3NpdGlvbkRPTVJlZnJlc2goKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycmF5IGl0ZW0gdG9vbGJhciBzdGF0ZQogICAgICAgICAgICAgICAgLy9zZWxmLnVwZGF0ZVRvb2xiYXJzKCk7CgogICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiBhZGQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImFkZCIsIGNoaWxkKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciAicmVhZHkiCiAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJpZ2dlcldpdGhQcm9wYWdhdGlvbi5jYWxsKGNoaWxkLCAicmVhZHkiLCAiZG93biIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9BZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGRvbQogICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgZmlyc3QgaW50byBjb250YWluZXIKICAgICAgICAgICAgICAgICQoc2VsZi5jb250YWluZXIpLnByZXBlbmQoaXRlbS5jb250YWluZXJJdGVtRWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGF0IGEgc3BlY2lmaWMgaW5kZXgKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0VsZW1lbnQgPSBzZWxmLmdldENvbnRhaW5lckVsKCkuY2hpbGRyZW4oIltkYXRhLWFscGFjYS1jb250YWluZXItaXRlbS1pbmRleD0nIiArIGluZGV4ICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFbGVtZW50ICYmIGV4aXN0aW5nRWxlbWVudC5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhZnRlcgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5hZnRlcihpdGVtLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlbGYuZG9BZnRlckFkZEl0ZW0oaXRlbSwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciByZWFkeQogICAgICAgICAgICAgICAgQWxwYWNhLmZpcmVSZWFkeShpdGVtKTsKCiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICBkb0FmdGVyQWRkSXRlbTogZnVuY3Rpb24oaXRlbSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGRvUmVzb2x2ZUl0ZW1Db250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SWQKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sKICAgICAgICAgKi8KICAgICAgICByZW1vdmVJdGVtOiBmdW5jdGlvbihwcm9wZXJ0eUlkLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkID0gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXTsKICAgICAgICAgICAgaWYgKGNoaWxkRmllbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSAkLmdyZXAodGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5wcm9wZXJ0eUlkICE9PSBwcm9wZXJ0eUlkKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hpbGRyZW5CeUlkW2NoaWxkRmllbGQuZ2V0SWQoKV07CgogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0ZW1Db250YWluZXJFbCBmcm9tIERPTQogICAgICAgICAgICAgICAgc2VsZi5kb1JlbW92ZUl0ZW0oY2hpbGRGaWVsZCk7CgogICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKHRydWUsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBkb20gbWFya2VycyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhbnkgc2libGluZ3MKICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVJlcG9zaXRpb25ET01SZWZyZXNoKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGV2ZW50OiByZW1vdmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoInJlbW92ZSIsIGNoaWxkRmllbGQpOwoKICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVXBkYXRlKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZG9SZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1Db250YWluZXIgPSBzZWxmLmRvUmVzb2x2ZUl0ZW1Db250YWluZXIoKTsKCiAgICAgICAgICAgIHJlbW92ZUl0ZW1Db250YWluZXIuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyLWl0ZW1bZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0tbmFtZT0nIiArIGl0ZW0ubmFtZSArICInXSIpLnJlbW92ZSgpOwoKICAgICAgICAgICAgLy8gZGVzdHJveSBjaGlsZCBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vCiAgICAgICAgLy8gV0laQVJECiAgICAgICAgLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgIC8qKgogICAgICAgICAqIFdyYXBzIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGEgd2l6YXJkIGNvbnRhaW5lciBhbmQgd2lyZXMgdXAgdGhlIG5hdmlnYXRpb24gYW5kIGJ1dHRvbnMgc28gdGhhdAogICAgICAgICAqIHdpemFyZCBlbGVtZW50cyBmbGlwIG5pY2VseS4KICAgICAgICAgKi8KICAgICAgICB3aXphcmQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGNvbmZpZy1kcml2ZW4KICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9ycyA9IHRoaXMud2l6YXJkQ29uZmlncy5zdGVwczsKICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9ycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3aXphcmRUaXRsZSA9IHRoaXMud2l6YXJkQ29uZmlncy50aXRsZTsKICAgICAgICAgICAgdmFyIHdpemFyZERlc2NyaXB0aW9uID0gdGhpcy53aXphcmRDb25maWdzLmRlc2NyaXB0aW9uOwogICAgICAgICAgICB2YXIgYnV0dG9uRGVzY3JpcHRvcnMgPSB0aGlzLndpemFyZENvbmZpZ3MuYnV0dG9uczsKICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnMgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sicHJldmlvdXMiXS50aXRsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udGl0bGUgPSAiUHJldmlvdXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0uYWxpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJwcmV2aW91cyJdLmFsaWduID0gImxlZnQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbInByZXZpb3VzIl0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXSA9IHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnRpdGxlID0gIk5leHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbIm5leHQiXS5hbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sibmV4dCJdLnR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJuZXh0Il0udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlncy5oaWRlU3VibWl0QnV0dG9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXSA9IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50aXRsZSA9ICJTdWJtaXQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24pIHsKICAgICAgICAgICAgICAgICAgICBidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0uYWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1sic3VibWl0Il0udHlwZSkgewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkRlc2NyaXB0b3JzWyJzdWJtaXQiXS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGJ1dHRvbktleSBpbiBidXR0b25EZXNjcmlwdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFidXR0b25EZXNjcmlwdG9yc1tidXR0b25LZXldLnR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRGVzY3JpcHRvcnNbYnV0dG9uS2V5XS50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNob3dTdGVwcyA9IHRoaXMud2l6YXJkQ29uZmlncy5zaG93U3RlcHM7CiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2hvd1N0ZXBzKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2hvd1Byb2dyZXNzQmFyID0gdGhpcy53aXphcmRDb25maWdzLnNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgdmFyIHBlcmZvcm1WYWxpZGF0aW9uID0gdGhpcy53aXphcmRDb25maWdzLnZhbGlkYXRpb247CiAgICAgICAgICAgIGlmICh0eXBlb2YocGVyZm9ybVZhbGlkYXRpb24pID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERPTS1kcml2ZW4gY29uZmlndXJhdGlvbgogICAgICAgICAgICB2YXIgd2l6YXJkVGl0bGUgPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC10aXRsZSIpOwogICAgICAgICAgICB2YXIgd2l6YXJkRGVzY3JpcHRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1kZXNjcmlwdGlvbiIpOwogICAgICAgICAgICB2YXIgX3dpemFyZFZhbGlkYXRpb24gPSAkKHRoaXMuZmllbGQpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC12YWxpZGF0aW9uIik7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX3dpemFyZFZhbGlkYXRpb24pICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbiA9IF93aXphcmRWYWxpZGF0aW9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1N0ZXBzID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1zdGVwcyIpOwogICAgICAgICAgICBpZiAodHlwZW9mKF93aXphcmRTaG93U3RlcHMpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaG93U3RlcHMgPSBfd2l6YXJkU2hvd1N0ZXBzID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfd2l6YXJkU2hvd1Byb2dyZXNzQmFyID0gJCh0aGlzLmZpZWxkKS5hdHRyKCJkYXRhLWFscGFjYS13aXphcmQtc2hvdy1wcm9ncmVzcy1iYXIiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZihfd2l6YXJkU2hvd1Byb2dyZXNzQmFyKSAhPSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gX3dpemFyZFNob3dQcm9ncmVzc0JhciA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbGwgb2YgdGhlIHN0ZXBzCiAgICAgICAgICAgIHZhciBzdGVwRWxzID0gJCh0aGlzLmZpZWxkKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpOwoKICAgICAgICAgICAgLy8gRE9NLWRyaXZlbiBjb25maWd1cmF0aW9uIG9mIHN0ZXAgZGVzY3JpcHRvcnMKICAgICAgICAgICAgaWYgKHN0ZXBEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEVscy5lYWNoKGZ1bmN0aW9uKGkpIHsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdG9yID0ge307CgogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwVGl0bGUgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLXdpemFyZC1zdGVwLXRpdGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwVGl0bGUpICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERlc2NyaXB0b3IudGl0bGUgPSBzdGVwVGl0bGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RlcERlc2NyaXB0b3IudGl0bGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci50aXRsZSA9ICJTdGVwICIgKyBpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBEZXNjcmlwdGlvbiA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtZGVzY3JpcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHN0ZXBEZXNjcmlwdGlvbikgIT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbiA9IHN0ZXBEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwRGVzY3JpcHRvci5kZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEZXNjcmlwdG9yLmRlc2NyaXB0aW9uID0gIlN0ZXAgIiArIGk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwRGVzY3JpcHRvcnMucHVzaChzdGVwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYXNzdW1lIHNvbWV0aGluZyBmb3IgcHJvZ3Jlc3MgYmFyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAgICAgaWYgKHR5cGVvZihzaG93UHJvZ3Jlc3NCYXIpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcERlc2NyaXB0b3JzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIG1vZGVsIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRoZSB3aXphcmQKICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgIG1vZGVsLndpemFyZFRpdGxlID0gd2l6YXJkVGl0bGU7CiAgICAgICAgICAgIG1vZGVsLndpemFyZERlc2NyaXB0aW9uID0gd2l6YXJkRGVzY3JpcHRpb247CiAgICAgICAgICAgIG1vZGVsLnNob3dTdGVwcyA9IHNob3dTdGVwczsKICAgICAgICAgICAgbW9kZWwucGVyZm9ybVZhbGlkYXRpb24gPSBwZXJmb3JtVmFsaWRhdGlvbjsKICAgICAgICAgICAgbW9kZWwuc3RlcHMgPSBzdGVwRGVzY3JpcHRvcnM7CiAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBidXR0b25EZXNjcmlwdG9yczsKICAgICAgICAgICAgbW9kZWwuc2NoZW1hID0gc2VsZi5zY2hlbWE7CiAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgIG1vZGVsLmRhdGEgPSBzZWxmLmRhdGE7CiAgICAgICAgICAgIG1vZGVsLnNob3dQcm9ncmVzc0JhciA9IHNob3dQcm9ncmVzc0JhcjsKICAgICAgICAgICAgbW9kZWwubWFya0FsbFN0ZXBzVmlzaXRlZCA9IHRoaXMud2l6YXJkQ29uZmlncy5tYXJrQWxsU3RlcHNWaXNpdGVkOwogICAgICAgICAgICBtb2RlbC52aWV3ID0gc2VsZi52aWV3OwoKICAgICAgICAgICAgLy8gcmVuZGVyIHRoZSBhY3R1YWwgd2l6YXJkCiAgICAgICAgICAgIHZhciB3aXphcmRUZW1wbGF0ZURlc2NyaXB0b3IgPSBzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKCJ3aXphcmQiLCBzZWxmKTsKICAgICAgICAgICAgaWYgKHdpemFyZFRlbXBsYXRlRGVzY3JpcHRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdpemFyZEVsID0gQWxwYWNhLnRtcGwod2l6YXJkVGVtcGxhdGVEZXNjcmlwdG9yLCBtb2RlbCk7CgogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hcHBlbmQod2l6YXJkRWwpOwoKICAgICAgICAgICAgICAgIHZhciB3aXphcmROYXYgPSAkKHdpemFyZEVsKS5maW5kKCIuYWxwYWNhLXdpemFyZC1uYXYiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRTdGVwcyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXN0ZXBzIik7CiAgICAgICAgICAgICAgICB2YXIgd2l6YXJkQnV0dG9ucyA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLWJ1dHRvbnMiKTsKICAgICAgICAgICAgICAgIHZhciB3aXphcmRQcm9ncmVzc0JhciA9ICQod2l6YXJkRWwpLmZpbmQoIi5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhciIpOwoKICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RlcHMgaW50byBwbGFjZQogICAgICAgICAgICAgICAgJCh3aXphcmRTdGVwcykuYXBwZW5kKHN0ZXBFbHMpOwoKICAgICAgICAgICAgICAgIChmdW5jdGlvbih3aXphcmROYXYsIHdpemFyZFN0ZXBzLCB3aXphcmRCdXR0b25zLCBtb2RlbCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0ncHJldmlvdXMnXSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0QnV0dG9uRWwgPSAkKHdpemFyZEJ1dHRvbnMpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtYnV0dG9uLWtleT0nbmV4dCddIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkVsID0gJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXk9J3N1Ym1pdCddIik7CgogICAgICAgICAgICAgICAgICAgIC8vIHNuYXAgaW50byBwbGFjZSBhIGxpdHRsZSBjb250cm9sbGVyIHRvIHdvcmsgdGhlIGJ1dHRvbnMKICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0IHN0ZXAKICAgICAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaFN0ZXBzID0gZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkFWCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5zaG93U3RlcHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwudmlzaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnZpc2l0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgbWFyayBhbGwgc3RlcHMgYXMgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm1hcmtBbGxTdGVwc1Zpc2l0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbZ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgc3RlcCBhcyB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC52aXNpdHNbY3VycmVudEluZGV4XSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBFbGVtZW50cyA9ICQod2l6YXJkTmF2KS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXhdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHN0ZXBFbGVtZW50cykucmVtb3ZlQ2xhc3MoImNvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWxlbWVudHMpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3RlcEVsZW1lbnRzKS5yZW1vdmVDbGFzcygidmlzaXRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBzdGVwRWxlbWVudHMubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJjb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZyA9PT0gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleD0nIiArIGcgKyAiJ10iKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpdHMgJiYgbW9kZWwudmlzaXRzW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgbWFyayBkaXNhYmxlZCBmb3IgdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2l0cyAmJiBtb2RlbC52aXNpdHNbZ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZE5hdikuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1zdGVwLWluZGV4PSciICsgZyArICInXSIpLmFkZENsYXNzKCJ2aXNpdGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQUk9HUkVTUyBCQVIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlTm93ID0gY3VycmVudEluZGV4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZU1heCA9IG1vZGVsLnN0ZXBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCgoKHZhbHVlTm93IC8gdmFsdWVNYXgpICogMTAwKSwgMTApICsgIiUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2l6YXJkUHJvZ3Jlc3NCYXIpLmZpbmQoIi5wcm9ncmVzcy1iYXIiKS5hdHRyKCJhcmlhLXZhbHVlbWF4IiwgdmFsdWVNYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRQcm9ncmVzc0JhcikuZmluZCgiLnByb2dyZXNzLWJhciIpLmF0dHIoImFyaWEtdmFsdWVub3ciLCB2YWx1ZU5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFByb2dyZXNzQmFyKS5maW5kKCIucHJvZ3Jlc3MtYmFyIikuY3NzKCJ3aWR0aCIsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJVVFRPTlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLnN0ZXBzLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuc3RlcHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b25FbC5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbkVsLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRCdXR0b25FbC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uRWwuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCBzdGVwcwogICAgICAgICAgICAgICAgICAgICAgICAkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydFZhbGlkYXRpb24gPSBmdW5jdGlvbihidXR0b25JZCwgY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLnBlcmZvcm1WYWxpZGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcEVsID0gJCgkKHdpemFyZFN0ZXBzKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9J3N0ZXAnXSIpW2N1cnJlbnRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAkKGN1cnJlbnRTdGVwRWwpLmZpbmQoIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkSWQgPSAkKHRoaXMpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBzZWxmLmNoaWxkcmVuQnlJZFtmaWVsZElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaW50byB2YWxpZGF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbnMucHVzaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihfZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUodHJ1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZpZWxkc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gYWxsIHZhbGlkYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIEFscGFjYS5wYXJhbGxlbChmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIGZpZWxkc1tpXS5pc1ZhbGlkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBtb2RlbC5idXR0b25zW2J1dHRvbklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIudmFsaWRhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52YWxpZGF0ZS5jYWxsKHNlbGYsIGZ1bmN0aW9uKF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmIF92YWxpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJChwcmV2aW91c0J1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnRWYWxpZGF0aW9uKCJwcmV2aW91cyIsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInByZXZpb3VzIl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5jbGljaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleC0tOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyAxIDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24oIm5leHQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbIm5leHQiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNsaWNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJChzdWJtaXRCdXR0b25FbCkuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBtb2RlbC5zdGVwcy5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKCJzdWJtaXQiLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG1vZGVsLmJ1dHRvbnNbInN1Ym1pdCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2xpY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbGljay5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBhIGZvcm0/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZm9ybSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZm9jdXMgdG8gc2V0dGxlIG9uIGludmFsaWQgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvY3VzKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGN1c3RvbSBidXR0b25zCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmRCdXR0b25zKS5maW5kKCJbZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXldIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLWJ1dHRvbi1rZXkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAic3VibWl0IiAmJiBrZXkgIT0gIm5leHQiICYmIGtleSAhPSAicHJldmlvdXMiKSB7IC8vIHN0YW5kYXJkIGJ1dHRvbnMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbW9kZWwuYnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5jbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xpY2soZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJCh3aXphcmROYXYpLmZpbmQoIltkYXRhLWFscGFjYS13aXphcmQtc3RlcC1pbmRleF0iKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXZJbmRleCA9ICQodGhpcykuYXR0cigiZGF0YS1hbHBhY2Etd2l6YXJkLXN0ZXAtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZJbmRleCA9IHBhcnNlSW50KG5hdkluZGV4LCAxMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdkluZGV4ID09IGN1cnJlbnRJbmRleCB8fCAobW9kZWwudmlzaXRzICYmIG1vZGVsLnZpc2l0c1tuYXZJbmRleF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGJhY2t3YXJkcywgdGhlbiB3ZSBkbyBub3QgcnVuIHZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2SW5kZXggPCBjdXJyZW50SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0ZXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hdkluZGV4ID4gY3VycmVudEluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRhdGlvbihudWxsLCBmdW5jdGlvbih2YWxpZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBuYXZJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlbSBzaG91bGQgbm90IGJlIGNsaWNrYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJtb3ZlVG9TdGVwIiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2tpcFZhbGlkYXRpb24gPSBldmVudC5za2lwVmFsaWRhdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mKGluZGV4KSAhPT0gInVuZGVmaW5lZCIpICYmIGluZGV4IDw9IG1vZGVsLnN0ZXBzLmxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZGF0aW9uKG51bGwsIGZ1bmN0aW9uKHZhbGlkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hTdGVwcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigiYWR2YW5jZU9yU3VibWl0IiwgZnVuY3Rpb24oZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkYXRpb24obnVsbCwgZnVuY3Rpb24odmFsaWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gbW9kZWwuc3RlcHMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3VibWl0QnV0dG9uRWwpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobmV4dEJ1dHRvbkVsKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgICAgICByZWZyZXNoU3RlcHMoKTsKCiAgICAgICAgICAgICAgICB9KHdpemFyZE5hdiwgd2l6YXJkU3RlcHMsIHdpemFyZEJ1dHRvbnMsIG1vZGVsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW5kZXJzIGEgY29uZmlndXJhdGlvbi1iYXNlZCB3aXphcmQgd2l0aG91dCBhIGxheW91dCB0ZW1wbGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvV2l6YXJkOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RlcEJpbmRpbmdzID0gdGhpcy53aXphcmRDb25maWdzLmJpbmRpbmdzOwogICAgICAgICAgICBpZiAoIXN0ZXBCaW5kaW5ncykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5SWQgaW4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzdGVwQmluZGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlJZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RlcEJpbmRpbmdzW3Byb3BlcnR5SWRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNyZWF0ZSBzdGVwcz8KICAgICAgICAgICAgdmFyIGNyZWF0ZVN0ZXBzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKS5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgICAgICBjcmVhdGVTdGVwcyA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgc3RlcCA9IDE7CiAgICAgICAgICAgIHZhciBzdGVwRmllbGRzID0gW107CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgZmllbGRzIGluIHRoaXMgc3RlcAogICAgICAgICAgICAgICAgc3RlcEZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJZCBpbiBzdGVwQmluZGluZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBCaW5kaW5nc1twcm9wZXJ0eUlkXSA9PT0gc3RlcCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkICYmIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sLnB1c2godGhpcy5jaGlsZHJlbkJ5UHJvcGVydHlJZFtwcm9wZXJ0eUlkXS5maWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbC5wdXNoKHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5SWRbcHJvcGVydHlJZF0uY29udGFpbmVySXRlbUVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaWVsZHMucHVzaCh0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eUlkW3Byb3BlcnR5SWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc3RlcEZpZWxkcy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwRWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVTdGVwcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFbCA9ICQoJzxkaXYgZGF0YS1hbHBhY2Etd2l6YXJkLXJvbGU9InN0ZXAiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZmllbGQpLmFwcGVuZChzdGVwRWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRWwgPSAkKCQodGhpcy5maWVsZCkuZmluZCgiW2RhdGEtYWxwYWNhLXdpemFyZC1yb2xlPSdzdGVwJ10iKVtzdGVwLTFdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGFueSBvcmRlciBpbmZvcm1hdGlvbiBpbiB0aGUgaXRlbXM/CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc09yZGVySW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzdGVwRmllbGRzW2ldLm9wdGlvbnMub3JkZXIpICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3JkZXJJbmZvcm1hdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09yZGVySW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IGJ5IG9yZGVyPwogICAgICAgICAgICAgICAgICAgICAgICBzdGVwRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJBID0gYS5vcHRpb25zLm9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJBID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlckIgPSBiLm9wdGlvbnMub3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJBIC0gb3JkZXJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGVsZW1lbnRzIGluCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwRmllbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzdGVwRWwpLmFwcGVuZChzdGVwRmllbGRzW2ldLmNvbnRhaW5lckl0ZW1FbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzdGVwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0ZXBGaWVsZHMubGVuZ3RoID4gMCk7CgogICAgICAgICAgICAvLyBub3cgcnVuIHRoZSBub3JtYWwgd2l6YXJkCiAgICAgICAgICAgIHRoaXMud2l6YXJkKCk7CgogICAgICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBsZWZ0LCBoaWRlIGl0CiAgICAgICAgICAgIGlmICgkKHRoaXMuY29udGFpbmVyKS5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGEgZmllbGQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc291cmNlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0YXJnZXRJbmRleCB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGNoaWxkIHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAqIEBwYXJhbSBbQm9vbGVhbl0gYW5pbWF0ZSB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIG1vdmVtZW50CiAgICAgICAgICogQHBhcmFtIFtGdW5jdGlvbl0gY2FsbGJhY2sgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBpcyBhZGRlZAogICAgICAgICAqLwogICAgICAgIG1vdmVJdGVtOiBmdW5jdGlvbihzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgsIGFuaW1hdGUsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHR5cGVvZihhbmltYXRlKSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGFuaW1hdGU7CiAgICAgICAgICAgICAgICBhbmltYXRlID0gc2VsZi5vcHRpb25zLmFuaW1hdGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoYW5pbWF0ZSkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFuaW1hdGUgPSBzZWxmLm9wdGlvbnMuYW5pbWF0ZSA/IHNlbGYub3B0aW9ucy5hbmltYXRlIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzb3VyY2VJbmRleCkgPT09ICJzdHJpbmciKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCA9IHBhcnNlSW50KHNvdXJjZUluZGV4LCAxMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGFyZ2V0SW5kZXgpID09PSAic3RyaW5nIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBwYXJzZUludCh0YXJnZXRJbmRleCwgMTApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IHNlbGYuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IHNlbGYuY2hpbGRyZW4ubGVuZ3RoIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzd2FwIHdpdGgKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRhcmdldENoaWxkID0gc2VsZi5jaGlsZHJlblt0YXJnZXRJbmRleF07CiAgICAgICAgICAgIGlmICghdGFyZ2V0Q2hpbGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRhcmdldCBjaGlsZCBub3QgZm91bmQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IERPTSBlbGVtZW50cwogICAgICAgICAgICB2YXIgc291cmNlQ29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyBzb3VyY2VJbmRleCArICInXSIpOwogICAgICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gc2VsZi5nZXRDb250YWluZXJFbCgpLmNoaWxkcmVuKCJbZGF0YS1hbHBhY2EtY29udGFpbmVyLWl0ZW0taW5kZXg9JyIgKyB0YXJnZXRJbmRleCArICInXSIpOwoKICAgICAgICAgICAgLy8gY3JlYXRlIHR3byB0ZW1wIGVsZW1lbnRzIGFzIG1hcmtlcnMgZm9yIHN3aXRjaAogICAgICAgICAgICB2YXIgdGVtcFNvdXJjZU1hcmtlciA9ICQoIjxkaXYgY2xhc3M9J3RlbXBNYXJrZXIxJz48L2Rpdj4iKTsKICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmJlZm9yZSh0ZW1wU291cmNlTWFya2VyKTsKICAgICAgICAgICAgdmFyIHRlbXBUYXJnZXRNYXJrZXIgPSAkKCI8ZGl2IGNsYXNzPSd0ZW1wTWFya2VyMic+PC9kaXY+Iik7CiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lci5iZWZvcmUodGVtcFRhcmdldE1hcmtlcik7CgogICAgICAgICAgICB2YXIgb25Db21wbGV0ZSA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgdmFyIHRlbXBDaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzb3VyY2VJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSB0YXJnZXRJbmRleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZHJlbltpXSA9IHNlbGYuY2hpbGRyZW5bc291cmNlSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGRyZW5baV0gPSBzZWxmLmNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB0ZW1wQ2hpbGRyZW47CgogICAgICAgICAgICAgICAgLy8gc3dhcCBvcmRlciBpbiBET00KICAgICAgICAgICAgICAgIHRlbXBTb3VyY2VNYXJrZXIucmVwbGFjZVdpdGgodGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgIHRlbXBUYXJnZXRNYXJrZXIucmVwbGFjZVdpdGgoc291cmNlQ29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGRvbSBtYXJrZXJzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFueSBzaWJsaW5ncwogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSZXBvc2l0aW9uRE9NUmVmcmVzaCgpOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aW9uIGJhciBiaW5kaW5ncwogICAgICAgICAgICAgICAgJChzb3VyY2VDb250YWluZXIpLmZpbmQoIltkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleD0nIiArIHNvdXJjZUluZGV4ICsgIiddIikuYXR0cigiZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWl0ZW0taW5kZXgiLCB0YXJnZXRJbmRleCk7CiAgICAgICAgICAgICAgICAkKHRhcmdldENvbnRhaW5lcikuZmluZCgiW2RhdGEtYWxwYWNhLWFycmF5LWFjdGlvbmJhci1pdGVtLWluZGV4PSciICsgdGFyZ2V0SW5kZXggKyAiJ10iKS5hdHRyKCJkYXRhLWFscGFjYS1hcnJheS1hY3Rpb25iYXItaXRlbS1pbmRleCIsIHNvdXJjZUluZGV4KTsKCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHZhbGlkYXRpb24gc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwoKICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlCiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJVcGRhdGUoKTsKCiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBldmVudDogbW92ZQogICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJtb3ZlIik7CgogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoYW5pbWF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gc3dhcCBkaXZzIHZpc3VhbGx5CiAgICAgICAgICAgICAgICBBbHBhY2EuYW5pbWF0ZWRTd2FwKHNvdXJjZUNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyLCA1MDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJPYmplY3QgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9iamVjdCBmaWVsZCBmb3IgY29udGFpbmluZyBvdGhlciBmaWVsZHMiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgY2hpbGQgcHJvcGVydGllcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gTnVtYmVyIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyBhbGxvd2VkIHRvIGhhdmUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1pbmltdW0gTnVtYmVyIG9mIFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCB0aGlzIG9iamVjdCBpcyByZXF1aXJlZCB0byBoYXZlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXM7CgogICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSB7fTsKCiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlJZCA9IHRoaXMuY2hpbGRyZW5baV0ucHJvcGVydHlJZDsKICAgICAgICAgICAgICAgICAgICBmaWVsZHNQcm9wZXJ0aWVzLnByb3BlcnRpZXNbcHJvcGVydHlJZF0gPSB0aGlzLmNoaWxkcmVuW2ldLmdldFNjaGVtYU9mU2NoZW1hKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgcHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250YWluZXJGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc2NoZW1hT2ZPcHRpb25zID0gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JkZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgZm9yIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGluZGV4IG9mIHRoaXMgZmllbGQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGlzdCBvZiBvcHRpb25zIGZvciBjaGlsZCBmaWVsZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBmaWVsZHNQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5wcm9wZXJ0aWVzLmZpZWxkczsKCiAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllcyA9IHt9OwoKICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlkID0gdGhpcy5jaGlsZHJlbltpXS5wcm9wZXJ0eUlkOwogICAgICAgICAgICAgICAgICAgIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXSA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0U2NoZW1hT2ZPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzUHJvcGVydGllcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdLnRpdGxlID0gcHJvcGVydHlJZCArICIgOjogIiArIGZpZWxkc1Byb3BlcnRpZXMucHJvcGVydGllc1twcm9wZXJ0eUlkXS50aXRsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZShzY2hlbWFPZk9wdGlvbnMsIHByb3BlcnRpZXMpOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgLy8gQWRkaXRpb25hbCBSZWdpc3RyYXRpb25zCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgInRvb01hbnlQcm9wZXJ0aWVzIjogIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzICh7MH0pIGhhcyBiZWVuIGV4Y2VlZGVkLiIsCiAgICAgICAgInRvb0Zld1Byb3BlcnRpZXMiOiAiVGhlcmUgYXJlIG5vdCBlbm91Z2ggcHJvcGVydGllcyAoezB9IGFyZSByZXF1aXJlZCkiCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJvYmplY3QiLCBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoIm9iamVjdCIsICJvYmplY3QiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkFueUZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkFueUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udHJvbFZhbCh0cnVlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWwoIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnZhbCh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gY2FsbCBpbnRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZW5hYmxlCiAgICAgICAgICovCiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNmb2N1cwogICAgICAgICAqLwogICAgICAgIGZvY3VzOiBmdW5jdGlvbihvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbnRyb2wuZm9jdXMoKTsKCiAgICAgICAgICAgIGlmIChvbkZvY3VzQ2FsbGJhY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRm9jdXNDYWxsYmFjayh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJhbnkiOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBbnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkFueSBmaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0ZvclNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiYW55IiwgQWxwYWNhLkZpZWxkcy5BbnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJhbnkiLCAiYW55Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCA9IEFscGFjYS5Db250cm9sRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gImhpZGRlbiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRDb250cm9sVmFsKHRydWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc0VtcHR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwoIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sRWwoKS52YWwodmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSGlkZGVuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJGaWVsZCBmb3IgYSBoaWRkZW4gSFRNTCBpbnB1dCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCgogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaGlkZGVuIiwgQWxwYWNhLkZpZWxkcy5IaWRkZW5GaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQgPSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQWRkcmVzc0ZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN0cmVldCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gewogICAgICAgICAgICAgICAgICAgIHN0cmVldDogWycnLCAnJ10KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gewogICAgICAgICAgICAgICAgInRpdGxlIjogIkhvbWUgQWRkcmVzcyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN0cmVldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN0cmVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhMZW5ndGgiOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4SXRlbXMiOiAzCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2l0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJBTCIsICJBSyIsICJBUyIsICJBWiIsICJBUiIsICJDQSIsICJDTyIsICJDVCIsICJERSIsICJEQyIsICJGTSIsICJGTCIsICJHQSIsICJHVSIsICJISSIsICJJRCIsICJJTCIsICJJTiIsICJJQSIsICJLUyIsICJLWSIsICJMQSIsICJNRSIsICJNSCIsICJNRCIsICJNQSIsICJNSSIsICJNTiIsICJNUyIsICJNTyIsICJNVCIsICJORSIsICJOViIsICJOSCIsICJOSiIsICJOTSIsICJOWSIsICJOQyIsICJORCIsICJNUCIsICJPSCIsICJPSyIsICJPUiIsICJQVyIsICJQQSIsICJQUiIsICJSSSIsICJTQyIsICJTRCIsICJUTiIsICJUWCIsICJVVCIsICJWVCIsICJWSSIsICJWQSIsICJXQSIsICJXViIsICJXSSIsICJXWSJdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiWmlwIENvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IC9eKFxkezV9KC1cZHs0fSk/KT8kLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgQWxwYWNhLm1lcmdlKHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiemlwIjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6ICI5OTk5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIjogNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN0YXRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uTGFiZWxzIjogWyJBTEFCQU1BIiwgIkFMQVNLQSIsICJBTUVSSUNBTiBTQU1PQSIsICJBUklaT05BIiwgIkFSS0FOU0FTIiwgIkNBTElGT1JOSUEiLCAiQ09MT1JBRE8iLCAiQ09OTkVDVElDVVQiLCAiREVMQVdBUkUiLCAiRElTVFJJQ1QgT0YgQ09MVU1CSUEiLCAiRkVERVJBVEVEIFNUQVRFUyBPRiBNSUNST05FU0lBIiwgIkZMT1JJREEiLCAiR0VPUkdJQSIsICJHVUFNIiwgIkhBV0FJSSIsICJJREFITyIsICJJTExJTk9JUyIsICJJTkRJQU5BIiwgIklPV0EiLCAiS0FOU0FTIiwgIktFTlRVQ0tZIiwgIkxPVUlTSUFOQSIsICJNQUlORSIsICJNQVJTSEFMTCBJU0xBTkRTIiwgIk1BUllMQU5EIiwgIk1BU1NBQ0hVU0VUVFMiLCAiTUlDSElHQU4iLCAiTUlOTkVTT1RBIiwgIk1JU1NJU1NJUFBJIiwgIk1JU1NPVVJJIiwgIk1PTlRBTkEiLCAiTkVCUkFTS0EiLCAiTkVWQURBIiwgIk5FVyBIQU1QU0hJUkUiLCAiTkVXIEpFUlNFWSIsICJORVcgTUVYSUNPIiwgIk5FVyBZT1JLIiwgIk5PUlRIIENBUk9MSU5BIiwgIk5PUlRIIERBS09UQSIsICJOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMiLCAiT0hJTyIsICJPS0xBSE9NQSIsICJPUkVHT04iLCAiUEFMQVUiLCAiUEVOTlNZTFZBTklBIiwgIlBVRVJUTyBSSUNPIiwgIlJIT0RFIElTTEFORCIsICJTT1VUSCBDQVJPTElOQSIsICJTT1VUSCBEQUtPVEEiLCAiVEVOTkVTU0VFIiwgIlRFWEFTIiwgIlVUQUgiLCAiVkVSTU9OVCIsICJWSVJHSU4gSVNMQU5EUyIsICJWSVJHSU5JQSIsICJXQVNISU5HVE9OIiwgIldFU1QgVklSR0lOSUEiLCAiV0lTQ09OU0lOIiwgIldZT01JTkciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFkZHJlc3NWYWxpZGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2lzQ29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgaXNDb250YWluZXI6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFkZHJlc3MgaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBBZGRyZXNzIGFzIGEgc2luZ2xlIGxpbmUgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKHRoaXMudmlldy50eXBlID09PSAidmlldyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIiI7CiAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0cmVldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2godmFsdWUuc3RyZWV0LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSB2YWx1ZSArICIgIjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaXR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gdmFsdWUuY2l0eSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnN0YXRlICsgIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnppcCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhZGRyZXNzICs9IHZhbHVlLnppcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjYWZ0ZXJSZW5kZXJDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRhaW5lcjogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHNlbGYuZ2V0Q29udGFpbmVyRWwoKTsKCiAgICAgICAgICAgICAgICAvLyBhcHBseSBhZGRpdGlvbmFsIGNzcwogICAgICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKCJhbHBhY2EtYWRkcmVzc2ZpZWxkIik7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hZGRyZXNzVmFsaWRhdGlvbiAmJiAhc2VsZi5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpLmFwcGVuZFRvKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJ1dHRvbiA9ICQoJzxkaXYgY2xhc3M9ImFscGFjYS1mb3JtLWJ1dHRvbiI+U2hvdyBHb29nbGUgTWFwPC9kaXY+JykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWFwQnV0dG9uLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJ1dHRvbi5idXR0b24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvb2dsZSAmJiBnb29nbGUubWFwcykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHNlbGYuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlb2NvZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcyc6IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENhbnZhc0lkID0gc2VsZi5nZXRJZCgpICsgIi1tYXAtY2FudmFzIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjJyArIG1hcENhbnZhc0lkKS5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiPGRpdiBpZD0nIiArIG1hcENhbnZhc0lkICsgIicgY2xhc3M9J2FscGFjYS1maWVsZC1hZGRyZXNzLW1hcGNhbnZhcyc+PC9kaXY+IikuYXBwZW5kVG8oc2VsZi5nZXRGaWVsZEVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZ2V0SWQoKSArICItbWFwLWNhbnZhcyIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInpvb20iOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwVHlwZUlkIjogZ29vZ2xlLm1hcHMuTWFwVHlwZUlkLlJPQURNQVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwbGF5TWVzc2FnZSgiR2VvY29kaW5nIGZhaWxlZDogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BsYXlNZXNzYWdlKCJHb29nbGUgTWFwIEFQSSBpcyBub3QgaW5zdGFsbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkud3JhcCgnPHNtYWxsLz4nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5zaG93TWFwT25Mb2FkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFueSI7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQWRkcmVzcyI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN0YW5kYXJkIFVTIEFkZHJlc3Mgd2l0aCBTdHJlZXQsIENpdHksIFN0YXRlIGFuZCBaaXAuIEFsc28gY29tZXMgd2l0aCBzdXBwb3J0IGZvciBHb29nbGUgbWFwLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRlQWRkcmVzcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFkZHJlc3MgVmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmFibGUgYWRkcmVzcyB2YWxpZGF0aW9uIGlmIHRydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd01hcE9uTG9hZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIldoZXRoZXIgdG8gc2hvdyB0aGUgbWFwIHdoZW4gZmlyc3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0ZUFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiQWRkcmVzcyB2YWxpZGF0aW9uIGlmIGNoZWNrZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHRMYWJlbCI6ICJFbmFibGUgR29vZ2xlIE1hcCBmb3IgYWRkcmVzcyB2YWxpZGF0aW9uPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJhZGRyZXNzIiwgQWxwYWNhLkZpZWxkcy5BZGRyZXNzRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuQ0tFZGl0b3JGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNLRWRpdG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNrZWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY2tlZGl0b3IpID09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2tlZGl0b3IgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHJlbmRlciBDSyBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZihDS0VESVRPUikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIEFscGFjYSB0byBkZWNsYXJlIHRoZSBET00gc3dhcHBlZCBhbmQgcmVhZHkgYmVmb3JlIHdlIGF0dGVtcHQgdG8gZG8gYW55dGhpbmcgd2l0aCBDS0VkaXRvcgogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZSgkKHNlbGYuY29udHJvbClbMF0sIHNlbGYub3B0aW9ucy5ja2VkaXRvcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0Q0tFZGl0b3JFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBja2VkaXRvcidzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggaGVyZSBiZWNhdXNlIENLRWRpdG9yIGhhcyBhbiBpc3N1ZSBpZiBET00gZWxlbWVudCBkZWxldGVzIGJlZm9yZSBDS0VkaXRvciBjbGVhbnMgdXAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbGVtb25kZS9hbmd1bGFyLWNrZWRpdG9yL2lzc3Vlcy83CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHNlbGYuZWRpdG9yLmRlc3Ryb3koZmFsc2UpOyB9IGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBpbml0Q0tFZGl0b3JFdmVudHM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyV2l0aFByb3BhZ2F0aW9uKCJjaGFuZ2UiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCdibHVyJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigiYmx1ciIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJmb2N1cyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkZvY3VzLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8ga2V5cHJlc3MgZXZlbnQKICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXkiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5cHJlc3MiLCBlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBDS0VkaXRvcj8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgLy8ga2V5dXAgZXZlbnQKICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigia2V5dXAiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXl1cCIsIGUpOwogICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAvLyBrZXlkb3duIGV2ZW50CiAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleWRvd24iLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleWRvd24iLCBlKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gYmUgc3VyZSB0byBjYWxsIGludG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0RGF0YSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuQ29udHJvbEZpZWxkI2dldENvbnRyb2xWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIHZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmVkaXRvci5nZXREYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgcGx1Z2luIGluc3RhbmNlCiAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWxsIHVwIHRvIGJhc2UgbWV0aG9kCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgLAogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJDSyBFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgQ0sgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2tlZGl0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDSyBFZGl0b3Igb3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVc2UgdGhpcyBlbnRyeSB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDS0VkaXRvciBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNrZWRpdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNrZWRpdG9yIiwgQWxwYWNhLkZpZWxkcy5DS0VkaXRvckZpZWxkKTsKCn0pKGpRdWVyeSk7CgovKioKICogVXNlcyB0aGUgc3BlY3RydW0gcGx1Z2luIHRvIHByb3ZpZGUgYSBjb2xvciBwaWNrZXIuCiAqIFRoaXMgdXNlZCB0byByZWx5IG9uIEhUTUw1IGJ1dCBubyBsb25nZXIuCiAqLwooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuc3BlY3RydW1BdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzZWxmLmlzRGlzcGxheU9ubHkoKSAmJiB0eXBlb2YoJC5mbi5zcGVjdHJ1bSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNwZWN0cnVtQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImNvbG9yIjsKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIiAmJiBzZWxmLnNwZWN0cnVtQXZhaWxhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgICAgICBpZiAoc2VsZi5zcGVjdHJ1bUF2YWlsYWJsZSl7CiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0pID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLnNob3dJbnB1dCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zcGVjdHJ1bS5zaG93SW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuc3BlY3RydW0ucHJlZmVycmVkRm9ybWF0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwZWN0cnVtLnByZWZlcnJlZEZvcm1hdCA9ICJoZXgzIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnNwZWN0cnVtLmNsaWNrb3V0RmlyZXNDaGFuZ2UpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3BlY3RydW0uY2xpY2tvdXRGaXJlc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbiByZW5kZXIgdGhlIHNwZWN0cnVtIHBsdWdpbi4uLgogICAgICAgICAgICAgICAgaWYgKHNlbGYuc3BlY3RydW1BdmFpbGFibGUgJiYgc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoKHNlbGYuY29udHJvbClbMF0pLnNwZWN0cnVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHsgY29sb3I6IHNlbGYuZGF0YSB9LCBzZWxmLm9wdGlvbnMuc3BlY3RydW0pCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCdjaGFuZ2Uuc3BlY3RydW0nLCBmdW5jdGlvbihlLCB0aW55Y29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHNlbGYuY29udmVydFRpbnlDb2xvcih0aW55Y29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydFRpbnlDb2xvcjogZnVuY3Rpb24odGlueWNvbG9yKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRpbnljb2xvci50b0hleFN0cmluZygpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvbG9yIiwgQWxwYWNhLkZpZWxkcy5Db2xvckZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRTY2hlbWFGaWVsZE1hcHBpbmcoImNvbG9yIiwgImNvbG9yIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vbWpvbG5pYy5jb20vYm9vdHN0cmFwLWNvbG9ycGlja2VyLwogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Db2xvclBpY2tlckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4uY29sb3JwaWNrZXIpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVDb2xvclBpY2tlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLmNvbG9ycGlja2VyKSA9PT0gInVuZGVmaW5lZCIgJiYgIXNlbGYuc2ltcGxlQ29sb3JQaWNrZXJBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5jb2xvcnBpY2tlcikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3JwaWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNvbG9ycGlja2VyLmNvbG9yID0gc2VsZi5kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImNvbG9ycGlja2VyIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gcmVuZGVyIHRoZSBzcGVjdHJ1bSBwbHVnaW4uLi4KICAgICAgICAgICAgICAgIGlmIChzZWxmLnNpbXBsZUNvbG9yUGlja2VyQXZhaWxhYmxlICYmIHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKChzZWxmLmNvbnRyb2wpWzBdKS5jb2xvcnBpY2tlcihzZWxmLm9wdGlvbnMuY29sb3JwaWNrZXIpOwogICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CgogICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5vbignY2hhbmdlQ29sb3IuY29sb3JwaWNrZXInLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGV2ZW50LmNvbG9yLnRvSGV4KCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvbG9yIFBpY2tlciBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIGNvbG9yIHBpY2tlciBmb3Igc2VsZWN0aW5nIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjb2xvcnBpY2tlciIsIEFscGFjYS5GaWVsZHMuQ29sb3JQaWNrZXJGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5Db3VudHJ5RmllbGQgPSBBbHBhY2EuRmllbGRzLlNlbGVjdEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuQ291bnRyeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjb3VudHJ5IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0gPSBbXTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9wdGlvbkxhYmVscyA9IFtdOwoKICAgICAgICAgICAgdmFyIGNvdW50cmllc01hcCA9IHRoaXMuZ2V0TWVzc2FnZSgiY291bnRyaWVzIik7CiAgICAgICAgICAgIGlmIChjb3VudHJpZXNNYXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGNvdW50cnlLZXkgaW4gY291bnRyaWVzTWFwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hWyJlbnVtIl0ucHVzaChjb3VudHJ5S2V5KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gY291bnRyaWVzTWFwW2NvdW50cnlLZXldOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkNvdW50cnkgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBjb3VudHJpZXMga2V5ZWQgYnkgdGhlaXIgSVNPMyBjb2RlLiAgVGhlIG5hbWVzIG9mIHRoZSBjb3VudHJpZXMgYXJlIHJlYWQgZnJvbSB0aGUgSTE4TiBidW5kbGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldE9wdGlvbnNGb3JPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImNvdW50cnkiLCBBbHBhY2EuRmllbGRzLkNvdW50cnlGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJjb3VudHJ5IiwgImNvdW50cnkiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciByb3VuZCA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyYXRlZ2llcyA9IHsKICAgICAgICAgICAgdXA6ICAgICAgTWF0aC5jZWlsLAogICAgICAgICAgICBkb3duOiAgICBmdW5jdGlvbihpbnB1dCkgeyByZXR1cm4gfn5pbnB1dDsgfSwKICAgICAgICAgICAgbmVhcmVzdDogTWF0aC5yb3VuZAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVnaWVzW3N0cmF0ZWd5XTsKICAgICAgICB9OwogICAgfSkoKTsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5DdXJyZW5jeUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBDdXJyZW5jeSBDb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgRXJyb3IgY2FsbGJhY2suCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICB2YXIgcGZPcHRpb25zU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGZPcHRpb25zU2NoZW1hKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gcGZPcHRpb25zU2NoZW1hW2ldOwogICAgICAgICAgICAgICAgaWYgKCEoaSBpbiBvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25bImRlZmF1bHQiXSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YSkgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkYXRhID0gIiIgKyBwYXJzZUZsb2F0KGRhdGEpLnRvRml4ZWQob3B0aW9ucy5jZW50c0xpbWl0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IsIGVycm9yQ2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJjdXJyZW5jeSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICQoZmllbGQpLnByaWNlRm9ybWF0KHNlbGYub3B0aW9ucyk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0Q29udHJvbEVsKCk7CgogICAgICAgICAgICB2YXIgdmFsID0gJChmaWVsZCkuaXMoJ2lucHV0JykgPyBmaWVsZC52YWwoKSA6IGZpZWxkLmh0bWwoKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bm1hc2sgfHwgdGhpcy5vcHRpb25zLnJvdW5kICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHZhciB1bm1hc2tlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyID0gdmFsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGN1cikgfHwgY3VyID09PSAiLSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09PSB0aGlzLm9wdGlvbnMuY2VudHNTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0KTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb3VuZCAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICAgICAgdW5tYXNrZWQgPSByb3VuZCh0aGlzLm9wdGlvbnMucm91bmQpKHVubWFza2VkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy51bm1hc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXNrZWRTdHJpbmcgPSAiIiArIHVubWFza2VkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsW2ldKSB8fCB2YWxbaV0gPT09ICItIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVubWFza2VkU3RyaW5nW3UrK10gfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdW5tYXNrZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiQ3VycmVuY3kgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gYXV0b21hdGljYWxseSBmb3JtYXR0ZWQgYW5kIGNvbmZpZ3VyYWJsZSBpbnB1dCBmb3IgZW50ZXJpbmcgY3VycmVuY3kgYW1vdW50cy4iOwogICAgICAgIH0sCgogICAgICAgIGdldFNjaGVtYU9mUHJpY2VGb3JtYXRPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJhbGxvd05lZ2F0aXZlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQWxsb3cgTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhbGxvd2VkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2VudHNMaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNlbnRzIExpbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsaW1pdCBvZiBmcmFjdGlvbmFsIGRpZ2l0cy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzU2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2VudHMgU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBzZXBhcmF0b3IgYmV0d2VlbiB3aG9sZSBhbmQgZnJhY3Rpb25hbCBhbW91bnRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNsZWFyUHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2xlYXIgUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGVybWluZXMgaWYgdGhlIHByZWZpeCBpcyBjbGVhcmVkIG9uIGJsdXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkNsZWFyIFN1ZmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBzdWZmaXggaXMgY2xlYXJlZCBvbiBibHVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0UGx1c1NpZ24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQbHVzIFNpZ24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyBpZiBhIHBsdXMgc2lnbiBzaG91bGQgYmUgaW5zZXJ0ZWQgZm9yIHBvc2l0aXZlIHZhbHVlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTGltaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaW1pdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicHJlZml4IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUHJlZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwcmVmaXggaWYgYW55IGZvciB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm91bmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJSb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBpcyByb3VuZGVkLiAoUm91bmRpbmcgaXMgZG9uZSB3aGVuIGdldFZhbHVlIGlzIGNhbGxlZCBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgVUkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbICJ1cCIsICJkb3duIiwgIm5lYXJlc3QiLCAibm9uZSIgXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibm9uZSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTdWZmaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHN1ZmZpeCBpZiBhbnkgZm9yIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInRob3VzYW5kc1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRob3VzYW5kcyBTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRob3VzYW5kcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIsIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVubWFzayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlVubWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgdGhpcyBmaWVsZCB3aWxsIGJlIHVubWFza2VkLiAgVGhhdCBpcywgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIGJlIGEgZmxvYXQgaW5zdGVhZCBvZiBhIHN0cmluZyAod2l0aCB0aGUgcHJlZml4LCBzdWZmaXgsIGV0Yy4gcmVtb3ZlZCkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgdGhpcy5nZXRTY2hlbWFPZlByaWNlRm9ybWF0T3B0aW9ucygpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93TmVnYXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNlbnRzTGltaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjZW50c1NlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJjbGVhclByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2xlYXJTdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluc2VydFBsdXNTaWduIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInByZWZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb3VuZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic2VsZWN0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNTZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1bm1hc2siOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJjdXJyZW5jeSIsIEFscGFjYS5GaWVsZHMuQ3VycmVuY3lGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBOT1RFOiB0aGlzIHJlcXVpcmVzIGJvb3RzdHJhcC1kYXRldGltZXBpY2tlci5qcwogICAgLy8gTk9URTogdGhpcyByZXF1aXJlcyBtb21lbnQuanMKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5EYXRlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJkYXRlIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0RGF0ZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gImRhdGUiOwogICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGUiOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMucGlja2VyLnVzZUN1cnJlbnQpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci51c2VDdXJyZW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRhdGUgZm9ybWF0CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQpIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0ID0gc2VsZi5vcHRpb25zLnBpY2tlci5mb3JtYXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLmdldERlZmF1bHRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZm9ybWF0KSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmZvcm1hdCA9IHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIubG9jYWxlKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGlja2VyLmxvY2FsZSA9IEFscGFjYS5kZWZhdWx0TG9jYWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5waWNrZXIuZGF5Vmlld0hlYWRlckZvcm1hdCkgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnBpY2tlci5kYXlWaWV3SGVhZGVyRm9ybWF0ID0gIk1NTU0gWVlZWSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGV4dHJhIGZvcm1hdHMKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgdmFyIGV4dHJhRm9ybWF0cyA9IHNlbGYuZ2V0RGVmYXVsdEV4dHJhRm9ybWF0cygpOwogICAgICAgICAgICAgICAgaWYgKGV4dHJhRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzID0gZXh0cmFGb3JtYXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYW51YWxFbnRyeSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWFudWFsRW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIAogICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWFudWFsRW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBiZWZvcmVSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmZpZWxkLmNzcygicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNhZnRlclJlbmRlckNvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykgewoKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi52aWV3LnR5cGUgIT09ICJkaXNwbGF5IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5kYXRldGltZXBpY2tlcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0ZXRpbWVwaWNrZXIoc2VsZi5vcHRpb25zLnBpY2tlcik7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlciA9IHNlbGYuZ2V0Q29udHJvbEVsKCkuZGF0YSgiRGF0ZVRpbWVQaWNrZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja2VyICYmIHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpY2tlci5mb3JtYXQoc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBpY2tlcikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQgPSBzZWxmLnBpY2tlci5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBkYXRlLXRpbWUgcGlja2VyLCB0cmlnZ2VyIGNoYW5nZSB1c2luZyBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRGaWVsZEVsKCkub24oImRwLmNoYW5nZSIsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSB0aW1lb3V0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gcnVuIEFGVEVSIGNvbnRyb2wgY2xpY2sgaGFuZGxlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZS5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgaWYgcHJvdmlkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWNrZXIuZGF0ZShzZWxmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgbWFudWFsIGVudHJ5IG1vZGUgdG8gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1hbnVhbEVudHJ5CiAgICAgICAgICovCiAgICAgICAgc2V0TWFudWFsRW50cnk6IGZ1bmN0aW9uKG1hbnVhbEVudHJ5KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hbnVhbEVudHJ5ID0gbWFudWFsRW50cnk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWVsZCB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgRGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEYXRlfSBGaWVsZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBnZXREYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5waWNrZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IChzZWxmLnBpY2tlci5kYXRlKCkgPyBzZWxmLnBpY2tlci5kYXRlKCkuX2Q6IG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGZpZWxkIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCBEYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0RhdGV9IEZpZWxkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkNoYW5nZQogICAgICAgICAqLwogICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnJlZnJlc2hWYWxpZGF0aW9uU3RhdGUoKTsKICAgICAgICB9LAoKICAgICAgICBpc0F1dG9Gb2N1c2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZURhdGVGb3JtYXQoKTsKICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZERhdGUiXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogc3RhdHVzID8gIiIgOiBBbHBhY2Euc3Vic3RpdHV0ZVRva2Vucyh0aGlzLmdldE1lc3NhZ2UoImludmFsaWREYXRlIiksIFt0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1siaW52YWxpZERhdGUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGRhdGUgZm9ybWF0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSB2YWxpZCBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlRGF0ZUZvcm1hdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5kYXRlRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzZWxmLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgc2VsZi5pc1JlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgZm9ybWF0cwogICAgICAgICAgICAgICAgICAgIHZhciBkYXRlRm9ybWF0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXRzLnB1c2goc2VsZi5vcHRpb25zLmRhdGVGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucGlja2VyICYmIHNlbGYub3B0aW9ucy5waWNrZXIuZXh0cmFGb3JtYXRzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdHMucHVzaChzZWxmLm9wdGlvbnMucGlja2VyLmV4dHJhRm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZUZvcm1hdHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCB8fCBBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWx1ZSk7CgogICAgICAgICAgICBpZiAodGhpcy5waWNrZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChBbHBhY2EubW9tZW50KHZhbHVlLCBzZWxmLm9wdGlvbnMuZGF0ZUZvcm1hdCwgdHJ1ZSkuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmRhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLnBpY2tlciA9IG51bGw7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkRhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRGF0ZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IGRhdGEgZm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiJkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iIDogWyJkYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6dHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRGF0ZSBGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGF0ZSBmb3JtYXQgKHVzaW5nIG1vbWVudC5qcyBmb3JtYXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGV0aW1lUGlja2VyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJkYXRlRm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInBpY2tlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWREYXRlIjogIkludmFsaWQgZGF0ZSBmb3IgZm9ybWF0IHswfSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiZGF0ZSIsIEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUiLCAiZGF0ZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRGF0ZXRpbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuRGF0ZUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkLnByb3RvdHlwZQogICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJkYXRldGltZSI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiICIgKyBBbHBhY2EuZGVmYXVsdFRpbWVGb3JtYXQ7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBnZXREZWZhdWx0RXh0cmFGb3JtYXRzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHREYXRlRm9ybWF0ICsgIiBoaDptbTpzcyBhIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQgKyAiIEhIOm1tIiwKICAgICAgICAgICAgICAgICAgICBBbHBhY2EuZGVmYXVsdERhdGVGb3JtYXQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJkYXRldGltZSI7CiAgICAgICAgICAgICAgICAvL3RoaXMuaW5wdXRUeXBlID0gImRhdGV0aW1lIjsKCiAgICAgICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgICAgICwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIkRhdGV0aW1lIEZpZWxkIGJhc2VkIG9uIDxhIGhyZWY9J2h0dHA6Ly9lb25hc2Rhbi5naXRodWIuaW8vYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyc+Qm9vdHN0cmFwIERhdGVUaW1lIFBpY2tlcjwvYT4uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImRhdGV0aW1lIiwgQWxwYWNhLkZpZWxkcy5EYXRldGltZUZpZWxkKTsKCiAgICAvLyAiZGF0ZXRpbWUiIGlzIGxlZ2FjeSAocHJlIHY0IHNjaGVtYSkKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGV0aW1lIiwgImRhdGV0aW1lIik7CgogICAgLy8gb2ZmaWNpYWwgdjQgdXNlcyBkYXRlLXRpbWUKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImRhdGUtdGltZSIsICJkYXRldGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkVkaXRvckZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlVGhlbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hY2VUaGVtZSA9ICJhY2UvdGhlbWUvY2hyb21lIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuYWNlTW9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmFjZU1vZGUgPSAiYWNlL21vZGUvanNvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmJlYXV0aWZ5KSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmJlYXV0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWF1dGlmeSAmJiB0aGlzLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2pzb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChBbHBhY2EuaXNPYmplY3QodGhpcy5kYXRhKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nIHRvIGZvcm1hdCBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsICIgICAgIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc1N0cmluZyh0aGlzLmRhdGEpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBvYmplY3QgYW5kIHRoZW4gYmFjayB0byBzdHJpbmcgdG8gZm9ybWF0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGhpcy5kYXRhKSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvaHRtbCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihodG1sX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBodG1sX2JlYXV0aWZ5KHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuYWNlTW9kZSA9PT0gImFjZS9tb2RlL2NzcyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjc3NfYmVhdXRpZnkpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGNzc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZU1vZGUgPT09ICJhY2UvbW9kZS9qYXZhc2NyaXB0IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGpzX2JlYXV0aWZ5KSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc19iZWF1dGlmeSh0aGlzLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5hY2VNb2RlID09PSAiYWNlL21vZGUvanNvbiIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YSA9PT0gInt9IikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAie1xuXHRcbn0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBIRUlHSFQKICAgICAgICAgICAgICAgICAgICB2YXIgYWNlSGVpZ2h0ID0gc2VsZi5vcHRpb25zLmFjZUhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmNzcygiaGVpZ2h0IiwgYWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIEFDRSBXSURUSAogICAgICAgICAgICAgICAgICAgIHZhciBhY2VXaWR0aCA9IHNlbGYub3B0aW9ucy5hY2VXaWR0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVdpZHRoID0gIjEwMCUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuY3NzKCJ3aWR0aCIsIGFjZVdpZHRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsb2NhdGUgd2hlcmUgd2Ugd2lsbCBpbnNlcnQgdGhlIGVkaXRvcgogICAgICAgICAgICAgICAgdmFyIGVsID0gJChzZWxmLmNvbnRyb2wpWzBdOwoKICAgICAgICAgICAgICAgIC8vIGFjZSBtdXN0IGJlIGluY2x1ZGVkIGFoZWFkIG9mIHRpbWUKICAgICAgICAgICAgICAgIGlmICghYWNlICYmIHdpbmRvdy5hY2UpIHsKICAgICAgICAgICAgICAgICAgICBhY2UgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghYWNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFscGFjYS5sb2dFcnJvcigiRWRpdG9yIEZpZWxkIGlzIG1pc3NpbmcgdGhlICdhY2UnIENsb3VkIDkgRWRpdG9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IgPSBhY2UuZWRpdChlbCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0T3B0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heExpbmVzOiBJbmZpbml0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuc2V0VXNlV3JhcE1vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW1lCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjZVRoZW1lID0gc2VsZi5vcHRpb25zLmFjZVRoZW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnNldFRoZW1lKGFjZVRoZW1lKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBhY2VNb2RlID0gc2VsZi5vcHRpb25zLmFjZU1vZGU7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoYWNlTW9kZSk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLnJlbmRlcmVyLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZWRpdG9yLnJlbmRlcmVyLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlKGZhbHNlKTsgLy8gbm90IGltcGxlbWVudGVkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRhdGEgb250byBlZGl0b3IKICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0VmFsdWUoc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB1bmRvIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBGSVQtQ09OVEVOVCB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgdG8gdGhlIGNvbnRlbnRzIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmFjZUZpdENvbnRlbnRIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0VXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTU4NDA2MS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBzZWxmLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0U2NyZWVuTGVuZ3RoKCkgKiBzZWxmLmVkaXRvci5yZW5kZXJlci5saW5lSGVpZ2h0ICsgc2VsZi5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsQmFyLmdldFdpZHRoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmhlaWdodChuZXdIZWlnaHQudG9TdHJpbmcoKSArICJweCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBpcyByZXF1aXJlZCBmb3IgdGhlIGVkaXRvciB0byBmaXggYWxsIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5uZXIgc3RydWN0dXJlIGZvciBhZGFwdGluZyB0byBhIGNoYW5nZSBpbiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZXNpemUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHNpemUgdG8gbWF0Y2ggaW5pdGlhbCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFVwZGF0ZUZ1bmN0aW9uKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciBhIGNoYW5nZSBoYXBwZW5zIGluc2lkZSB0aGUgQUNFIGVkaXRvciwgdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLmdldFNlc3Npb24oKS5vbignY2hhbmdlJywgaGVpZ2h0VXBkYXRlRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEucmVhZG9ubHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5zZXRSZWFkT25seSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlZGl0b3IncyBkb20gZWxlbWVudCBnZXRzIGRlc3Ryb3llZCwgbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgd2UgZXhwZWN0IEFscGFjYSBmaWVsZHMgdG8gYmUgZGVzdHJveWVkIGJ5IHRoZSBkZXN0cm95KCkgbWV0aG9kIGJ1dCB0aGV5IG1heSBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5lZC11cCB2aWEgdGhlIERPTSwgdGh1cyB3ZSBjaGVjayBoZXJlLgogICAgICAgICAgICAgICAgICAgICQoZWwpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2Rlc3Ryb3kKICAgICAgICAgKi8KICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBlZGl0b3IgaW5zdGFuY2UKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhbGwgdXAgdG8gYmFzZSBtZXRob2QKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgQUNFIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAqLwogICAgICAgIGdldEVkaXRvcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgd29yZENvdW50U3RhdHVzID0gIHRoaXMuX3ZhbGlkYXRlV29yZENvdW50KCk7CiAgICAgICAgICAgIHZhbEluZm9bIndvcmRMaW1pdEV4Y2VlZGVkIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHdvcmRDb3VudFN0YXR1cyA/ICIiIDogQWxwYWNhLnN1YnN0aXR1dGVUb2tlbnModGhpcy5nZXRNZXNzYWdlKCJ3b3JkTGltaXRFeGNlZWRlZCIpLCBbdGhpcy5vcHRpb25zLndvcmRsaW1pdF0pLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHdvcmRDb3VudFN0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGVkaXRvckFubm90YXRpb25zU3RhdHVzID0gdGhpcy5fdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9ucygpOwogICAgICAgICAgICB2YWxJbmZvWyJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0Il0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IGVkaXRvckFubm90YXRpb25zU3RhdHVzID8gIiIgOiB0aGlzLmdldE1lc3NhZ2UoImVkaXRvckFubm90YXRpb25zRXhpc3QiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBlZGl0b3JBbm5vdGF0aW9uc1N0YXR1cwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sid29yZExpbWl0RXhjZWVkZWQiXVsic3RhdHVzIl0gJiYgdmFsSW5mb1siZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCJdWyJzdGF0dXMiXTsKICAgICAgICB9LAoKICAgICAgICBfdmFsaWRhdGVFZGl0b3JBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLmVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGUgZm9yIHdvcmQgbGltaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgd29yZCBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVXb3JkQ291bnQ6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29yZGxpbWl0ICYmIHRoaXMub3B0aW9ucy53b3JkbGltaXQgPiAtMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgaWYgKHZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGNvdW50ID0gdmFsLnNwbGl0KCIgIikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkY291bnQgPiB0aGlzLm9wdGlvbnMud29yZGxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yY2UgZWRpdG9yIHRvIHJlc2l6ZSB0byBlbnN1cmUgaXQgZ2V0cyBkcmF3biBjb3JyZWN0bHkuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgb25EZXBlbmRlbnRSZXZlYWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVzaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKkBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmLnNjaGVtYS50eXBlID09ICJvYmplY3QiICYmIEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIiAgICAiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGV4cGVjdGVkIHR5cGUgYmFjayBpcyAib2JqZWN0Iiwgd2UgZG8gdGhlIGNvbnZlcnNpb24KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnR5cGUgPT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFZGl0b3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWNlVGhlbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRWRpdG9yIFRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgdGhlbWUgdG8gc2V0IG9udG8gdGhlIGVkaXRvciBpbnN0YW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogImFjZS90aGVtZS90d2lsaWdodCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBNb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgbW9kZSB0byBzZXQgb250byB0aGUgZWRpdG9yIGluc3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiYWNlL21vZGUvamF2YXNjcmlwdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VXaWR0aCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkFDRSBFZGl0b3IgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwMCUiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWNlSGVpZ2h0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiQUNFIEVkaXRvciBIZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHdyYXBwaW5nIGRpdiBhcm91bmQgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjMwMHB4IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFjZUZpdENvbnRlbnRIZWlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBQ0UgRml0IENvbnRlbnQgSGVpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbmZpZ3VyZXMgdGhlIEFDRSBFZGl0b3IgdG8gYXV0by1maXQgaXRzIGhlaWdodCB0byB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAid29yZGxpbWl0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiV29yZCBMaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaW1pdHMgdGhlIG51bWJlciBvZiB3b3JkcyBhbGxvd2VkIGluIHRoZSB0ZXh0IGFyZWEuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJhY2VUaGVtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhY2VNb2RlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIndvcmRsaW1pdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwoKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAid29yZExpbWl0RXhjZWVkZWQiOiAiVGhlIG1heGltdW0gd29yZCBsaW1pdCBvZiB7MH0gaGFzIGJlZW4gZXhjZWVkZWQuIiwKICAgICAgICAiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJUaGUgZWRpdG9yIGhhcyBlcnJvcnMgaW4gaXQgdGhhdCBtdXN0IGJlIGNvcnJlY3RlZCIKICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVkaXRvciIsIEFscGFjYS5GaWVsZHMuRWRpdG9yRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuRW1haWxGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJlbWFpbCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAiZW1haWwiOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJlbWFpbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLmVtYWlsOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRFbWFpbCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJFbWFpbCBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMuZW1haWw7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoiZW1haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJlbWFpbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkRW1haWwiOiAiSW52YWxpZCBFbWFpbCBhZGRyZXNzIGUuZy4gaW5mb0BjbG91ZGNtcy5jb20iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImVtYWlsIiwgQWxwYWNhLkZpZWxkcy5FbWFpbEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImVtYWlsIiwgImVtYWlsIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQgPSBBbHBhY2EuRmllbGRzLkFycmF5RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5HcmlkRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJncmlkIjsKICAgICAgICB9LAoKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5ncmlkKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyaWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udGFpbmVyOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGRhdGEgYXJyYXkgaW50byB0aGUgZ3JpZCdzIGV4cGVjdGVkIGZvcm1hdAogICAgICAgICAgICAgICAgdmFyIGdyaWREYXRhID0gW107CgogICAgICAgICAgICAgICAgLy8gYWRkIGluIGhlYWRlcnMKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VsZi5vcHRpb25zLmZpZWxkcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGREZWZpbml0aW9uID0gc2VsZi5vcHRpb25zLmZpZWxkc1trZXldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRGVmaW5pdGlvbi5sYWJlbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZmllbGREZWZpbml0aW9uLmxhYmVsOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWREYXRhLnB1c2goaGVhZGVycyk7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gc2VsZi5kYXRhW2ldKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goc2VsZi5kYXRhW2ldW2tleTJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChyb3cpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICB2YXIgZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgWyJNYXNlcmF0aSIsICJNYXpkYSIsICJNZXJjZWRlcyIsICJNaW5pIiwgIk1pdHN1YmlzaGkiXSwKICAgICAgICAgICAgICAgICAgICBbIjIwMDkiLCAwLCAyOTQxLCA0MzAzLCAzNTQsIDU4MTRdLAogICAgICAgICAgICAgICAgICAgIFsiMjAxMCIsIDUsIDI5MDUsIDI4NjcsIDQxMiwgNTI4NF0sCiAgICAgICAgICAgICAgICAgICAgWyIyMDExIiwgNCwgMjUxNywgNDgyMiwgNTUyLCA2MTI3XSwKICAgICAgICAgICAgICAgICAgICBbIjIwMTIiLCAyLCAyNDIyLCA1Mzk5LCA3NzYsIDQxNTFdCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICB2YXIgaG9sZGVyID0gJChzZWxmLmNvbnRhaW5lcikuZmluZCgiLmFscGFjYS1jb250YWluZXItZ3JpZC1ob2xkZXIiKTsKCiAgICAgICAgICAgICAgICB2YXIgZ3JpZENvbmZpZyA9IHNlbGYub3B0aW9ucy5ncmlkOwogICAgICAgICAgICAgICAgZ3JpZENvbmZpZy5kYXRhID0gZ3JpZERhdGE7CgogICAgICAgICAgICAgICAgJChob2xkZXIpLmhhbmRzb250YWJsZShncmlkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImFycmF5IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkdyaWQgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJSZW5kZXJzIGFycmF5IGl0ZW1zIGludG8gYSBncmlkIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImdyaWQiLCBBbHBhY2EuRmllbGRzLkdyaWRGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5JbWFnZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImltYWdlIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbWFnZSBGaWVsZC4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygiaW1hZ2UiLCBBbHBhY2EuRmllbGRzLkltYWdlRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuSW50ZWdlckZpZWxkID0gQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImludGVnZXIiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpID09ICJ1bmRlZmluZWQiIHx8ICIiID09IHZhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI29uQ2hhbmdlCiAgICAgICAgICovCiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIuc2xpZGVyKCJ2YWx1ZSIsIHRoaXMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjcG9zdFJlbmRlcgogICAgICAgICAqLwogICAgICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuc2xpZGVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICghQWxwYWNhLmlzRW1wdHkoc2VsZi5zY2hlbWEubWF4aW11bSkgJiYgIUFscGFjYS5pc0VtcHR5KHNlbGYuc2NoZW1hLm1pbmltdW0pKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmFmdGVyKCc8ZGl2IGlkPSJzbGlkZXIiPjwvZGl2PicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2xpZGVyID0gJCgnI3NsaWRlcicsIHNlbGYuY29udHJvbC5wYXJlbnQoKSkuc2xpZGVyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5nZXRWYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogc2VsZi5zY2hlbWEubWluaW11bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHNlbGYuc2NoZW1hLm1heGltdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHVpLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLl92YWxpZGF0ZUludGVnZXIoKTsKICAgICAgICAgICAgdmFsSW5mb1sic3RyaW5nTm90QU51bWJlciJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBzdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QW5JbnRlZ2VyIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1czsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWxpZGF0ZXMgaWYgaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGFuIGludGVnZXIKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVJbnRlZ2VyOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBnZXQgdmFsdWUgYXMgdGV4dAogICAgICAgICAgICB2YXIgdGV4dFZhbHVlID0gdGhpcy5fZ2V0Q29udHJvbFZhbCgpOwogICAgICAgICAgICBpZiAodHlwZW9mKHRleHRWYWx1ZSkgPT09ICJudW1iZXIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXh0VmFsdWUgPSAiIiArIHRleHRWYWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1ZhbEVtcHR5KHRleHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjaGVjayBpZiB2YWxpZCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICB2YXIgdmFsaWROdW1iZXIgPSBBbHBhY2EudGVzdFJlZ2V4KEFscGFjYS5yZWdleHBzLmludGVnZXIsIHRleHRWYWx1ZSk7CiAgICAgICAgICAgIGlmICghdmFsaWROdW1iZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHdoYXQgdGhleSBlbnRlcmVkIHdhcyBhIG51bWJlcgogICAgICAgICAgICB2YXIgZmxvYXRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGZsb2F0VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5OdW1iZXJGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRmllbGQgZm9yIGludGVnZXJzLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZlNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNYXhpbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1heGltdW0gdmFsdWUgb2YgdGhlIHByb3BlcnR5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGl2aXNpYmxlQnkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEaXZpc2libGUgQnkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBkaXZpc2libGUgYnkgdGhpcyBudW1iZXIuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk51bWJlckZpZWxkI2dldE9wdGlvbnNGb3JTY2hlbWEKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJNaW5pbXVtIHZhbHVlIG9mIHRoZSBmaWVsZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiTWF4aW11bSB2YWx1ZSBvZiB0aGUgZmllbGQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkaXZpc2libGVCeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImhlbHBlciI6ICJQcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGlzIG51bWJlci4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlNsaWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJHZW5lcmF0ZSBqUXVlcnkgVUkgc2xpZGVyIGNvbnRyb2wgd2l0aCB0aGUgZmllbGQgaWYgdHJ1ZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuTnVtYmVyRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNsaWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0TGFiZWwiOiAiU2xpZGVyIGNvbnRyb2wgPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwZXIiOiAiR2VuZXJhdGUgc2xpZGVyIGNvbnRyb2wgaWYgc2VsZWN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGhpcyB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoImludGVnZXIiLCBBbHBhY2EuRmllbGRzLkludGVnZXJGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJpbnRlZ2VyIiwgImludGVnZXIiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLklQdjRGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuSVB2NEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImlwdjQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hLnBhdHRlcm4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICBpZiAoIXZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bInN0YXR1cyJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRJUHY0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIklQIEFkZHJlc3MgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiSVAgQWRkcmVzcyBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybik/IHRoaXMuc2NoZW1hLnBhdHRlcm4gOiBBbHBhY2EucmVnZXhwcy5pcHY0OwogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlBhdHRlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmllbGQgUGF0dGVybiBpbiBSZWd1bGFyIEV4cHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgZGF0YSBmb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaXAtYWRkcmVzcyJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ImlwLWFkZHJlc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewogICAgICAgICAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRJUHY0IjogIkludmFsaWQgSVB2NCBhZGRyZXNzLCBlLmcuIDE5Mi4xNjguMC4xIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJpcHY0IiwgQWxwYWNhLkZpZWxkcy5JUHY0RmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiaXAtYWRkcmVzcyIsICJpcHY0Iik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRhaW5lckZpZWxkI2dldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkgfHwgdHlwZW9mKHZhbHVlKSA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmJhc2UodmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQjZ2V0Q29udHJvbFZhbHVlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodmFsICYmIEFscGFjYS5pc1N0cmluZyh2YWwpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5fdmFsaWRhdGVKU09OKCk7CiAgICAgICAgICAgIHZhbEluZm9bInN0cmluZ05vdEFKU09OIl0gPSB7CiAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHN0YXR1cy5zdGF0dXMgPyAiIiA6IHRoaXMuZ2V0TWVzc2FnZSgic3RyaW5nTm90QUpTT04iKSArIiAiKyBzdGF0dXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBzdGF0dXMuc3RhdHVzCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gYmFzZVN0YXR1cyAmJiB2YWxJbmZvWyJzdHJpbmdOb3RBSlNPTiJdWyJzdGF0dXMiXSA7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIGlmIGl0IGlzIGEgdmFsaWQgSlNPTiBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSB2YWxpZCBKU09OIG9iamVjdAogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUpTT046IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0ZXh0VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsKCk7CgogICAgICAgICAgICAvLyBhbGxvdyBudWxsCiAgICAgICAgICAgIGlmIChBbHBhY2EuaXNWYWxFbXB0eSh0ZXh0VmFsdWUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICJzdGF0dXMiIDogdHJ1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0cmluZwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UodGV4dFZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBmb3JtYXQgdGhlIHN0cmluZyBhcyB3ZWxsCiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiA6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3Bvc3RSZW5kZXIKICAgICAgICAgKi8KICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGF1dG8tZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYmluZCgna2V5cHJlc3MnLCBmdW5jdGlvbihlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndpY2g7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEyMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmluc2VydEF0Q2FyZXQoJ30nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gOTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5pbnNlcnRBdENhcmV0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLmJpbmQoJ2tleXByZXNzJywgJ0N0cmwrbCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEZpZWxkRWwoKS5yZW1vdmVDbGFzcygiYWxwYWNhLWZpZWxkLWZvY3VzZWQiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjbGFzcyBmcm9tIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuYXR0cigndGl0bGUnLCdUeXBlIEN0cmwrTCB0byBmb3JtYXQgYW5kIHZhbGlkYXRlIHRoZSBKU09OIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJKU09OIEVkaXRvciI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiRWRpdG9yIGZvciBKU09OIG9iamVjdHMgd2l0aCBiYXNpYyB2YWxpZGF0aW9uIGFuZCBmb3JtYXR0aW5nLiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICAvLyBBZGRpdGlvbmFsIFJlZ2lzdHJhdGlvbnMKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAic3RyaW5nTm90QUpTT04iOiAiVGhpcyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBKU09OIHN0cmluZy4iCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJqc29uIiwgQWxwYWNhLkZpZWxkcy5KU09ORmllbGQpOwoKICAgICQuZm4uaW5zZXJ0QXRDYXJldCA9IGZ1bmN0aW9uIChteVZhbHVlKSB7CgogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL0lFIHN1cHBvcnQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHNlbCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgc2VsLnRleHQgPSBteVZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0IHx8IHRoaXMuc2VsZWN0aW9uU3RhcnQgPT0gJzAnKSB7IC8vIGpzaGludCBpZ25vcmU6bGluZQoKICAgICAgICAgICAgICAgIC8vTU9aSUxMQSAvIE5FVFNDQVBFIHN1cHBvcnQKICAgICAgICAgICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRQb3MpICsgbXlWYWx1ZSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKGVuZFBvcywgdGhpcy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zIC8qKyBteVZhbHVlLmxlbmd0aCovOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzdGFydFBvcyAvKisgbXlWYWx1ZS5sZW5ndGgqLzsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICs9IG15VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoKICAgICAqIGpRdWVyeSBIb3RrZXlzIFBsdWdpbgogICAgICogQ29weXJpZ2h0IDIwMTAsIEpvaG4gUmVzaWcKICAgICAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogICAgICoKICAgICAqIEJhc2VkIHVwb24gdGhlIHBsdWdpbiBieSBUenVyeSBCYXIgWW9jaGF5OgogICAgICogaHR0cDovL2dpdGh1Yi5jb20vdHp1cnlieS9ob3RrZXlzCiAgICAgKgogICAgICogT3JpZ2luYWwgaWRlYSBieToKICAgICAqIEJpbm55IFYgQSwgaHR0cDovL3d3dy5vcGVuanMuY29tL3NjcmlwdHMvZXZlbnRzL2tleWJvYXJkX3Nob3J0Y3V0cy8KICAgICovCiAgICBqUXVlcnkuaG90a2V5cyA9IHsKICAgICAgICB2ZXJzaW9uOiAiMC44IiwKCiAgICAgICAgc3BlY2lhbEtleXM6IHsKICAgICAgICAgICAgODogImJhY2tzcGFjZSIsIDk6ICJ0YWIiLCAxMzogInJldHVybiIsIDE2OiAic2hpZnQiLCAxNzogImN0cmwiLCAxODogImFsdCIsIDE5OiAicGF1c2UiLAogICAgICAgICAgICAyMDogImNhcHNsb2NrIiwgMjc6ICJlc2MiLCAzMjogInNwYWNlIiwgMzM6ICJwYWdldXAiLCAzNDogInBhZ2Vkb3duIiwgMzU6ICJlbmQiLCAzNjogImhvbWUiLAogICAgICAgICAgICAzNzogImxlZnQiLCAzODogInVwIiwgMzk6ICJyaWdodCIsIDQwOiAiZG93biIsIDQ1OiAiaW5zZXJ0IiwgNDY6ICJkZWwiLAogICAgICAgICAgICA5NjogIjAiLCA5NzogIjEiLCA5ODogIjIiLCA5OTogIjMiLCAxMDA6ICI0IiwgMTAxOiAiNSIsIDEwMjogIjYiLCAxMDM6ICI3IiwKICAgICAgICAgICAgMTA0OiAiOCIsIDEwNTogIjkiLCAxMDY6ICIqIiwgMTA3OiAiKyIsIDEwOTogIi0iLCAxMTA6ICIuIiwgMTExIDogIi8iLAogICAgICAgICAgICAxMTI6ICJmMSIsIDExMzogImYyIiwgMTE0OiAiZjMiLCAxMTU6ICJmNCIsIDExNjogImY1IiwgMTE3OiAiZjYiLCAxMTg6ICJmNyIsIDExOTogImY4IiwKICAgICAgICAgICAgMTIwOiAiZjkiLCAxMjE6ICJmMTAiLCAxMjI6ICJmMTEiLCAxMjM6ICJmMTIiLCAxNDQ6ICJudW1sb2NrIiwgMTQ1OiAic2Nyb2xsIiwgMTkxOiAiLyIsIDIyNDogIm1ldGEiCiAgICAgICAgfSwKCiAgICAgICAgc2hpZnROdW1zOiB7CiAgICAgICAgICAgICJgIjogIn4iLCAiMSI6ICIhIiwgIjIiOiAiQCIsICIzIjogIiMiLCAiNCI6ICIkIiwgIjUiOiAiJSIsICI2IjogIl4iLCAiNyI6ICImIiwKICAgICAgICAgICAgIjgiOiAiKiIsICI5IjogIigiLCAiMCI6ICIpIiwgIi0iOiAiXyIsICI9IjogIisiLCAiOyI6ICI6ICIsICInIjogIlwiIiwgIiwiOiAiPCIsCiAgICAgICAgICAgICIuIjogIj4iLCAgIi8iOiAiPyIsICAiXFwiOiAifCIKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoIGhhbmRsZU9iaiApIHsKICAgICAgICAvLyBPbmx5IGNhcmUgd2hlbiBhIHBvc3NpYmxlIGlucHV0IGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgIGlmICggdHlwZW9mIGhhbmRsZU9iai5kYXRhICE9PSAic3RyaW5nIiApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9yaWdIYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXIsCiAgICAgICAgICAgIGtleXMgPSBoYW5kbGVPYmouZGF0YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCIgIik7CgogICAgICAgIGhhbmRsZU9iai5oYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewogICAgICAgICAgICAvLyBEb24ndCBmaXJlIGluIHRleHQtYWNjZXB0aW5nIGlucHV0cyB0aGF0IHdlIGRpZG4ndCBkaXJlY3RseSBiaW5kIHRvCiAgICAgICAgICAgIGlmICggdGhpcyAhPT0gZXZlbnQudGFyZ2V0ICYmICgvdGV4dGFyZWF8c2VsZWN0L2kudGVzdCggZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgfHwKICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudHlwZSA9PT0gInRleHQiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2V5cHJlc3MgcmVwcmVzZW50cyBjaGFyYWN0ZXJzLCBub3Qgc3BlY2lhbCBrZXlzCiAgICAgICAgICAgIHZhciBzcGVjaWFsID0gZXZlbnQudHlwZSAhPT0gImtleXByZXNzIiAmJiBqUXVlcnkuaG90a2V5cy5zcGVjaWFsS2V5c1sgZXZlbnQud2hpY2ggXSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGV2ZW50LndoaWNoICkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIGtleSwgbW9kaWYgPSAiIiwgcG9zc2libGUgPSB7fTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGNvbWJpbmF0aW9ucyAoYWx0fGN0cmx8c2hpZnQrYW55dGhpbmcpCiAgICAgICAgICAgIGlmICggZXZlbnQuYWx0S2V5ICYmIHNwZWNpYWwgIT09ICJhbHQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImFsdCsiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gImN0cmwiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gImN0cmwrIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyBjb25zaXN0ZW50bHkgYWNyb3NzIHBsYXRmb3JtcwogICAgICAgICAgICBpZiAoIGV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgc3BlY2lhbCAhPT0gIm1ldGEiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gIm1ldGErIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBldmVudC5zaGlmdEtleSAmJiBzcGVjaWFsICE9PSAic2hpZnQiICkgewogICAgICAgICAgICAgICAgbW9kaWYgKz0gInNoaWZ0KyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3BlY2lhbCApIHsKICAgICAgICAgICAgICAgIHBvc3NpYmxlWyBtb2RpZiArIHNwZWNpYWwgXSA9IHRydWU7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgY2hhcmFjdGVyIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgcG9zc2libGVbIG1vZGlmICsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyAiJCIgY2FuIGJlIHRyaWdnZXJlZCBhcyAiU2hpZnQrNCIgb3IgIlNoaWZ0KyQiIG9yIGp1c3QgIiQiCiAgICAgICAgICAgICAgICBpZiAoIG1vZGlmID09PSAic2hpZnQrIiApIHsKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVsgalF1ZXJ5LmhvdGtleXMuc2hpZnROdW1zWyBjaGFyYWN0ZXIgXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHBvc3NpYmxlWyBrZXlzW2ldIF0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdIYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgalF1ZXJ5LmVhY2goWyAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIgXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHRoaXMgXSA9IHsgYWRkOiBrZXlIYW5kbGVyIH07CiAgICB9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5Mb3dlckNhc2VGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJsb3dlcmNhc2UiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodGhpcy5kYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0VmFsdWUKICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF2YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxvd2VyVmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmIChsb3dlclZhbHVlICE9IHRoaXMuZ2V0VmFsdWUoKSkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShsb3dlclZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNvbktleVByZXNzCiAgICAgICAgICovCiAgICAgICAgb25LZXlQcmVzczogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBBbHBhY2EubGF0ZXIoMjUsIHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBfdGhpcy5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0VmFsdWUodik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkxvd2VyY2FzZSBUZXh0IjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGxvd2VyY2FzZSB0ZXh0LiI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJsb3dlcmNhc2UiLCBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoImxvd2VyY2FzZSIsICJsb3dlcmNhc2UiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLk1hcEZpZWxkID0gQWxwYWNhLkZpZWxkcy5BcnJheUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuTWFwRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIm1hcCI7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyAtIGRhdGEgY2FuIGNvbWUgaW4gYXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IHRvIGFycmF5CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHRoaXMuZGF0YSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW107CgogICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IEFscGFjYS5jb3B5T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlWyJfa2V5Il0gPSBrZXk7CiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5wdXNoKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgQWxwYWNhLm1lcmdlT2JqZWN0KHRoaXMub3B0aW9ucywgewogICAgICAgICAgICAgICAgImZvcmNlUmV2YWxpZGF0aW9uIiA6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5kYXRhKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udGFpbmVyRmllbGQjZ2V0Q29udGFpbmVyVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYW5kIHdlJ3JlIG5vdCByZXF1aXJlZCwgaGFuZCBiYWNrIHVuZGVmaW5lZAogICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNSZXF1aXJlZCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcsIGNvbnZlcnQgYmFjayB0byBvYmplY3QKICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2hpbGRyZW5baV0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2WyJfa2V5Il07CiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYmFzZVN0YXR1cyA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgdmFyIHZhbEluZm8gPSB0aGlzLnZhbGlkYXRpb247CgogICAgICAgICAgICB2YXIgaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA9IHRoaXMuX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5KCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU1pc3NpbmciXSA9IHsKICAgICAgICAgICAgICAgICJtZXNzYWdlIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlNaXNzaW5nIiksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogaXNWYWxpZE1hcEtleXNOb3RFbXB0eQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlzVmFsaWRNYXBLZXlzVW5pcXVlID0gdGhpcy5fdmFsaWRhdGVNYXBLZXlzVW5pcXVlKCk7CiAgICAgICAgICAgIHZhbEluZm9bImtleU5vdFVuaXF1ZSJdID0gewogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZSA/ICIiIDogdGhpcy5nZXRNZXNzYWdlKCJrZXlOb3RVbmlxdWUiKSwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiBpc1ZhbGlkTWFwS2V5c1VuaXF1ZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXMgJiYgdmFsSW5mb1sia2V5TWlzc2luZyJdWyJzdGF0dXMiXSAmJiB2YWxJbmZvWyJrZXlOb3RVbmlxdWUiXVsic3RhdHVzIl07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQga2V5IGZpZWxkcyBhcmUgbm90IGVtcHR5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYga2V5cyBhcmUgbm90IGVtcHR5CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlTWFwS2V5c05vdEVtcHR5OiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFZhbGlkYXRlcyBpZiBrZXkgZmllbGRzIGFyZSB1bmlxdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBrZXlzIGFyZSB1bmlxdWUKICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVNYXBLZXlzVW5pcXVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHRydWU7CgogICAgICAgICAgICB2YXIga2V5cyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jaGlsZHJlbltpXS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgdmFyIGtleSA9IHZbIl9rZXkiXTsKCiAgICAgICAgICAgICAgICBpZiAoa2V5c1trZXldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSBrZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJNYXAgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkZpZWxkIGZvciBvYmplY3RzIHdpdGgga2V5L3ZhbHVlIHBhaXJzIHRoYXQgc2hhcmUgdGhlIHNhbWUgc2NoZW1hIGZvciB2YWx1ZXMuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm1hcCIsIEFscGFjYS5GaWVsZHMuTWFwRmllbGQpOwoKICAgIC8vIEFkZGl0aW9uYWwgUmVnaXN0cmF0aW9ucwogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJrZXlOb3RVbmlxdWUiOiAiS2V5cyBvZiBtYXAgZmllbGQgYXJlIG5vdCB1bmlxdWUuIiwKICAgICAgICAia2V5TWlzc2luZyI6ICJNYXAgY29udGFpbnMgYW4gZW1wdHkga2V5LiIKICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuT3B0aW9uVHJlZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5PcHRpb25UcmVlLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib3B0aW9udHJlZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZSA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUub3JkZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLm9yZGVyID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGVuc3VyZSBhbGwgb3B0aW9ucyBoYXZlIHNjaGVtYQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9ycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10uc2NoZW1hKSB7CiAgICAgICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJPcHRpb25UcmVlIHNlbGVjdG9yIGZvcjogIiArIGsgKyAiIGlzIG1pc3Npbmcgc2NoZW1hIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmVlLmRhdGEgPSBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2FsayBkYXRhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9wdGlvbnMudHJlZS5kYXRhW2ldOwoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtLmF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmVlLnNlbGVjdG9yc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10ub3B0aW9ucy5ub25lTGFiZWwgPSAiQ2hvb3NlLi4uIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNba10udHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdLm9wdGlvbnMudHlwZSA9ICJzZWxlY3QiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG9yZGVyIGZyb20gdGhlIG9wdGlvbnMgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZAogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy50cmVlLm9yZGVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJlZS5vcmRlciA9IFtdOwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLnB1c2goc2VsZi5vcHRpb25zLnRyZWUuc2VsZWN0b3JzW2tdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMudHJlZS5ob3Jpem9udGFsKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy50cmVlLmhvcml6b250YWwgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgbGlzdCBmb3Igb3B0aW9uIGxpc3Qga2V5L3ZhbHVlIGJhc2VkIG9uIGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZUxpc3RzID0ge307CiAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXMgPSB7fTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUuZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0uYXR0cmlidXRlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzZWxmLm9wdGlvbnMudHJlZS5kYXRhW2ldLmF0dHJpYnV0ZXNba107CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uVmFsdWVMaXN0c1tsb2NhdGlvbl0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFycmF5Lmxlbmd0aDsgeCsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbeF0udmFsdWUgPT09IHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrICsgIj0iICsgdjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25WYWx1ZXNbbG9jYXRpb25dID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0ge307CiAgICAgICAgfSwKCiAgICAgICAgdG9Mb2NhdGlvbjogZnVuY3Rpb24oYXR0cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbG9jYXRpb24gPSAicm9vdCI7CgogICAgICAgICAgICBmb3IgKHZhciBrIGluIGF0dHJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IGF0dHJzW2tdOwoKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGsgKyAiPSIgKyB2OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CiAgICAgICAgfSwKCiAgICAgICAgZXhpc3RzTG9jYXRpb25XaXRoUHJlZml4OiBmdW5jdGlvbihwcmVmaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5sb2NhdGlvblZhbHVlTGlzdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YocHJlZml4KSA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2FmdGVyUmVuZGVyQ29udHJvbAogICAgICAgICAqLwogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKSB7CgogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLm9wdGlvblRyZWVIb2xkZXIgPSAkKHNlbGYuZmllbGQpLmZpbmQoIi5vcHRpb250cmVlIik7CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnRyZWUuaG9yaXpvbnRhbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChzZWxmLmZpZWxkKS5hZGRDbGFzcygib3B0aW9udHJlZS1ob3Jpem9udGFsIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoT3B0aW9uVHJlZUNvbnRyb2xzKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHJlZnJlc2hPcHRpb25UcmVlQ29udHJvbHM6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgLy8gaGlkZSBhbGwgb2YgdGhlIGNvbnRyb2xzCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5jb250cm9scykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1trXS5oaWRlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9wdGlvbiBmb3Igd2hpY2ggd2UgYXJlIG1pc3NpbmcgYSB2YWx1ZQogICAgICAgICAgICB2YXIgZGlzcGxheVVwVG9JbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdKSAhPT0gInVuZGVmaW5lZCIgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gbnVsbCAgJiYgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVwVG9JbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggb3JkZXIgYW5kIGNvbnN0cnVjdCByZW5kZXIgZnVuY3Rpb25zCiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICJyb290IjsKICAgICAgICAgICAgdmFyIGZucyA9IFtdOwogICAgICAgICAgICB2YXIgZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA8IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyW2ldOwoKICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWF0Y2hlcyA9IChpID09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCAtIDEpIHx8IChzZWxmLmV4aXN0c0xvY2F0aW9uV2l0aFByZWZpeChsb2NhdGlvbiArICJ+IiArIHNlbGVjdG9ySWQgKyAiPSIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTWF0Y2hlcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgPD0gZGlzcGxheVVwVG9JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbHNbc2VsZWN0b3JJZF0uc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSAifiIgKyBzZWxlY3RvcklkICsgIj0iICsgc2VsZi5jdXJyZW50QXR0cmlidXRlc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzZWxmLm9wdGlvbnMudHJlZS5zZWxlY3RvcnNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSAoaSArIDEgPT09IHNlbGYub3B0aW9ucy50cmVlLm9yZGVyLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGluZGV4LCBzZWxlY3RvcklkLCBzZWxlY3RvciwgY29udHJvbHMsIG9wdGlvblRyZWVIb2xkZXIsIGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwYWNhU2NoZW1hID0gc2VsZWN0b3Iuc2NoZW1hOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FPcHRpb25zID0gc2VsZWN0b3Iub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYU9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxwYWNhT3B0aW9ucy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy50eXBlID0gInNlbGVjdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGFjYU9wdGlvbnMudHlwZSA9PT0gInNlbGVjdCIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwYWNhT3B0aW9ucy5kYXRhU291cmNlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBzZWxmLnRvTG9jYXRpb24oc2VsZi5jdXJyZW50QXR0cmlidXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWVMaXN0ID0gc2VsZi5sb2NhdGlvblZhbHVlTGlzdHNbY3VycmVudExvY2F0aW9uXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRWYWx1ZUxpc3QpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciB2aWEgYWxwYWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tRWwgPSAkKCI8ZGl2IGNsYXNzPSdvcHRpb250cmVlLXNlbGVjdG9yJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvbUVsKS5hbHBhY2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBhbHBhY2FTY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMiOiBhbHBhY2FPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0UmVuZGVyIjogZnVuY3Rpb24oY29udHJvbCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbc2VsZWN0b3JJZF0gPSBjb250cm9sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRvIHRoZSBob2xkZXIgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wdGlvblRyZWVIb2xkZXIpLmFwcGVuZChkb21FbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBjb250cm9sIGNoYW5nZXMsIHdlIHJlY29yZCBpdCBpbnRvIG91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGF0dHJpYnV0ZSBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9ySWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG91ciBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF0gPSB0aGlzLmdldFZhbHVlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGV2ZXJ5dGhpbmcgcGFzdCBvdXIgaW5kZXggdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5vcHRpb25zLnRyZWUub3JkZXIubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcklkID0gc2VsZi5vcHRpb25zLnRyZWUub3JkZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzZWxmLmN1cnJlbnRBdHRyaWJ1dGVzW3NlbGVjdG9ySWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNbc2VsZWN0b3JJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub3B0aW9ucy50cmVlLmRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gc2VsZi5vcHRpb25zLnRyZWUuZGF0YVtpXS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuY3VycmVudEF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1trXSAhPT0gc2VsZi5jdXJyZW50QXR0cmlidXRlc1trXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYub3B0aW9ucy50cmVlLmRhdGFbaV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaE9wdGlvblRyZWVDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgc2VsZWN0b3JJZCwgc2VsZWN0b3IsIHNlbGYuY29udHJvbHMsIHNlbGYub3B0aW9uVHJlZUhvbGRlciwgbGFzdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZucy5wdXNoKGZuKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gKz0gIn4iICsgc2VsZWN0b3JJZCArICI9IiArIHNlbGYuY3VycmVudEF0dHJpYnV0ZXNbc2VsZWN0b3JJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xzW3NlbGVjdG9ySWRdLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5jb250cm9sc1tzZWxlY3RvcklkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGkgPCBzZWxmLm9wdGlvbnMudHJlZS5vcmRlci5sZW5ndGgpOwoKICAgICAgICAgICAgQWxwYWNhLnNlcmllcyhmbnMsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CgogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYW55IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIk9wdGlvbiBUcmVlIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuT2JqZWN0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiT3B0aW9uIFRyZWUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0cmVlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhbnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3Jpem9udGFsIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLk9iamVjdEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoIm9wdGlvbnRyZWUiLCBBbHBhY2EuRmllbGRzLk9wdGlvblRyZWVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QYXNzd29yZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBhc3N3b3JkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYS5wYXR0ZXJuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMucGFzc3dvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFBhc3N3b3JkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBiYXNlU3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIEZpZWxkLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZTY2hlbWE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9ICh0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS5wYXR0ZXJuKT8gdGhpcy5zY2hlbWEucGF0dGVybiA6IC9eWzAtOWEtekEtWlx4MjAtXHg3RV0qJC87CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdGhpcy5zY2hlbWEucGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCgkJCQkJImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCgkJCQkJCSJkZWZhdWx0IjoicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwYXNzd29yZCJdLAoJCQkJCQkicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCgkJZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksewoJCQkJImZpZWxkcyI6IHsKCQkJCQkiZm9ybWF0IjogewoJCQkJCQkidHlwZSI6ICJ0ZXh0IgoJCQkJCX0KCQkJCX0KCQkJfSk7CiAgICAgICAgfQoKCQkvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJJbnZhbGlkIFBhc3N3b3JkIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJwYXNzd29yZCIsIEFscGFjYS5GaWVsZHMuUGFzc3dvcmRGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0Rm9ybWF0RmllbGRNYXBwaW5nKCJwYXNzd29yZCIsICJwYXNzd29yZCIpOwp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5QZXJzb25hbE5hbWVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAicGVyc29uYWxuYW1lIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gdXBwZXItY2FzZQogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9ICIiOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgKz0gdmFsLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLmNoYXJBdChpIC0gMSkgPT09ICcgJyB8fCB2YWwuY2hhckF0KGkgLSAxKSA9PT0gJy0nIHx8IHZhbC5jaGFyQXQoaSAtIDEpID09PSAiJyIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdXBwZXJWYWx1ZSArPSB2YWwuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodXBwZXJWYWx1ZSAhPSB0aGlzLmdldFZhbHVlKCkpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmJhc2UodXBwZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjb25LZXlQcmVzcwogICAgICAgICAqLwogICAgICAgIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgQWxwYWNhLmxhdGVyKDI1LCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2ID0gX3RoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNldFZhbHVlKHYpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGVyc29uYWwgTmFtZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJUZXh0IEZpZWxkIGZvciBwZXJzb25hbCBuYW1lIHdpdGggY2FwdGljYWwgbGV0dGVyIGZvciBmaXJzdCBsZXR0ZXIgJiBhZnRlciBoeXBoZW4sIHNwYWNlIG9yIGFwb3N0cm9waGUuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBlcnNvbmFsbmFtZSIsIEFscGFjYS5GaWVsZHMuUGVyc29uYWxOYW1lRmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuUGhvbmVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBodG1sNSBpbnB1dCB0eXBlID0gInRlbCI7CiAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gInRlbCI7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEucGF0dGVybikgewogICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEucGF0dGVybiA9IEFscGFjYS5yZWdleHBzLnBob25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQWxwYWNhLmlzRW1wdHkodGhpcy5vcHRpb25zLm1hc2tTdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFza1N0cmluZyA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNwb3N0UmVuZGVyCiAgICAgICAgICovCiAgICAgICAgcG9zdFJlbmRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKCiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNoYW5kbGVWYWxpZGF0ZQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJhc2VTdGF0dXMgPSB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIHZhciB2YWxJbmZvID0gdGhpcy52YWxpZGF0aW9uOwoKICAgICAgICAgICAgaWYgKCF2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJzdGF0dXMiXSkgewogICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkUGhvbmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBob25lIjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQaG9uZSBGaWVsZC4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mU2NoZW1hOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAodGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEucGF0dGVybikgPyB0aGlzLnNjaGVtYS5wYXR0ZXJuIDogQWxwYWNhLnJlZ2V4cHMucGhvbmU7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiUGF0dGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGaWVsZCBQYXR0ZXJuIGluIFJlZ3VsYXIgRXhwcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOltwYXR0ZXJuXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9wZXJ0eSBkYXRhIGZvcm1hdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjoicGhvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJwaG9uZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOnRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRPcHRpb25zRm9yU2NoZW1hCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0ZvclNjaGVtYTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWFza1N0cmluZyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkZpZWxkIE1hc2sgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cHJlc3Npb24gZm9yIGZpZWxkIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIoOTk5KSA5OTktOTk5OSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkUGhvbmUiOiAiSW52YWxpZCBQaG9uZSBOdW1iZXIsIGUuZy4gKDEyMykgNDU2LTk5OTkiCiAgICB9KTsKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBob25lIiwgQWxwYWNhLkZpZWxkcy5QaG9uZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInBob25lIiwgInBob25lIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFVzZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaWxseWFyYXVqby9waWNrLWEtY29sb3IKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuUGlja0FDb2xvckZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5QaWNrQUNvbG9yRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgdHlwZW9mKCQuZm4ucGlja0FDb2xvcikgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBpY2tBQ29sb3JGaWVsZEF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJjb2xvciI7CiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnBpY2thY29sb3IpID09PSAidW5kZWZpbmVkIiAmJiAhc2VsZi5waWNrQUNvbG9yRmllbGRBdmFpbGFibGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gImNvbG9yIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdCBzcGVjdHJ1bSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yID0gewogICAgICAgICAgICAgICAgICAgIHNob3dTcGVjdHJ1bSAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd1NhdmVkQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzYXZlQ29sb3JzUGVyRWxlbWVudCAgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBmYWRlTWVudVRvZ2dsZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHNob3dBZHZhbmNlZCAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Jhc2ljQ29sb3JzICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG93SGV4SW5wdXQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGFsbG93QmxhbmsgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgaW5saW5lRHJvcGRvd24gICAgICAgIDogZmFsc2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIGNvbG9ycyBub3Qgc3BlY2lmaWVkLCB1c2UgZGVmYXVsdCBjb2xvcnMKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuY29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2xvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgd2hpdGU6ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICBjbG91ZHM6ICIjZWNmMGYxIiwKICAgICAgICAgICAgICAgICAgICByZWQ6ICIjYzAzOTJiIiwKICAgICAgICAgICAgICAgICAgICBvcmFuZ2U6ICIjZTY3ZTIyIiwKICAgICAgICAgICAgICAgICAgICB5ZWxsb3c6ICIjZjFjNDBmIiwKICAgICAgICAgICAgICAgICAgICBncmVlbjogIiMyN2FlNjAiLAogICAgICAgICAgICAgICAgICAgIGJsdWU6ICIjMjk4MGI5IiwKICAgICAgICAgICAgICAgICAgICBwdXJwbGU6ICIjOGU0NGFkIiwKICAgICAgICAgICAgICAgICAgICBkYXJrOiAiIzM0NDk1ZSIsCiAgICAgICAgICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICBicm93bjogIiNiYjk5NzciCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBpY2thY29sb3IgJiYgdHlwZW9mKHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5waWNrYWNvbG9yLmJhc2ljQ29sb3JzID0gdGhpcy5vcHRpb25zLmNvbG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93bikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGlja2Fjb2xvci5pbmxpbmVEcm9wZG93biA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInBpY2thY29sb3IiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VHlwZQogICAgICAgICAqLwogICAgICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250cm9sOiBmdW5jdGlvbihtb2RlbCwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UobW9kZWwsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRyb2wpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlbmRlciB0aGUgcGx1Z2luLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYucGlja0FDb2xvckZpZWxkQXZhaWxhYmxlICYmIHNlbGYub3B0aW9ucy5waWNrYWNvbG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmF0dHIoInZhbHVlIiwgc2VsZi5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmFkZENsYXNzKCJwaWNrLWEtY29sb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLnBpY2tBQ29sb3Ioc2VsZi5vcHRpb25zLnBpY2thY29sb3IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUGljay1BLUNvbG9yIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIkEgY29sb3IgcGlja2VyIGZvciBzZWxlY3RpbmcgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInBpY2thY29sb3IiLCBBbHBhY2EuRmllbGRzLlBpY2tBQ29sb3JGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuU2VhcmNoRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJzZWFyY2giOwogICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICJzZWFyY2giOwoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlcy5yZXN1bHRzID0gNTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic2VhcmNoIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlNlYXJjaCBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJBIHNlYXJjaCBib3ggZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic2VhcmNoIiwgQWxwYWNhLkZpZWxkcy5TZWFyY2hGaWVsZCk7CiAgICBBbHBhY2EucmVnaXN0ZXJEZWZhdWx0U2NoZW1hRmllbGRNYXBwaW5nKCJzZWFyY2giLCAic2VhcmNoIik7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnVzSG9sZGluZ3MgPSB7fTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy50ZXJyaXRvcmllcyA9IHsKICAgICAgICAiQW1lcmljYW4gU2Ftb2EiICAgICAgICAgICAgICAgICA6ICJBUyIsCiAgICAgICAgIkRpc3RyaWN0IE9mIENvbHVtYmlhIiAgICAgICAgICAgOiAiREMiLAogICAgICAgICJGZWRlcmF0ZWQgU3RhdGVzIE9mIE1pY3JvbmVzaWEiIDogIkZNIiwKICAgICAgICAiR3VhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJHVSIsCiAgICAgICAgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgOiAiTUgiLAogICAgICAgICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgIDogIk1QIiwKICAgICAgICAiUGFsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJQVyIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiAgICAgICAgICAgICAgICAgICAgOiAiUFIiLAogICAgICAgICJWaXJnaW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgIDogIlZJIgogICAgfTsKCiAgICBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgPSAgewogICAgICAgICJBbGFiYW1hIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkFMIiwKICAgICAgICAiQWxhc2thIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBSyIsCiAgICAgICAgIkFyaXpvbmEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVoiLAogICAgICAgICJBcmthbnNhcyIgICAgICAgICAgICAgICAgICAgICAgIDogIkFSIiwKICAgICAgICAiQ2FsaWZvcm5pYSIgICAgICAgICAgICAgICAgICAgICA6ICJDQSIsCiAgICAgICAgIkNvbG9yYWRvIiAgICAgICAgICAgICAgICAgICAgICAgOiAiQ08iLAogICAgICAgICJDb25uZWN0aWN1dCIgICAgICAgICAgICAgICAgICAgIDogIkNUIiwKICAgICAgICAiRGVsYXdhcmUiICAgICAgICAgICAgICAgICAgICAgICA6ICJERSIsCiAgICAgICAgIkZsb3JpZGEiICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkwiLAogICAgICAgICJHZW9yZ2lhIiAgICAgICAgICAgICAgICAgICAgICAgIDogIkdBIiwKICAgICAgICAiSGF3YWlpIiAgICAgICAgICAgICAgICAgICAgICAgICA6ICJISSIsCiAgICAgICAgIklkYWhvIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUQiLAogICAgICAgICJJbGxpbm9pcyIgICAgICAgICAgICAgICAgICAgICAgIDogIklMIiwKICAgICAgICAiSW5kaWFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJJTiIsCiAgICAgICAgIklvd2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSUEiLAogICAgICAgICJLYW5zYXMiICAgICAgICAgICAgICAgICAgICAgICAgIDogIktTIiwKICAgICAgICAiS2VudHVja3kiICAgICAgICAgICAgICAgICAgICAgICA6ICJLWSIsCiAgICAgICAgIkxvdWlzaWFuYSIgICAgICAgICAgICAgICAgICAgICAgOiAiTEEiLAogICAgICAgICJNYWluZSIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk1FIiwKICAgICAgICAiTWFyeWxhbmQiICAgICAgICAgICAgICAgICAgICAgICA6ICJNRCIsCiAgICAgICAgIk1hc3NhY2h1c2V0dHMiICAgICAgICAgICAgICAgICAgOiAiTUEiLAogICAgICAgICJNaWNoaWdhbiIgICAgICAgICAgICAgICAgICAgICAgIDogIk1JIiwKICAgICAgICAiTWlubmVzb3RhIiAgICAgICAgICAgICAgICAgICAgICA6ICJNTiIsCiAgICAgICAgIk1pc3Npc3NpcHBpIiAgICAgICAgICAgICAgICAgICAgOiAiTVMiLAogICAgICAgICJNaXNzb3VyaSIgICAgICAgICAgICAgICAgICAgICAgIDogIk1PIiwKICAgICAgICAiTW9udGFuYSIgICAgICAgICAgICAgICAgICAgICAgICA6ICJNVCIsCiAgICAgICAgIk5lYnJhc2thIiAgICAgICAgICAgICAgICAgICAgICAgOiAiTkUiLAogICAgICAgICJOZXZhZGEiICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5WIiwKICAgICAgICAiTmV3IEhhbXBzaGlyZSIgICAgICAgICAgICAgICAgICA6ICJOSCIsCiAgICAgICAgIk5ldyBKZXJzZXkiICAgICAgICAgICAgICAgICAgICAgOiAiTkoiLAogICAgICAgICJOZXcgTWV4aWNvIiAgICAgICAgICAgICAgICAgICAgIDogIk5NIiwKICAgICAgICAiTmV3IFlvcmsiICAgICAgICAgICAgICAgICAgICAgICA6ICJOWSIsCiAgICAgICAgIk5vcnRoIENhcm9saW5hIiAgICAgICAgICAgICAgICAgOiAiTkMiLAogICAgICAgICJOb3J0aCBEYWtvdGEiICAgICAgICAgICAgICAgICAgIDogIk5EIiwKICAgICAgICAiT2hpbyIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJPSCIsCiAgICAgICAgIk9rbGFob21hIiAgICAgICAgICAgICAgICAgICAgICAgOiAiT0siLAogICAgICAgICJPcmVnb24iICAgICAgICAgICAgICAgICAgICAgICAgIDogIk9SIiwKICAgICAgICAiUGVubnN5bHZhbmlhIiAgICAgICAgICAgICAgICAgICA6ICJQQSIsCiAgICAgICAgIlJob2RlIElzbGFuZCIgICAgICAgICAgICAgICAgICAgOiAiUkkiLAogICAgICAgICJTb3V0aCBDYXJvbGluYSIgICAgICAgICAgICAgICAgIDogIlNDIiwKICAgICAgICAiU291dGggRGFrb3RhIiAgICAgICAgICAgICAgICAgICA6ICJTRCIsCiAgICAgICAgIlRlbm5lc3NlZSIgICAgICAgICAgICAgICAgICAgICAgOiAiVE4iLAogICAgICAgICJUZXhhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRYIiwKICAgICAgICAiVXRhaCIgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVVCIsCiAgICAgICAgIlZlcm1vbnQiICAgICAgICAgICAgICAgICAgICAgICAgOiAiVlQiLAogICAgICAgICJWaXJnaW5pYSIgICAgICAgICAgICAgICAgICAgICAgIDogIlZBIiwKICAgICAgICAiV2FzaGluZ3RvbiIgICAgICAgICAgICAgICAgICAgICA6ICJXQSIsCiAgICAgICAgIldlc3QgVmlyZ2luaWEiICAgICAgICAgICAgICAgICAgOiAiV1YiLAogICAgICAgICJXaXNjb25zaW4iICAgICAgICAgICAgICAgICAgICAgIDogIldJIiwKICAgICAgICAiV3lvbWluZyIgICAgICAgICAgICAgICAgICAgICAgICA6ICJXWSIKICAgIH07CgogICAgQWxwYWNhLkZpZWxkcy5TdGF0ZUZpZWxkID0gQWxwYWNhLkZpZWxkcy5TZWxlY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAic3RhdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuY2FwaXRhbGl6ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXBpdGFsaXplID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEFscGFjYS5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaW5jbHVkZVN0YXRlcykpIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbmNsdWRlVGVycml0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVRlcnJpdG9yaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQWxwYWNhLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YWxpZGF0ZSBzZXR0aW5ncwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5hbWUiIHx8IHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJjb2RlIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdmFsaWQgZm9ybWF0cwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCBzdGF0ZSBmb3JtYXQ6ICIgKyB0aGlzLm9wdGlvbnMuZm9ybWF0ICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBbbmFtZSwgY29kZV0iKTsKCiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIG5hbWUgZm9ybWF0CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gIm5hbWUiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb25maWd1cmUKICAgICAgICAgICAgdmFyIGhvbGRpbmdzID0gQWxwYWNhLnJldHJpZXZlVVNIb2xkaW5ncygKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlU3RhdGVzLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmluY2x1ZGVUZXJyaXRvcmllcywKICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiY29kZSIpLAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhcGl0YWxpemUpOwoKICAgICAgICAgICAgdGhpcy5zY2hlbWFbImVudW0iXSA9IGhvbGRpbmdzLmtleXM7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcHRpb25MYWJlbHMgPSBob2xkaW5ncy52YWx1ZXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKICAgICAgICB9CgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiU3RhdGUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSBkcm9wZG93biBzZWxlY3RvciBvZiBzdGF0ZXMgYW5kL29yIHRlcnJpdG9yaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBrZXllZCBieSB0aGVpciB0d28tY2hhcmFjdGVyIGNvZGUuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0U2NoZW1hT2ZPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSG93IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgdmFsdWVzIGluIHRoZSBzZWxlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6WyJuYW1lIiwgImNvZGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImNhcGl0YWxpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDYXBpdGFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIHZhbHVlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVTdGF0ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHN0YXRlcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJpbmNsdWRlVGVycml0b3JpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJJbmNsdWRlIFRlcnJpdG9yaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGVycml0b3JpZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldE9wdGlvbnNGb3JPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVN0YXRlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZVRlcnJpdG9yaWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3RhdGUiLCBBbHBhY2EuRmllbGRzLlN0YXRlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygic3RhdGUiLCAic3RhdGUiKTsKCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9sZGluZ3Mgb2YgVVMgc3RhdGVzIGFuZCB0ZXJyaXRvcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVTdGF0ZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHN0YXRlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlVGVycml0b3JpZXMgd2hldGhlciB0byBpbmNsdWRlIFVTIHRlcnJpdG9yaWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvZGVWYWx1ZSB3aGV0aGVyIHRvIGhhbmQgYmFjayBVUyBob2xkaW5nIGNvZGVzIChpbnN0ZWFkIG9mIG5hbWVzKQogICAgICogQHBhcmFtIHtCb29sZWFufSBjYXBpdGFsaXplIHdoZXRoZXIgdG8gY2FwaXRhbGl6ZSB0aGUgdmFsdWVzIGhhbmRlZCBiYWNrCiAgICAgKgogICAgICogQHJldHVybnMge09iamVjdH0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgImtleXMiIGFuZCAidmFsdWVzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXlzLgogICAgICovCiAgICBBbHBhY2EucmV0cmlldmVVU0hvbGRpbmdzID0gKGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5jbHVkZVN0YXRlcywgaW5jbHVkZVRlcnJpdG9yaWVzLCBjb2RlVmFsdWUsIGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlcyAgPSB7CiAgICAgICAgICAgICAgICBrZXlzOiAgIFtdLAogICAgICAgICAgICAgICAgdmFsdWVzOiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKAogICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICBpbmNsdWRlU3RhdGVzICAgICAgPyBBbHBhY2EudXNIb2xkaW5ncy5zdGF0ZXMgICAgICA6IHt9LAogICAgICAgICAgICAgICAgaW5jbHVkZVRlcnJpdG9yaWVzID8gQWxwYWNhLnVzSG9sZGluZ3MudGVycml0b3JpZXMgOiB7fQogICAgICAgICAgICApOwogICAgICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmtleXMob3B0cyk7CiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc29ydGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzb3J0ZWRbaV07CiAgICAgICAgICAgICAgICB2YXIga2V5ICAgPSBvcHRzW3N0YXRlXTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvZGVWYWx1ZSA/IGtleSA6IHN0YXRlOwogICAgICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMua2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICByZXMudmFsdWVzLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgIH0pKCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQuZXh0ZW5kKAogICAgLyoqCiAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy5TdW1tZXJub3RlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInN1bW1lcm5vdGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zdW1tZXJub3RlKSA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN1bW1lcm5vdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm9jdXM6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgU3VtbWVybm90ZSBFZGl0b3IKICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmICQuZm4uc3VtbWVybm90ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uKCJyZWFkeSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuc3VtbWVybm90ZShzZWxmLm9wdGlvbnMuc3VtbWVybm90ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gaWYgc3VtbWVybm90ZSdzIGRvbSBlbGVtZW50IGdldHMgZGVzdHJveWVkLCBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIGVkaXRvciBpbnN0YW5jZQogICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmJpbmQoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7ICQoc2VsZi5jb250cm9sKS5zdW1tZXJub3RlKCdkZXN0cm95Jyk7IH0gY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICAsCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlN1bW1lcm5vdGUgRWRpdG9yIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhbiBpbnN0YW5jZSBvZiBhIFN1bW1lcm5vdGUgRWRpdG9yIGNvbnRyb2wgZm9yIHVzZSBpbiBlZGl0aW5nIEhUTUwuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic3VtbWVybm90ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlN1bW1lcm5vdGUgRWRpdG9yIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlIHRoaXMgZW50cnkgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgU3VtbWVybm90ZSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYW55IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInN1bW1lcm5vdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFueSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygic3VtbWVybm90ZSIsIEFscGFjYS5GaWVsZHMuU3VtbWVybm90ZUZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICAvKioKICAgICAqIFRoZSB0YWJsZSBmaWVsZCBpcyB1c2VkIGZvciBkYXRhIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvbnNpc3Qgb2YgYW4gYXJyYXkgd2l0aCBvYmplY3RzIGluc2lkZSBvZiBpdC4gIFRoZSBvYmplY3RzCiAgICAgKiBtdXN0IGhhdmUgYSB1bmlmb3JtIHN0cnVjdHVyZS4gIFRoZSB0YWJsZSBmaWVsZCByZW5kZXJzIGEgc3RhbmRhcmQgSFRNTCB0YWJsZSB1c2luZyB0aGUgdGFibGUuICBUaGUgaW5kaXZpZHVhbAogICAgICogY29sdW1ucyBhcmUgZWl0aGVyIGVkaXRhYmxlIChpbiBlZGl0IG1vZGUpIG9yIHNpbXBseSBkaXNwbGF5ZWQgaW4gcmVhZC1vbmx5IG1vZGUuCiAgICAgKi8KICAgIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuQXJyYXlGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5hbmltYXRlKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSB0b29sYmFyIHN0aWNreSBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyU3RpY2t5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXMudHlwZSA9ICJ0YWJsZXJvdyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIGVpdGhlciAiZGF0YXRhYmxlIiBvciAiZGF0YXRhYmxlcyIKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1siZGF0YXRhYmxlIl0pIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gdGhpcy5vcHRpb25zWyJkYXRhdGFibGUiXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbImRhdGF0YWJsZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhc3N1bWUgZW1wdHkgb3B0aW9ucyBmb3IgZGF0YXRhYmxlcwogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kYXRhdGFibGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzID0gewogICAgICAgICAgICAgICAgICAgICJwYWdpbmciOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAibGVuZ3RoQ2hhbmdlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImluZm8iOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VhcmNoaW5nIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIm9yZGVyaW5nIjogdHJ1ZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBkcmFnZ2FibGUgcmVvcmRlciBvZiByb3dzCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5kcmFnUm93cykgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkb25seSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZHJhZ1Jvd3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlPbmx5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRyYWdSb3dzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFzc3VtZSBhY3Rpb25zIGNvbHVtbiB0byBiZSBzaG93bgogICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbikgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW4gPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkYXRhIHRhYmxlcyBjb2x1bW5zCiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhdGFibGVzLmNvbHVtbnMgPSBbXTsKCiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZXMgdG8gZGV0ZWN0IGFscGFjYSBmaWVsZCB0eXBlcyBhbmQgcGVyZm9ybSBhbHBhY2EgZmllbGQgc29ydGluZyBhbmQgZmlsdGVyaW5nCiAgICAgICAgICAgIGlmICgkLmZuLmRhdGFUYWJsZUV4dCAmJiAhJC5mbi5EYXRhVGFibGUuZXh0LnR5cGUuc2VhcmNoWyJhbHBhY2EiXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5mbi5EYXRhVGFibGUuZXh0Lm9yZGVyWyJhbHBhY2EiXSA9IGZ1bmN0aW9uIChzZXR0aW5ncywgY29sKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGRhdGEgcHJvcGVydHkgaGFzIGxhdGVzdCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlcnR5IGJ5IGluZGV4CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gY29sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYysrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGF0YSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5kYXRhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzZWxmLmRhdGFbaV1bcHJvcGVydHlOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGtpbmQgb2YgaGFja3kgZnVuY3Rpb24gYXQgdGhlIG1vbWVudCwgdHJ5aW5nIHRvIGRvIGZpbHRlcmluZyB0aGF0IHRha2VzIGludG8gYWNjb3VudAogICAgICAgICAgICAgICAgLy8gYWxwYWNhIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBkYXRhIHRhYmxlcyBhdXRob3JzLCBuZWVkIHRvIHdhaXQgZm9yIG5leHQgcmVsZWFzZSBmb3IgcmVmYWN0b3Jpbmcgb2YgZmlsdGVyaW5nCiAgICAgICAgICAgICAgICAvLyBsb2dpYyBpbiBkYXRhIHRhYmxlcyB0byByZWFsbHkgdGFrZSBjb250cm9sIG9mIHRoaXMgYW5kIGRvIGl0IHJpZ2h0CiAgICAgICAgICAgICAgICAvLyB0aGlzICJzb3J0IG9mIiB3b3JrcyBmb3Igbm93CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgJC5mbi5kYXRhVGFibGVFeHQuYWZuRmlsdGVyaW5nLnB1c2goZnVuY3Rpb24oc2V0dGluZ3MsIGZpZWxkcywgZmllbGRJbmRleCwgZGF0YSwgZGF0YUluZGV4KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICQoc2V0dGluZ3MublRhYmxlV3JhcHBlcikuZmluZCgiLmRhdGFUYWJsZXNfZmlsdGVyIGlucHV0W3R5cGU9J3NlYXJjaCddIikudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIiArIHRleHQ7CgogICAgICAgICAgICAgICAgICAgIHRleHQgPSAkLnRyaW0odGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBkYXRhW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGRhdGFWYWx1ZS5pbmRleE9mKCJkYXRhLWFscGFjYS1maWVsZC1pZD0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscGFjYUlkID0gJChkYXRhVmFsdWUpLmF0dHIoImRhdGEtYWxwYWNhLWZpZWxkLWlkIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBhY2FWYWx1ZSA9IEFscGFjYS5maWVsZEluc3RhbmNlc1thbHBhY2FJZF0uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwYWNhVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBhY2FWYWx1ZSA9ICIiICsgYWxwYWNhVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGFjYVZhbHVlID0gYWxwYWNhVmFsdWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBhY2FWYWx1ZS5pbmRleE9mKHRleHQpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInRhYmxlIjsKICAgICAgICB9LAoKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgc2VsZi5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgLy8gYnVpbGQgYSBzZXBhcmF0ZSAiaXRlbXMiIGFycmF5IHRoYXQgd2UnbGwgdXNlIHRvIGJ1aWxkIG91dCB0aGUgdGFibGUgaGVhZGVyCiAgICAgICAgICAgICAgICBtb2RlbC5oZWFkZXJzID0gW107CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zY2hlbWEuaXRlbXMgJiYgc2VsZi5zY2hlbWEuaXRlbXMucHJvcGVydGllcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pZCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXNba10udGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcyAmJiBzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzW2tdLmxhYmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10ubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba10udHlwZSA9PT0gImhpZGRlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmhlYWRlcnMucHVzaChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldFRhYmxlRWw6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHJldHVybiAkKCQoc2VsZi5jb250YWluZXIpLmZpbmQoInRhYmxlIilbMF0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0YWJsZSBmaWVsZCB1c2VzIHRoZSAiYXJyYXkiIGNvbnRhaW5lciBjb252ZW50aW9uIHRvIHJlbmRlciB0aGUgRE9NLiAgQXMgc3VjaCwgbmVzdGVkIG9iamVjdHMgYXJlIHdyYXBwZWQKICAgICAgICAgKiBpbiAiZmllbGQiIGVsZW1lbnRzIHRoYXQgcmVzdWx0IGluIHNsaWdodGx5IGluY29ycmVjdCB0YWJsZSBzdHJ1Y3R1cmVzLiAgUGFydCBvZiB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgICAgICAgKiBicm93c2VycyBhcmUgdmVyeSBmdXNzeSB3aGVuIGl0IGNvbWVzIHRvIGluamVjdGlvbiBvZiBuZXN0ZWQgVFIgb3IgVEQgcGFydGlhbHMuICBIZXJlLCB3ZSBnZW5lcmF0ZSBtb3N0CiAgICAgICAgICogdGhpbmdzIGFzIERJVnMgYW5kIHRoZW4gZG8gc29tZSBjbGVhbnVwIGluIHRoaXMgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBpcyBwdXQgdG9nZWh0ZXIgaW4gdGhlCiAgICAgICAgICogcmlnaHQgd2F5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJSZW5kZXJDb250YWluZXI6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgc2VsZi5jbGVhbnVwRG9tSW5qZWN0aW9ucygpOwoKICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlcyBvZiB1bmRlcmx5aW5nICJ0YWJsZSIKICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHNlbGYuZ2V0VGFibGVFbCgpOwogICAgICAgICAgICAgICAgc2VsZi5hcHBseVN0eWxlKCJ0YWJsZSIsIHRhYmxlKTsKCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YVRhYmxlcyBwbHVnaW4gaXMgYXZhaWxhYmxlLCB1c2UgaXQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5mbi5EYXRhVGFibGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBzZXR0aW5nIHVwIGZvciBkcmFnZ2luZyByb3dzLCB0aGVuIGFkZCB0aGF0IGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJkcmFnUm93c0luZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlkZGVuIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMuY29sdW1ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJhYmxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZHJhZ1Jvd3NEcmFnZ2FibGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IGluIGZpZWxkcyBmcm9tIHRoZSBpdGVtcwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHNlbGYuc2NoZW1hLml0ZW1zLnByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xDb25maWcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyYWJsZSI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyRGF0YVR5cGUiOiAiYWxwYWNhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goY29sQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb25zIGNvbHVtbiBlbmFibGVkLCB0aGVuIHR1cm4gb2ZmIHNvcnRpbmcgZm9yIHRoZSBhY3Rpb25zIGNvbHVtbiAoYXNzdW1lZCB0byBiZSBsYXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnNob3dBY3Rpb25zQ29sdW1uKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZGF0YXRhYmxlcy5jb2x1bW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmFibGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJhY3Rpb25zIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kYXRhdGFibGVzWyJyb3dSZW9yZGVyIl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdG9yIjogInRyIHRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YVNyYyI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNuYXBYIjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVZFTlQgSEFORExFUlMKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyZWFkeSIgZXZlbnQgYW5kIHdoZW4gaXQgZmlyZXMsIGluaXQgZGF0YSB0YWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIERPTSBhbmQgYW55dGhpbmcgd3JhcHBpbmcgb3VyIHRhYmxlIGZpZWxkIGluc3RhbmNlIGlzIHJlYWR5IHRvIHJvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHdlIHByb2NlZWQKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmYoInJlYWR5Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhciBkb3duIG9sZCBkYXRhIHRhYmxlcyBkYXRhIGlmIGl0IGlzIHN0aWxsIGFyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGRvbSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBzZWxmLmdldFRhYmxlRWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSAkKHRhYmxlKS5EYXRhVGFibGUoc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlICJyb3ctcmVvcmRlciIgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Lm9uKCJyb3ctcmVvcmRlciIsIGZ1bmN0aW9uKGUsIGRpZmYsIGVkaXQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBkYXRhIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBzaGlmdCBpbiBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZbMF0ub2xkUG9zaXRpb24gIT09IGRpZmZbMF0ubmV3UG9zaXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlSXRlbShkaWZmWzBdLm9sZFBvc2l0aW9uLCBkaWZmWzBdLm5ld1Bvc2l0aW9uLCBmYWxzZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgdW5kZXJseWluZyB0YWJsZSBET00gZWxlbWVudCBiZWluZyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhhdCBoYXBwZW5zLCB0ZWFyIGRvd24gdGhlIGRhdGF0YWJsZXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRhaW5lcikuYmluZCgnZGVzdHJveWVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgc29ydGluZyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBjaGlsZHJlbiBhbmQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQub24oJ29yZGVyJywgZnVuY3Rpb24gKCBlLCBjdHgsIHNvcnRpbmcsIGNvbHVtbnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kdC5fZGlzYWJsZUFscGFjYUhhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gb3JpZ2luYWwgY29weSBvZiB0aGUgY2hpbGRyZW4sIG1ha2Ugb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gcmUtb3JkZXIgdGhlIGNoaWxkcmVuIGFuZCBkYXRhdGFibGUgYXNzdW1lcyB3ZSBrbm93IHRoZSBvcmlnaW5hbCBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQuX29yaWdpbmFsQ2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbi5wdXNoKHNlbGYuY2hpbGRyZW5ba10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vcmRlciBiYXNlZCBvbiB0aGUgb3JkZXIgdGhhdCBkYXRhdGFibGVzIGJlbGlldmVzIGlzIHJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBjdHguYWlEaXNwbGF5Lmxlbmd0aDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY3R4LmFpRGlzcGxheVt6XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChzZWxmLl9kdC5fb3JpZ2luYWxDaGlsZHJlbltpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0Ll9kaXNhYmxlQWxwYWNhSGFuZGxlcnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCBoZWFkZXJzIGFuZCBhbGxvdyBmb3IgY2FsbGJhY2stYmFzZWQgY29uZmlnCiAgICAgICAgICAgICAgICAkKHRhYmxlKS5jaGlsZHJlbigidGhlYWQgPiB0ciA+IHRoW2RhdGEtaGVhZGVyLWlkXSIpLmVhY2goZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkKHRoaXMpLmF0dHIoImRhdGEtaGVhZGVyLWlkIik7CgogICAgICAgICAgICAgICAgICAgIHZhciBzY2hlbWEgPSBzZWxmLnNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaXRlbXMuZmllbGRzICYmIHNlbGYub3B0aW9ucy5pdGVtcy5maWVsZHNba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zLml0ZW1zLmZpZWxkc1trZXldOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIiBvciAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkIHx8IChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FMTEJBQ0s6ICJ0YWJsZUhlYWRlclJlcXVpcmVkIgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjaygidGFibGVIZWFkZXJSZXF1aXJlZCIsIHNjaGVtYSwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENBTExCQUNLOiAidGFibGVIZWFkZXJPcHRpb25hbCIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soInRhYmxlSGVhZGVyT3B0aW9uYWwiLCBzY2hlbWEsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwoKICAgICAgICAgICAgfSk7Ly8uYmluZChzZWxmKSk7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYW51cERvbUluamVjdGlvbnM6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUYWtlcyBhIERPTSBlbGVtZW50IGFuZCBtZXJnZXMgaXQgInVwIiB0byB0aGUgcGFyZW50IGVsZW1lbnQuICBEYXRhIGF0dHJpYnV0ZXMgYW5kIHNvbWUgY2xhc3NlcyBhcmUKICAgICAgICAgICAgICogY29waWVkIGZyb20gRE9NIGVsZW1lbnQgaW50byB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgY2hpbGRyZW4gb2YgdGhlIERPTSBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICogcGFyZW50IGFuZCB0aGUgRE9NIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIG1lcmdlRWxlbWVudAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudFVwID0gZnVuY3Rpb24obWVyZ2VFbGVtZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVyZ2VFbGVtZW50UGFyZW50ID0gJChtZXJnZUVsZW1lbnQpLnBhcmVudCgpOwogICAgICAgICAgICAgICAgdmFyIG1lcmdlRWxlbWVudENoaWxkcmVuID0gJChtZXJnZUVsZW1lbnQpLmNoaWxkcmVuKCk7CgogICAgICAgICAgICAgICAgLy8gY29weSBtZXJnZSBlbGVtZW50IGNsYXNzZXMgdG8gcGFyZW50CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9ICQobWVyZ2VFbGVtZW50KS5hdHRyKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICAgICQuZWFjaCggY2xhc3NOYW1lcywgZnVuY3Rpb24oaW5kZXgsIGNsYXNzTmFtZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gImFscGFjYS1tZXJnZS11cCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50UGFyZW50KS5hZGRDbGFzcyhjbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGNvcHkgYXR0cmlidXRlcyB0byBUUgogICAgICAgICAgICAgICAgJC5lYWNoKCQobWVyZ2VFbGVtZW50KVswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMubmFtZS5pbmRleE9mKCJkYXRhLSIpID09PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnRQYXJlbnQpLmF0dHIodGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZpZWxkIHdpdGggY2hpbGRyZW4KICAgICAgICAgICAgICAgIGlmIChtZXJnZUVsZW1lbnRDaGlsZHJlbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQobWVyZ2VFbGVtZW50KS5yZXBsYWNlV2l0aChtZXJnZUVsZW1lbnRDaGlsZHJlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJChtZXJnZUVsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHRyRWxlbWVudHMgPSBzZWxmLmdldFRhYmxlRWwoKS5jaGlsZHJlbigidGJvZHkiKS5jaGlsZHJlbigidHIiKTsKCiAgICAgICAgICAgIC8vIGZpbmQgZWFjaCBUUidzIC5hbHBhY2EtZmllbGQgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtZmllbGQiKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgbWVyZ2VFbGVtZW50VXAodGhpcyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZmluZCBlYWNoIFRSJ3MgLmFscGFjYS1jb250YWluZXIgYW5kIG1lcmdlIHVwCiAgICAgICAgICAgICQodHJFbGVtZW50cykuY2hpbGRyZW4oIi5hbHBhY2EtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1lcmdlRWxlbWVudFVwKHRoaXMpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGZpbmQgYW55IGFjdGlvbiBiYXJzIGZvciBvdXIgZmllbGQgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhQXJyYXlBY3Rpb25iYXIgPSBzZWxmLmdldEZpZWxkRWwoKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfSVRFTV9BQ1RJT05CQVIgKyAiWyIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfSVRFTV9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJ10iKTsKICAgICAgICAgICAgaWYgKGFscGFjYUFycmF5QWN0aW9uYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFscGFjYUFycmF5QWN0aW9uYmFyLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRkID0gJCgiPHRkIGNsYXNzPSdhY3Rpb25iYXInIG5vd3JhcD0nbm93cmFwJz48L3RkPiIpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykuYmVmb3JlKHRkKTsKICAgICAgICAgICAgICAgICAgICAkKHRkKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGxzIGFuZCBzbGlwIGEgVEQgYXJvdW5kIHRoZW0KICAgICAgICAgICAgdmFyIGFscGFjYVRhYmxlUmVvcmRlckRyYWdnYWJsZUNlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsIik7CiAgICAgICAgICAgIGlmIChhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbHBhY2FUYWJsZVJlb3JkZXJEcmFnZ2FibGVDZWxscy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZCA9ICQoIjx0ZCBjbGFzcz0nYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwnPjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGQpLmFwcGVuZCgkKHRoaXMpLmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwgZWxlbWVudHMgYW5kIHNsaXAgYSBURCBhcm91bmQgdGhlbQogICAgICAgICAgICB2YXIgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscyA9IHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpLmNoaWxkcmVuKCJ0ciIpLmNoaWxkcmVuKCJ0ZC5hbHBhY2EtdGFibGUtcmVvcmRlci1kcmFnZ2FibGUtY2VsbCIpOwoKICAgICAgICAgICAgLy8gZmluZCBhbnkgYWxwYWNhLXRhYmxlLXJlb3JkZXItaW5kZXgtY2VsbCBlbGVtZW50cyBhbmQgc2xpcCBhIFREIGFyb3VuZCB0aGVtCiAgICAgICAgICAgIHZhciBhbHBhY2FUYWJsZVJlb3JkZXJJbmRleENlbGxzID0gc2VsZi5nZXRUYWJsZUVsKCkuY2hpbGRyZW4oInRib2R5IikuY2hpbGRyZW4oInRyIikuY2hpbGRyZW4oInRkLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwiKTsKICAgICAgICAgICAgaWYgKGFscGFjYVRhYmxlUmVvcmRlckluZGV4Q2VsbHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxwYWNhVGFibGVSZW9yZGVySW5kZXhDZWxscy5lYWNoKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGQgPSAkKCI8dGQgY2xhc3M9J2FscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWNlbGwnPiIgKyBpICsgIjwvdGQ+Iik7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5iZWZvcmUodGQpOwogICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCBhbnl0aGluZyBlbHNlIHdpdGggLmFscGFjYS1tZXJnZS11cCBhbmQgbWVyZ2UgdXAKICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEVsKCkuZmluZCgiLmFscGFjYS1tZXJnZS11cCBbZGF0YS1tZXJnZS11cC1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtZXJnZUVsZW1lbnRVcCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZG9SZXNvbHZlSXRlbUNvbnRhaW5lcjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGFibGVFbCgpLmNoaWxkcmVuKCJ0Ym9keSIpOwogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJBZGRJdGVtOiBmdW5jdGlvbihpdGVtLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGRyYWdSb3dzIHN1cHBvcnQsIHdlIGhhdmUgbm8gY2hvaWNlIGhlcmUgZXhjZXB0IHRvIGNvbXBsZXRlbHkgcmVib290IHRoZSB0YWJsZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBnZXQgRGF0YVRhYmxlcyB0byBiaW5kIHRoaW5ncyBjb3JyZWN0bHkgZm9yIGRyYWctZHJvcCBzdXBwb3J0CiAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBkcmFnUm93cyB0byB1c2Ugb3VyIG93biBkcmFnL2Ryb3AgdG9vbGluZyBhbmQgZ2V0IHJpZCBvZiBEYXRhVGFibGVzIFJvdyBSZW9yZGVyIFBsdWdpbgogICAgICAgICAgICAvLyB3ZSBhbHNvIGhhdmUgZG8gdGhpcyBpZiB3ZSd2ZSBhZGRlZCB0aGUgZmlyc3Qgcm93IHRvIGdldCBEYXRhVGFibGVzIHRvIHJlZHJhdwogICAgICAgICAgICB2YXIgdXNpbmdEYXRhVGFibGVzID0gc2VsZi5vcHRpb25zLmRhdGF0YWJsZXMgJiYgJC5mbi5EYXRhVGFibGU7CiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZHJhZ1Jvd3MgfHwgKHVzaW5nRGF0YVRhYmxlcyAmJiBzZWxmLmRhdGEubGVuZ3RoID09PSAxKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gcmVmcmVzaAogICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGluZm9ybSBkYXRhIHRhYmxlcyB0aGF0IHdlJ3ZlIGFkZGVkIGEgcm93CiAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGJ5IGZpbmRpbmcgdGhlIFRSIGFuZCB0aGVuIGFkZGluZyB0aGF0IHdheQogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICAgICB2YXIgdHIgPSBzZWxmLmZpZWxkLmZpbmQoIltkYXRhLWFscGFjYS1maWVsZC1wYXRoPSciICsgaXRlbS5wYXRoICsgIiddIik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHQucm93LmFkZCh0cik7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRvQWZ0ZXJSZW1vdmVJdGVtOiBmdW5jdGlvbihjaGlsZEluZGV4LCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHNlbGYuY2xlYW51cERvbUluamVjdGlvbnMoKTsKCiAgICAgICAgICAgIC8vIFRPRE86IHNlZSBhYm92ZQoKICAgICAgICAgICAgdmFyIHVzaW5nRGF0YVRhYmxlcyA9IHNlbGYub3B0aW9ucy5kYXRhdGFibGVzICYmICQuZm4uRGF0YVRhYmxlOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmRyYWdSb3dzIHx8ICh1c2luZ0RhdGFUYWJsZXMgJiYgc2VsZi5kYXRhLmxlbmd0aCA9PT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHJlZnJlc2gKICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gaW5mb3JtIGRhdGEgdGFibGVzIHRoYXQgd2UndmUgcmVtb3ZlZCBhIHJvdwogICAgICAgICAgICAgICAgaWYgKHNlbGYuX2R0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0LnJvd3MoY2hpbGRJbmRleCkucmVtb3ZlKCk7Ly8uZHJhdyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0KCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUmVuZGVycyBhcnJheSBpdGVtcyBpbnRvIGEgdGFibGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGF0YXRhYmxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkRhdGFUYWJsZXMgQ29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVzIFBsdWdpbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic2hvd0FjdGlvbnNDb2x1bW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTaG93IEFjdGlvbnMgQ29sdW1uIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbnMgY29sdW1uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJEcmFnIFJvd3MiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0byBlbmFibGUgdGhlIGRyYWdnaW5nIG9mIHJvd3MgdmlhIGEgZHJhZ2dhYmxlIGNvbHVtbi4gIFRoaXMgcmVxdWlyZXMgRGF0YVRhYmxlcyBhbmQgdGhlIERhdGFUYWJsZXMgUm93IFJlb3JkZXIgUGx1Z2luLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRhdGF0YWJsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJzaG93QWN0aW9uc0NvbHVtbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZHJhZ1Jvd3MiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ0YWJsZSIsIEFscGFjYS5GaWVsZHMuVGFibGVGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UYWJsZVJvd0ZpZWxkID0gQWxwYWNhLkZpZWxkcy5PYmplY3RGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICBwcmVwYXJlQ29udGFpbmVyTW9kZWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGZ1bmN0aW9uKG1vZGVsKSB7CgogICAgICAgICAgICAgICAgbW9kZWwub3B0aW9ucy5zaG93QWN0aW9uc0NvbHVtbiA9IHNlbGYucGFyZW50Lm9wdGlvbnMuc2hvd0FjdGlvbnNDb2x1bW47CiAgICAgICAgICAgICAgICBtb2RlbC5vcHRpb25zLmRyYWdSb3dzID0gc2VsZi5wYXJlbnQub3B0aW9ucy5kcmFnUm93czsKCiAgICAgICAgICAgICAgICAvLyB3YWxrIGFsbCBpdGVtcyBhbmQgbWFyayBoaWRkZW5zIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBlYXNpbHkgcGljayB0aGlzIHVwCiAgICAgICAgICAgICAgICAvLyBoaWRkZW5zIGFyZSBhcHBsaWVkIHRoZSAiYWxwYWNhLXRhYmxlLWNvbHVtbi1oaWRkZW4iIGNzcyBjbGFzcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5pdGVtcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXRlbXNbaV0ub3B0aW9ucy50eXBlID09PSAiaGlkZGVuIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLml0ZW1zW2ldLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFibGVyb3ciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKICAgICAgICB9CgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRhYmxlIFJvdyBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlJlbmRlcnMgb2JqZWN0IGl0ZW1zIGludG8gYSB0YWJsZSByb3ciOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFibGVyb3ciLCBBbHBhY2EuRmllbGRzLlRhYmxlUm93RmllbGQpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGFnRmllbGQgPSBBbHBhY2EuRmllbGRzLkxvd2VyQ2FzZUZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVGFnRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yID0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2xWYWx1ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHZhbCA9PT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldFZhbHVlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2YWwgPT09ICIiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghdmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5iYXNlKHZhbC5qb2luKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNvbkJsdXIKICAgICAgICAgKi8KICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uKGUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoZSk7CgogICAgICAgICAgICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWUoKTsKCiAgICAgICAgICAgIHZhciB0cmltbWVkID0gW107CgogICAgICAgICAgICAkLmVhY2godmFscywgZnVuY3Rpb24oaSwgdikgewoKICAgICAgICAgICAgICAgIGlmICh2LnRyaW0oKSAhPT0gIiIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5wdXNoKHYudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRyaW1tZWQpOwogICAgICAgIH0KCgoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGFnIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRleHQgZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdGFncyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVyLiI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJTZXBhcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VwYXJhdG9yIHVzZWQgdG8gc3BsaXQgdGFncy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGFnIiwgQWxwYWNhLkZpZWxkcy5UYWdGaWVsZCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5UaW1lRmllbGQgPSBBbHBhY2EuRmllbGRzLkRhdGVGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlRpbWVGaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJ0aW1lIjsKICAgICAgICB9LAoKICAgICAgICBnZXREZWZhdWx0Rm9ybWF0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5kZWZhdWx0VGltZUZvcm1hdDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIC8vIGRlZmF1bHQgaHRtbDUgaW5wdXQgdHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgLy90aGlzLmlucHV0VHlwZSA9ICJ0aW1lIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgLAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFRpdGxlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRpbWUgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGltZSBGaWVsZCI7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CiAgICAgICAgImludmFsaWRUaW1lIjogIkludmFsaWQgdGltZSIKICAgIH0pOwogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGltZSIsIEFscGFjYS5GaWVsZHMuVGltZUZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInRpbWUiLCAidGltZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkID0gQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkLmV4dGVuZCgKICAgICAgICAvKioKICAgICAgICAgKiBAbGVuZHMgQWxwYWNhLkZpZWxkcy50aW55TUNFRmllbGQucHJvdG90eXBlCiAgICAgICAgICovCiAgICAgICAgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0RmllbGRUeXBlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICJ0aW55bWNlIjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEFyZWFGaWVsZCNzZXR1cAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICIiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnRvb2xiYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRvb2xiYXIgPSAiaW5zZXJ0ZmlsZSB1bmRvIHJlZG8gfCBzdHlsZXNlbGVjdCB8IGJvbGQgaXRhbGljIHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0IG91dGRlbnQgaW5kZW50IHwgbGluayBpbWFnZSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIHRvIGNhbGwgaW50byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldENvbnRyb2xWYWx1ZTpmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZWRpdG9yLmdldENvbnRlbnQoKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGluaXRUaW55TUNFRXZlbnRzOiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0b3IpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2suY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJjbGljayIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJXaXRoUHJvcGFnYXRpb24oImNoYW5nZSIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBibHVyIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oJ2JsdXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImJsdXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgZXZlbnQKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5vbigiZm9jdXMiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRm9jdXMuY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJmb2N1cyIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyBrZXlwcmVzcyBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlwcmVzcyIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25LZXlQcmVzcy5jYWxsKHNlbGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoImtleXByZXNzIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGtleXVwIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0b3Iub24oImtleXVwIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleVVwLmNhbGwoc2VsZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigia2V5dXAiLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZG93biBldmVudAogICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yLm9uKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbktleURvd24uY2FsbChzZWxmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCJrZXlkb3duIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc0Rpc3BsYXlPbmx5KCkgJiYgc2VsZi5jb250cm9sICYmIHR5cGVvZih0aW55TUNFKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBBbHBhY2EgdG8gZGVjbGFyZSB0aGUgRE9NIHN3YXBwZWQgYW5kIHJlYWR5IGJlZm9yZSB3ZSBhdHRlbXB0IHRvIGRvIGFueXRoaW5nIHdpdGggQ0tFZGl0b3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbigicmVhZHkiLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZWRpdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydGVGaWVsZElEID0gJChzZWxmLmNvbnRyb2wpWzBdLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW55TUNFLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdG9yID0gZWRpdG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdFRpbnlNQ0VFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICIjIiArIHJ0ZUZpZWxkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IHNlbGYub3B0aW9ucy50b29sYmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZCNkZXN0cm95CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSBwbHVnaW4gaW5zdGFuY2UKICAgICAgICAgICAgICAgIGlmIChzZWxmLmVkaXRvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRvciA9IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2FsbCB1cCB0byBiYXNlIG1ldGhvZAogICAgICAgICAgICAgICAgdGhpcy5iYXNlKCk7CiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLyogYnVpbGRlcl9oZWxwZXJzICovCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRBcmVhRmllbGQjZ2V0VGl0bGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiVGlueU1DRSBFZGl0b3IiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0QXJlYUZpZWxkI2dldERlc2NyaXB0aW9uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVzIGFuIGluc3RhbmNlIG9mIGEgVGlueU1DRSBjb250cm9sIGZvciB1c2UgaW4gZWRpdGluZyBIVE1MLiI7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0U2NoZW1hT2ZPcHRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiVGlueU1DRSB0b29sYmFyIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRvb2xiYXIgb3B0aW9ucyBmb3IgVGlueU1DRSBwbHVnaW4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRPcHRpb25zRm9yT3B0aW9ucwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICAgICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyRmllbGRDbGFzcygidGlueW1jZSIsIEFscGFjYS5GaWVsZHMuVGlueU1DRUZpZWxkKTsKCn0pKGpRdWVyeSk7CihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVG9rZW5GaWVsZC5wcm90b3R5cGUKICAgICAqLwogICAgewogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidG9rZW4iOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNlcGFyYXRvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcGFyYXRvciA9ICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5maWVsZCkgPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b2tlbmZpZWxkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0eXBlb2YodGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuZmllbGQuc2hvd0F1dG9jb21wbGV0ZU9uRm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uKHZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZSh2YWwpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIG9uQmx1cjogZnVuY3Rpb24oZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuYmFzZShlKTsKICAgICAgICB9LAoKICAgICAgICBhZnRlclJlbmRlckNvbnRyb2w6IGZ1bmN0aW9uKG1vZGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZShtb2RlbCwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiByZW5kZXIgQ0sgRWRpdG9yCiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNEaXNwbGF5T25seSgpICYmIHNlbGYuY29udHJvbCAmJiB0eXBlb2YoJC5mbi50b2tlbmZpZWxkKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgQWxwYWNhIHRvIGRlY2xhcmUgdGhlIERPTSBzd2FwcGVkIGFuZCByZWFkeSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBkbyBhbnl0aGluZwogICAgICAgICAgICAgICAgICAgIHNlbGYub24oInJlYWR5IiwgZnVuY3Rpb24oc2VsZiwgdG9rZW5maWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkudG9rZW5maWVsZCh0b2tlbmZpZWxkKTsKICAgICAgICAgICAgICAgICAgICB9KHNlbGYsIHNlbGYub3B0aW9ucy50b2tlbmZpZWxkKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0VGl0bGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIlRva2VuIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVG9rZW4gZmllbGQgZm9yIGVudGVyaW5nIGxpc3Qgb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXIuIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAic2VwYXJhdG9yIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2VwYXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlcGFyYXRvciB1c2VkIHRvIHNwbGl0IHRva2Vucy4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IiwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidG9rZW5maWVsZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIlRva2VuIEZpZWxkIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgdG8gcGFzcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJvb3RzdHJhcC10b2tlbmZpZWxkIGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0T3B0aW9uc0Zvck9wdGlvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3IiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInRva2VuIiwgQWxwYWNhLkZpZWxkcy5Ub2tlbkZpZWxkKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkID0gQWxwYWNhLkNvbnRyb2xGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdHMKICAgICAgICAgKiBAYXVnbWVudHMgQWxwYWNhLkZpZWxkcy5Db250cm9sRmllbGQKICAgICAgICAgKgogICAgICAgICAqIEBjbGFzcyBGaWxlIHVwbG9hZCBjb250cm9sIHRoYXQgY2FuIGJlIG1vdW50ZWQgb24gdG9wIG9mICJvYmplY3QiIG9yICJhcnJheSIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGFpbmVyIEZpZWxkIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0ge0FueX0gZGF0YSBGaWVsZCBkYXRhLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEZpZWxkIG9wdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBGaWVsZCBzY2hlbWEuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2aWV3IEZpZWxkIHZpZXcuCiAgICAgICAgICogQHBhcmFtIHtBbHBhY2EuQ29ubmVjdG9yfSBjb25uZWN0b3IgRmllbGQgY29ubmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihjb250YWluZXIsIGRhdGEsIG9wdGlvbnMsIHNjaGVtYSwgdmlldywgY29ubmVjdG9yKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKGNvbnRhaW5lciwgZGF0YSwgb3B0aW9ucywgc2NoZW1hLCB2aWV3LCBjb25uZWN0b3IpOwoKICAgICAgICAgICAgdGhpcy5pc0FycmF5VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJhcnJheSI7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmlzT2JqZWN0VHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2NoZW1hLnR5cGUgPT09ICJvYmplY3QiOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gd3JhcHMgYW4gZXhpc3RpbmcgdGVtcGxhdGUgZGVzY3JpcHRvciBpbnRvIGEgbWV0aG9kIHRoYXQgbG9va3MgbGlrZSBmbihtb2RlbCkKICAgICAgICAgICAgLy8gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiBmaWxlaW5wdXQKICAgICAgICAgICAgLy8gY29uZmlnIGxvb2tzIGxpa2UKICAgICAgICAgICAgLy8gICAgewogICAgICAgICAgICAvLyAgICAgICAiZmlsZXMiOiBbXSwKICAgICAgICAgICAgLy8gICAgICAgImZvcm1hdEZpbGVTaXplIjogZm4sCiAgICAgICAgICAgIC8vICAgICAgICJvcHRpb25zIjoge30KICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAvLwoKICAgICAgICAgICAgdGhpcy53cmFwVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZUlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWxlcyA9IGNvbmZpZy5maWxlczsKICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0RmlsZVNpemUgPSBjb25maWcuZm9ybWF0RmlsZVNpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBjb25maWcub3B0aW9uczsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLm9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBBbHBhY2EuY2xvbmVPYmplY3QoZmlsZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zaXplID0gZm9ybWF0RmlsZVNpemUobW9kZWwuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmJ1dHRvbnMgPSBzZWxmLm9wdGlvbnMuYnV0dG9uczsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwudmlldyA9IHNlbGYudmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZUluZGV4ID0gaTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBBbHBhY2EudG1wbChzZWxmLnZpZXcuZ2V0VGVtcGxhdGVEZXNjcmlwdG9yKHRlbXBsYXRlSWQpLCBtb2RlbCwgc2VsZik7CgogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93WzBdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJvd3MgPSAkKHJvd3MpOwogICAgICAgICAgICAgICAgICAgICQocm93cykuZWFjaChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGV1cGxvYWQgJiYgb3B0aW9ucy5maWxldXBsb2FkLmF1dG9VcGxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgc3RhcnQgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoImJ1dHRvbi5zdGFydCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlV3JhcFJvdyh0aGlzLCBvcHRpb25zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuIGZpbGVpbXBsIGhhcyBjbGVhbmVkIHVwIHRoZSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYW5kbGUgQWpheCByZWxhdGVkIHN0dWZmIG9uIG91ciBvd24gaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgiYnV0dG9uLmRlbGV0ZSIpLm9uKCJkZXN0cm95ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCJidXR0b24uZGVsZXRlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQocm93KS5maW5kKCJidXR0b24uZGVsZXRlIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbmRleCA9ICQoYnV0dG9uKS5hdHRyKCJkYXRhLWZpbGUtaW5kZXgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbZmlsZUluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uRmlsZURlbGV0ZS5jYWxsKHNlbGYsIHJvdywgYnV0dG9uLCBmaWxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaWxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShmaWxlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsdWVBc0FycmF5KGFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuaXNPYmplY3RUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZUFzQXJyYXkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcldpdGhQcm9wYWdhdGlvbigiY2hhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChyb3dzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI2dldEZpZWxkVHlwZQogICAgICAgICAqLwogICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAidXBsb2FkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI3NldHVwCiAgICAgICAgICovCiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBib3R0b20gY29udHJvbCBidXR0b25zICh3ZSBoYXZlIGEgY29uZmxpY3Qgb3ZlciB0aGUgJ2J1dHRvbnMnIG5hbWVzcGFjZSkKICAgICAgICAgICAgc2VsZi5vcHRpb25zLnJlbmRlckJ1dHRvbnMgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmJ1dHRvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLmhpZGVEZWxldGVCdXR0b24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5idXR0b25zLnB1c2goewogICAgICAgICAgICAgICAgICAgICJrZXkiOiAiZGVsZXRlIiwKICAgICAgICAgICAgICAgICAgICAiaXNEZWxldGUiOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd1VwbG9hZFByZXZpZXcpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuc2hvd0hlYWRlcnMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnNob3dIZWFkZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmLmRhdGEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIG5vdCBhcnJheSBhbHJlYWR5CiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEgJiYgQWxwYWNhLmlzT2JqZWN0KHNlbGYuZGF0YSkpIHsKICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtzZWxmLmRhdGFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1cGxvYWQKICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29weWluZyBiYWNrIHRoZSBtYXhOdW1iZXJPZkZpbGVzIGZyb20gdGhlIHVwbG9hZCBwbHVnaW4ncyBzZXR0aW5ncwogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzKSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhOdW1iZXJPZkZpbGVzKSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcmVhc29uYWJsZSBtYXhOdW1iZXJPZkZpbGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMpID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPSAxOwogICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNBcnJheVR5cGUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzYWZlIGd1YXJkCiAgICAgICAgICAgIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKSB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubXVsdGlwbGUgPT09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA+IDEgfHwgc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQgcGx1Z2luIGNvbmZpZwogICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSA5OTk5OwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbWF4IGZpbGUgc2l6ZQogICAgICAgICAgICBpZiAodHlwZW9mKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPSBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSA9IC0xOyAvLyBubyBsaW1pdAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGNvcHkgc2V0dGluZyBpbnRvIHVwbG9hZAogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBsb2FkLm1heEZpbGVTaXplID0gc2VsZi5vcHRpb25zLm1heEZpbGVTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgIGlmICh0eXBlb2Yoc2VsZi5vcHRpb25zLmZpbGVUeXBlcykgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVwbG9hZC5hY2NlcHRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmZpbGVUeXBlcyA9IHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5maWxlVHlwZXMgPSBudWxsOyAvLyBubyByZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IHNldHRpbmcgaW50byB1cGxvYWQKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGxvYWQuYWNjZXB0RmlsZVR5cGVzID0gc2VsZi5vcHRpb25zLmZpbGVUeXBlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxlcgogICAgICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIgPSBmdW5jdGlvbihtZXNzYWdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChtZXNzYWdlcy5qb2luKCJcbiIpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIEFscGFjYSBpcyBjb25maWd1cmVkIGZvciBDU1JGIHN1cHBvcnQgYW5kIGEgQ1NSRiBjb29raWUgb3IgdG9rZW4gaXMgYXZhaWxhYmxlLAogICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IHRvIHRoZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgb3ZlciB0aGUgd2lyZSB2aWEgdGhlIHVuZGVybHlpbmcgYWpheAogICAgICAgICAgICAvLyBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wKCiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBDU1JGIHRva2VuLCBhcHBseSBpdCB0byB0aGUgaGVhZGVycwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gc2VsZi5kZXRlcm1pbmVDc3JmVG9rZW4oKTsKICAgICAgICAgICAgaWYgKGNzcmZUb2tlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZCA9IHt9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzID0ge307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwbG9hZC5oZWFkZXJzW0FscGFjYS5DU1JGX0hFQURFUl9OQU1FXSA9IGNzcmZUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVybWluZUNzcmZUb2tlbjogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBkaXJlY3QgdG9rZW4gc3BlY2lmaWVkPwogICAgICAgICAgICB2YXIgY3NyZlRva2VuID0gQWxwYWNhLkNTUkZfVE9LRU47CiAgICAgICAgICAgIGlmICghY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNvb2tpZSB0aGF0IHdlIGNhbiBwdWxsIHRoZSB2YWx1ZSBmcm9tPwogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBBbHBhY2EuQ1NSRl9DT09LSUVfTkFNRVNbdF07CgogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IEFscGFjYS5yZWFkQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcmZUb2tlbiA9IGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjc3JmVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgcHJlcGFyZUNvbnRyb2xNb2RlbDogZnVuY3Rpb24oY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBzZWxmLmJhc2UoZnVuY3Rpb24obW9kZWwpIHsKCiAgICAgICAgICAgICAgICBtb2RlbC50aHVtYm5haWxMYWJlbCA9IHNlbGYub3B0aW9ucy50aHVtYm5haWxMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwudGh1bWJuYWlsTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwudGh1bWJuYWlsTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoInRodW1ibmFpbCIpOwoJCX0KCiAgICAgICAgICAgICAgICBtb2RlbC5maWxlbmFtZUxhYmVsID0gc2VsZi5vcHRpb25zLmZpbGVuYW1lTGFiZWw7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmZpbGVuYW1lTGFiZWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWVMYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiZmlsZW5hbWUiKTsKCQl9CgogICAgICAgICAgICAgICAgbW9kZWwuZmlsZVNpemVMYWJlbCA9IHNlbGYub3B0aW9ucy5maWxlU2l6ZUxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5maWxlU2l6ZUxhYmVsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVTaXplTGFiZWwgPSBzZWxmLmdldE1lc3NhZ2UoImZpbGVTaXplIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVVcGxvYWRBY3Rpb25zTGFiZWwgPSBzZWxmLm9wdGlvbnMuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbDsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZmlsZVVwbG9hZEFjdGlvbnNMYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5maWxlVXBsb2FkQWN0aW9uc0xhYmVsID0gc2VsZi5nZXRNZXNzYWdlKCJmaWxlVXBsb2FkQWN0aW9uc0xhYmVsIik7CgkJfQoKICAgICAgICAgICAgICAgIG1vZGVsLmNob29zZUJ1dHRvbkxhYmVsID0gc2VsZi5vcHRpb25zLmNob29zZUJ1dHRvbkxhYmVsOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZXMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPT09IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5jaG9vc2VCdXR0b25MYWJlbCA9IHNlbGYuZ2V0TWVzc2FnZSgiY2hvb3NlRmlsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb2RlbC5kcm9wWm9uZU1lc3NhZ2UgPSBzZWxmLm9wdGlvbnMuZHJvcFpvbmVNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5kcm9wWm9uZU1lc3NhZ2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbW9kZWwuZHJvcFpvbmVNZXNzYWdlID0gc2VsZi5nZXRNZXNzYWdlKCJkcm9wWm9uZU11bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmRyb3Bab25lTWVzc2FnZSA9IHNlbGYuZ2V0TWVzc2FnZSgiZHJvcFpvbmVTaW5nbGUiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0RnJvbUV4aXN0aW5nTWVzc2FnZSA9IHNlbGYub3B0aW9ucy5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5zZWxlY3RGcm9tRXhpc3RpbmdNZXNzYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ011bHRpcGxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA9PT0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNlbGVjdEZyb21FeGlzdGluZ01lc3NhZ2UgPSBzZWxmLmdldE1lc3NhZ2UoInNlbGVjdEZyb21FeGlzdGluZ1NpbmdsZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjayhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUmVuZGVyQ29udHJvbDogZnVuY3Rpb24obW9kZWwsIGNhbGxiYWNrKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdGhpcy5iYXNlKG1vZGVsLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZVBvc3RSZW5kZXIoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGRpc3BsYXktb25seSBtb2RlLCB3ZSBoaWRlIGEgYnVuY2ggb2YgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNEaXNwbGF5T25seSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoImJ1dHRvbiIpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4iKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYWxwYWNhLWZpbGV1cGxvYWQtY2hvb3Nlcm93IikuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmRyb3B6b25lLW1lc3NhZ2UiKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB1cGxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0VXBsb2FkVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwVGVtcGxhdGUoImNvbnRyb2wtdXBsb2FkLXBhcnRpYWwtdXBsb2FkIik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZG93bmxvYWQgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgZ2V0RG93bmxvYWRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBUZW1wbGF0ZSgiY29udHJvbC11cGxvYWQtcGFydGlhbC1kb3dubG9hZCIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEV4dGVuc2lvbiBwb2ludCBmb3IgbW9kaWZ5aW5nIHRoZSBkYXRhIGFoZWFkIG9mIGFuIHVwbG9hZCBzdWJtaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQ6IGZ1bmN0aW9uKGRhdGEpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBoYW5kbGVQb3N0UmVuZGVyOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuY29udHJvbDsKCiAgICAgICAgICAgIC8vIGZpbGUgdXBsb2FkIGNvbmZpZwogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gZGVmYXVsdHMKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZGF0YVR5cGUiXSA9ICJqc29uIjsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGVJZCJdID0gbnVsbDsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXBsb2FkVGVtcGxhdGUiXSA9IHRoaXMuZ2V0VXBsb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZG93bmxvYWRUZW1wbGF0ZUlkIl0gPSBudWxsOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkb3dubG9hZFRlbXBsYXRlIl0gPSB0aGlzLmdldERvd25sb2FkVGVtcGxhdGUoKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1siZmlsZXNDb250YWluZXIiXSA9ICQoZWwpLmZpbmQoIi5maWxlcyIpOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJkcm9wWm9uZSJdID0gJChlbCkuZmluZCgiLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUiKTsKICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sidXJsIl0gPSAiLyI7CiAgICAgICAgICAgIGZpbGVVcGxvYWRDb25maWdbIm1ldGhvZCJdID0gInBvc3QiOwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJzaG93VXBsb2FkUHJldmlldyJdID0gc2VsZi5vcHRpb25zLnNob3dVcGxvYWRQcmV2aWV3OwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy51cGxvYWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gc2VsZi5vcHRpb25zLnVwbG9hZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnW2tdID0gc2VsZi5vcHRpb25zLnVwbG9hZFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tdWx0aXBsZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibXVsdGlwbGUiLCB0cnVlKTsKICAgICAgICAgICAgICAgIC8vJChlbCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLWlucHV0IikuYXR0cigibmFtZSIsIHNlbGYubmFtZSArICJfZmlsZXNbXSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCIpLmF0dHIoIm5hbWUiLCBzZWxmLm9wdGlvbnMubmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhdCBmaXJzdAogICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZCwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyLiAgT3RoZXJ3aXNlLCBoaWRlIGl0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcGFyYW0gZQogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZENvbmZpZ1sicHJvZ3Jlc3NhbGwiXSA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIHNob3dQcm9ncmVzc0JhciA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGRhdGEubG9hZGVkIDwgZGF0YS50b3RhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzc0JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCIucHJvZ3Jlc3MiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTsKICAgICAgICAgICAgICAgICAgICAkKCcjcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoIi5wcm9ncmVzcyIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzb21lIGxpbWl0IGNoZWNrcwogICAgICAgICAgICBmaWxlVXBsb2FkQ29uZmlnWyJhZGQiXSA9IGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkRXJyb3JzID0gW107CgogICAgICAgICAgICAgICAgdmFyIGkgPSAwOwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmFkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpIDwgZGF0YS5maWxlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBzZWxmLm9wdGlvbnMuZmlsZVR5cGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihzZWxmLm9wdGlvbnMuZmlsZVR5cGVzKSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKHNlbGYub3B0aW9ucy5maWxlVHlwZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkYXRhLmZpbGVzW2ldWyJ0eXBlIl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKCdOb3QgYW4gYWNjZXB0ZWQgZmlsZSB0eXBlOiAnICsgZGF0YS5maWxlc1tpXVsidHlwZSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMubWF4RmlsZVNpemUgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbaV0uc2l6ZSA+IHNlbGYub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEVycm9ycy5wdXNoKHNlbGYuZ2V0TWVzc2FnZSgiZmlsZVRvb0JpZyIpICsgZGF0YS5maWxlc1tpXS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoYmFkKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmZpbGVzLmxlbmd0aCk7CgogICAgICAgICAgICAgICAgaWYgKHVwbG9hZEVycm9ycy5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIodXBsb2FkRXJyb3JzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5Q29uZmlndXJhdGlvbihmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBjb250cm9sCiAgICAgICAgICAgIHZhciBmaWxlVXBsb2FkID0gc2VsZi5maWxlVXBsb2FkID0gJChlbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0JykuZmlsZXVwbG9hZChmaWxlVXBsb2FkQ29uZmlnKTsKCiAgICAgICAgICAgIC8vIFdoZW4gZmlsZSB1cGxvYWQgb2YgYSBmaWxlIGNvbXBsZXRlcywgd2Ugb2ZmZXIgdGhlIGNoYW5jZSB0byBhZGp1c3QgdGhlIGRhdGEgYWhlYWQgb2YgRmlsZVVwbG9hZAogICAgICAgICAgICAvLyBnZXR0aW5nIGl0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNlcnZlciBzaWRlIEpTT04gYnV0IGNvdWxkIGRvCiAgICAgICAgICAgIC8vIGEgbGl0dGxlIGJpdCBvZiBtYWdpYyBpbiB0aGUgY2xpZW50LgogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmRGaXJzdCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgdmFyIGVuaGFuY2VGaWxlcyA9IHNlbGYub3B0aW9ucy5lbmhhbmNlRmlsZXM7CiAgICAgICAgICAgICAgICBpZiAoZW5oYW5jZUZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuaGFuY2VGaWxlcyhmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjb3B5IGJhY2sgZG93biBpbnRvIGRhdGEuZmlsZXMKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBkYXRhLnJlc3VsdC5maWxlczsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaFZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBXaGVuIGZpbGVzIGFyZSBzdWJtaXR0ZWQsIHRoZSAicHJvcGVydGllcyIgYW5kICJwYXJhbWV0ZXJzIiBvcHRpb25zIG1hcCBhcmUgZXNwZWNpYWxseSB0cmVhdGVkCiAgICAgICAgICAgIC8vIGFuZCBhcmUgd3JpdHRlbiBpbnRvIHByb3BlcnR5PGluZGV4Pl9fPGtleT4gYW5kIHBhcmFtPGluZGV4Pl9fa2V5IGVudHJpZXMgaW4gdGhlIGZvcm0gZGF0YS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIG11bHRpLXBhcnQgcmVjZWl2ZXJzIHRvIGdldCB2YWx1ZXMgb24gYSBwZXItZmlsZSBiYXNpcy4KICAgICAgICAgICAgLy8gUGxhbnMgYXJlIHRvIGFsbG93IHRva2VuIHN1YnN0aXR1dGlvbiBhbmQgb3RoZXIgY2xpZW50LXNpZGUgdHJlYXRtZW50IGFoZWFkIG9mIHBvc3RpbmcuCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZEZpcnN0KCJmaWxldXBsb2Fkc3VibWl0IiwgZnVuY3Rpb24oZSwgZGF0YSkgewoKICAgICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24oaW5kZXgsIGZpbGUpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWxmLm9wdGlvbnNbInByb3BlcnRpZXMiXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICJwcm9wZXJ0eSIgKyBpbmRleCArICJfXyIgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWx1ZSA9IHNlbGYub3B0aW9uc1sicHJvcGVydGllcyJdW2tleV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IHNlbGYuYXBwbHlUb2tlblN1YnN0aXR1dGlvbnMocHJvcGVydHlWYWx1ZSwgaW5kZXgsIGZpbGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvcm1EYXRhW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbihpbmRleCwgZmlsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlbGYub3B0aW9uc1sicGFyYW1ldGVycyJdKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gInBhcmFtIiArIGluZGV4ICsgIl9fIiArIGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gc2VsZi5vcHRpb25zWyJwYXJhbWV0ZXJzIl1ba2V5XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gc2VsZi5hcHBseVRva2VuU3Vic3RpdHV0aW9ucyhwYXJhbVZhbHVlLCBpbmRleCwgZmlsZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JtRGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9ybURhdGFbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUJlZm9yZUZpbGVVcGxvYWRTdWJtaXQoZGF0YSk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5iZWZvcmVGaWxlVXBsb2FkU3VibWl0SGFuZGxlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuYmVmb3JlRmlsZVVwbG9hZFN1Ym1pdEhhbmRsZXIuY2FsbChzZWxmLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gZmlsZXMgYXJlIHVwbG9hZGVkLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZpbGVVcGxvYWQuYmluZCgiZmlsZXVwbG9hZGRvbmUiLCBmdW5jdGlvbihlLCBkYXRhKSB7CgogICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcKICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IHNlbGYuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBkYXRhLmZpbGVzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlQXNBcnJheShhcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udmVydEZpbGVUb0Rlc2NyaXB0b3IoZGF0YS5maWxlc1tpXSwgZnVuY3Rpb24gKGVyciwgZGVzY3JpcHRvcikgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGYoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmKDApOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGZpbGUgdXBsb2FkcyBmYWlsLCBhbGVydC4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZmlsZVVwbG9hZC5iaW5kKCJmaWxldXBsb2FkZmFpbCIsIGZ1bmN0aW9uKGUsIGRhdGEpIHsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLm9uVXBsb2FkRmFpbChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBoYW5kbGUgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmaWxlVXBsb2FkLmJpbmQoImZpbGV1cGxvYWRhbHdheXMiLCBmdW5jdGlvbihlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hVSVN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGV4dGVuc2lvbgogICAgICAgICAgICBzZWxmLmFwcGx5QmluZGluZ3MoZmlsZVVwbG9hZCwgZWwpOwoKICAgICAgICAgICAgLy8gYWxsb3cgZm9yIHByZWxvYWRpbmcgb2YgZG9jdW1lbnRzCiAgICAgICAgICAgIHNlbGYucHJlbG9hZChmaWxlVXBsb2FkLCBlbCwgZnVuY3Rpb24oZmlsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclByZWxvYWQoZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YoZG9jdW1lbnQpICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgnZHJvcCBkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoYW5kbGVXcmFwUm93OiBmdW5jdGlvbihyb3csIG9wdGlvbnMpCiAgICAgICAgewoKICAgICAgICB9LAoKICAgICAgICBhcHBseVRva2VuU3Vic3RpdHV0aW9uczogZnVuY3Rpb24odGV4dCwgaW5kZXgsIGZpbGUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW5zID0gewogICAgICAgICAgICAgICAgImluZGV4IjogaW5kZXgsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6IGZpbGUudGh1bWJuYWlsVXJsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBzdWJzdGl0dXRlIGFueSB0b2tlbnMKICAgICAgICAgICAgdmFyIHggPSAtMTsKICAgICAgICAgICAgdmFyIGIgPSAwOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ID0gdGV4dC5pbmRleE9mKCJ7IiwgYik7CiAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gdGV4dC5pbmRleE9mKCJ9IiwgeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRleHQuc3Vic3RyaW5nKHggKyBjYXIubGVuZ3RoLCB5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHRva2Vuc1t0b2tlbl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHgpICsgcmVwbGFjZW1lbnQgKyB0ZXh0LnN1YnN0cmluZyh5KzEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBiID0geSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlKHggPiAtMSk7CgogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGFkZGluZyBwcm9wZXJ0aWVzIGFuZCBjYWxsYmFja3MgdG8gdGhlIGZpbGUgdXBsb2FkIGNvbmZpZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlVXBsb2FkY29uZmlnCiAgICAgICAgICovCiAgICAgICAgYXBwbHlDb25maWd1cmF0aW9uOiBmdW5jdGlvbihmaWxlVXBsb2FkY29uZmlnKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yIGJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgdG8gZmlsZSB1cGxvYWQgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqLwogICAgICAgIGFwcGx5QmluZGluZ3M6IGZ1bmN0aW9uKGZpbGVVcGxvYWQpCiAgICAgICAgewogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGZyb20gYSBmaWxlIHRvIGEgc3RvcmFnZSBkZXNjcmlwdG9yLgogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIgogICAgICAgICAqICAgICAgICAgIC4uLgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogQSBkZXNjcmlwdG9yIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBhcyBuZWVkZWQgYnkgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAqIHNvIGFzIHRvIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXNjcmliZWQgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBtZWNoYW5pc20gbWF5IG5lZWQgdG8gYmUgY29uc3VsdGVkLiAgVGh1cywgdGhpcyBpcyBhc3luYy4KICAgICAgICAgKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkZXNjcmlwdG9yIG1pbWljcyB0aGUgZmlsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBmaWxlCiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikKICAgICAgICAgKi8KICAgICAgICBjb252ZXJ0RmlsZVRvRGVzY3JpcHRvcjogZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsKICAgICAgICAgICAgICAgICJpZCI6IGZpbGUuaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGZpbGUubmFtZSwKICAgICAgICAgICAgICAgICJzaXplIjogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgInVybCI6IGZpbGUudXJsLAogICAgICAgICAgICAgICAgInRodW1ibmFpbFVybCI6ZmlsZS50aHVtYm5haWxVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVXJsIjogZmlsZS5kZWxldGVVcmwsCiAgICAgICAgICAgICAgICAiZGVsZXRlVHlwZSI6IGZpbGUuZGVsZXRlVHlwZQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzY3JpcHRvcik7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdG9yYWdlIGRlc2NyaXB0b3IgdG8gYSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQSBmaWxlIGxvb2tzIGxpa2U6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgIHsKICAgICAgICAgKiAgICAgICAgICAiaWQiOiAiIiwKICAgICAgICAgKiAgICAgICAgICAibmFtZSI6ICJwaWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgICAgICJ1cmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgICAgICJ0aHVtYm5haWxVcmwiOiAiaHR0cDpcL1wvZXhhbXBsZS5vcmdcL2ZpbGVzXC90aHVtYm5haWxcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAgICAgImRlbGV0ZVR5cGUiOiAiREVMRVRFIgogICAgICAgICAqICAgICAgfQogICAgICAgICAqCiAgICAgICAgICogU2luY2UgYW4gdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBtYXkgYmUgY29uc3VsdGVkLCBhbiBhc3luYyBjYWxsYmFjayBob29rIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRlc2NyaXB0b3IgbWltaWNzIHRoZSBmaWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24oZXJyLCBmaWxlKQogICAgICAgICAqLwogICAgICAgIGNvbnZlcnREZXNjcmlwdG9yVG9GaWxlOiBmdW5jdGlvbihkZXNjcmlwdG9yLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWxlID0gewogICAgICAgICAgICAgICAgImlkIjogZGVzY3JpcHRvci5pZCwKICAgICAgICAgICAgICAgICJuYW1lIjogZGVzY3JpcHRvci5uYW1lLAogICAgICAgICAgICAgICAgInNpemUiOiBkZXNjcmlwdG9yLnNpemUsCiAgICAgICAgICAgICAgICAidXJsIjogZGVzY3JpcHRvci51cmwsCiAgICAgICAgICAgICAgICAidGh1bWJuYWlsVXJsIjpkZXNjcmlwdG9yLnRodW1ibmFpbFVybCwKICAgICAgICAgICAgICAgICJkZWxldGVVcmwiOiBkZXNjcmlwdG9yLmRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJkZWxldGVUeXBlIjogZGVzY3JpcHRvci5kZWxldGVUeXBlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBFeHRlbnNpb24gcG9pbnQgZm9yICJlbmhhbmNpbmciIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhZnRlciB1cGxvYWRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuCiAgICAgICAgICogVGhpcyBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnZlcnQgdGhlIGRhdGEucm93cyBiYWNrIGludG8gdGhlIGZvcm1hdCB3aGljaCB0aGUgdXBsb2FkIGNvbnRyb2wgZXhwZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAgKgogICAgICAgICAqICAgIGRhdGEucmVzdWx0LnJvd3MgPSBbey4uLn1dCiAgICAgICAgICogICAgZGF0YS5yZXN1bHQuZmlsZXMgPSBbewogICAgICAgICAqICAgICAgImlkIjogIiIsCiAgICAgICAgICogICAgICAicGF0aCI6ICIiLAogICAgICAgICAqICAgICAgIm5hbWUiOiAicGljdHVyZTEuanBnIiwKICAgICAgICAgKiAgICAgICJzaXplIjogOTAyNjA0LAogICAgICAgICAqICAgICAgInVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAidGh1bWJuYWlsVXJsIjogImh0dHA6XC9cL2V4YW1wbGUub3JnXC9maWxlc1wvdGh1bWJuYWlsXC9waWN0dXJlMS5qcGciLAogICAgICAgICAqICAgICAgImRlbGV0ZVVybCI6ICJodHRwOlwvXC9leGFtcGxlLm9yZ1wvZmlsZXNcL3BpY3R1cmUxLmpwZyIsCiAgICAgICAgICogICAgICAiZGVsZXRlVHlwZSI6ICJERUxFVEUiKgogICAgICAgICAqICAgIH1dCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZENvbmZpZwogICAgICAgICAqIEBwYXJhbSBkYXRhCiAgICAgICAgICovCiAgICAgICAgZW5oYW5jZUZpbGVzOiBmdW5jdGlvbihmaWxlVXBsb2FkQ29uZmlnLCBkYXRhKQogICAgICAgIHsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBQcmVsb2FkcyBkYXRhIGRlc2NyaXB0b3JzIGludG8gZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gZmlsZVVwbG9hZAogICAgICAgICAqIEBwYXJhbSBlbAogICAgICAgICAqIEBwYXJhbSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIHByZWxvYWQ6IGZ1bmN0aW9uKGZpbGVVcGxvYWQsIGVsLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBmaWxlcyA9IFtdOwoKICAgICAgICAgICAgLy8gbm93IHByZWxvYWQgd2l0aCBmaWxlcyBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAgICB2YXIgZGVzY3JpcHRvcnMgPSBzZWxmLmdldFZhbHVlQXNBcnJheSgpOwoKICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbihpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBkZXNjcmlwdG9ycy5sZW5ndGgpIC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBkb25lCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZpbGVzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnREZXNjcmlwdG9yVG9GaWxlKGRlc2NyaXB0b3JzW2ldLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYoaSsxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmKDApOwogICAgICAgIH0sCgogICAgICAgIGFmdGVyUHJlbG9hZDogZnVuY3Rpb24oZmlsZVVwbG9hZCwgZWwsIGZpbGVzLCBjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHNlbGYucmVmcmVzaFVJU3RhdGUoKTsKCiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLkNvbnRyb2xGaWVsZCNnZXRDb250cm9sVmFsdWUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250cm9sVmFsdWU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZHMgYmFjayB0aGUgdmFsdWUgYXMgZWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSwgZGVwZW5kaW5nIG9uIHRoZSBzY2hlbWEgdHlwZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHsqfQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGE7CgogICAgICAgICAgICBpZiAodGhpcy5pc09iamVjdFR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0YVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEFscGFjYS5pc0FycmF5KHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFscGFjYS5pc09iamVjdCh2YWx1ZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gW3ZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZhYmxlKCk7CgogICAgICAgICAgICB0aGlzLnRyaWdnZXJVcGRhdGUoKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHRoZSB2YWx1ZSBhcyBhbiBhcnJheQogICAgICAgICAqLwogICAgICAgIGdldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhcnJheQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlQXNBcnJheTogZnVuY3Rpb24oYXJyYXkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBpZiAoc2VsZi5pc0FycmF5VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKGFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzZWxmLmlzT2JqZWN0VHlwZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJyYXlbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2VsZi5zZXRWYWx1ZSh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVsb2FkOiBmdW5jdGlvbihjYWxsYmFjaykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9ycyA9IHRoaXMuZ2V0VmFsdWVBc0FycmF5KCk7CgogICAgICAgICAgICB2YXIgZmlsZXMgPSBbXTsKCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgPT09IGRlc2NyaXB0b3JzLmxlbmd0aCkgLy8ganNoaW50IGlnbm9yZTpsaW5lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGRvbmUKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSAkKHNlbGYuY29udHJvbCkuZmluZCgnLmFscGFjYS1maWxldXBsb2FkLWlucHV0Jyk7CiAgICAgICAgICAgICAgICAgICAgJChmb3JtKS5maWxldXBsb2FkKCdvcHRpb24nLCAnZG9uZScpLmNhbGwoZm9ybSwgJC5FdmVudCgnZG9uZScpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB2YWxpZGF0aW9uIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoVmFsaWRhdGlvblN0YXRlKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNlbGYuY29udmVydERlc2NyaXB0b3JUb0ZpbGUoZGVzY3JpcHRvcnNbaV0sIGZ1bmN0aW9uKGVyciwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZihpKzEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGYoMCk7CiAgICAgICAgfSwKCiAgICAgICAgcGx1Z2luOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICByZXR1cm4gJChzZWxmLmNvbnRyb2wpLmZpbmQoJy5hbHBhY2EtZmlsZXVwbG9hZC1pbnB1dCcpLmRhdGEoKS5ibHVlaW1wRmlsZXVwbG9hZDsKICAgICAgICB9LAoKICAgICAgICByZWZyZXNoVUlTdGF0ZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWQgPSBzZWxmLnBsdWdpbigpOwogICAgICAgICAgICBpZiAoZmlsZVVwbG9hZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1heE51bWJlck9mRmlsZXMgPSBzZWxmLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlczsKCiAgICAgICAgICAgICAgICBpZiAobWF4TnVtYmVyT2ZGaWxlcyA9PT0gLTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMgJiYgZmlsZVVwbG9hZC5vcHRpb25zLmdldE51bWJlck9mRmlsZXMoKSA+PSBtYXhOdW1iZXJPZkZpbGVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoQnV0dG9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmcmVzaEJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVmcmVzaEJ1dHRvbnM6IGZ1bmN0aW9uKGVuYWJsZWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHNlbGVjdCBmaWxlcyBidXR0b24KICAgICAgICAgICAgJChzZWxmLmNvbnRyb2wpLmZpbmQoIi5idG4uZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuYnRuLmZpbGVpbnB1dC1idXR0b24iKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoKICAgICAgICAgICAgLy8gaGlkZSBkcm9wem9uZSBtZXNzYWdlCiAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwoKICAgICAgICAgICAgaWYgKGVuYWJsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBzZWxlY3QgZmlsZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKHNlbGYuY29udHJvbCkuZmluZCgiLmJ0bi5maWxlaW5wdXQtYnV0dG9uIikuYXR0cigiZGlzYWJsZWQiLCBudWxsKTsKCiAgICAgICAgICAgICAgICAvLyBzaG93IGRyb3B6b25lIG1lc3NhZ2UKICAgICAgICAgICAgICAgICQoc2VsZi5jb250cm9sKS5maW5kKCIuZmlsZXVwbG9hZC1hY3RpdmUtem9uZSBwLmRyb3B6b25lLW1lc3NhZ2UiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uRmlsZURlbGV0ZTogZnVuY3Rpb24ocm93RWwsIGJ1dHRvbkVsLCBmaWxlKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgdmFyIGRlbGV0ZVVybCA9IGZpbGUuZGVsZXRlVXJsOwogICAgICAgICAgICB2YXIgZGVsZXRlTWV0aG9kID0gZmlsZS5kZWxldGVUeXBlOwoKICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAibWV0aG9kIjogZGVsZXRlTWV0aG9kLAogICAgICAgICAgICAgICAgInVybCI6IGRlbGV0ZVVybCwKICAgICAgICAgICAgICAgICJoZWFkZXJzIjoge30KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjc3JmVG9rZW4gPSBzZWxmLmRldGVybWluZUNzcmZUb2tlbigpOwogICAgICAgICAgICBpZiAoY3NyZlRva2VuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLmhlYWRlcnNbQWxwYWNhLkNTUkZfSEVBREVSX05BTUVdID0gY3NyZlRva2VuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkLmFqYXgoYyk7CiAgICAgICAgfSwKCiAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5lcnJvckhhbmRsZXIuY2FsbChzZWxmLCBbZGF0YS5lcnJvclRocm93bl0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uZXJyb3IgPSBkYXRhLmVycm9yVGhyb3duOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGQjZGlzYWJsZQogICAgICAgICAqLwogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIGRpc2FibGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucHJvcCgiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgogICAgICAgICAgICAvLyBoaWRlIHRoZSB1cGxvYWQgd2VsbAogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIikuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkI2VuYWJsZQogICAgICAgICAqLwogICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCh0aGlzLmZpZWxkKS5maW5kKCIuZmlsZWlucHV0LWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAkKHRoaXMuZmllbGQpLmZpbmQoIi5maWxlaW5wdXQtYnV0dG9uIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCiAgICAgICAgICAgIC8vIHNob3cgdGhlIHVwbG9hZCB3ZWxsCiAgICAgICAgICAgICQodGhpcy5maWVsZCkuZmluZCgiLmFscGFjYS1maWxldXBsb2FkLXdlbGwiKS5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOwogICAgICAgIH0sCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBsb2FkIEZpZWxkIjsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5Db250cm9sRmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYW4gdXBsb2FkIGZpZWxkIHdpdGggc3VwcG9ydCBmb3IgdGh1bWJuYWlsIHByZXZpZXciOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkNvbnRyb2xGaWVsZCNnZXRUeXBlCiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiYXJyYXkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZlNjaGVtYQogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtYXhOdW1iZXJPZkZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiTWF4aW11bSBOdW1iZXIgb2YgRmlsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGFsbG93IHRvIGJlIHVwbG9hZGVkLiAgSWYgZ3JlYXRlciB0aGFuIHplcm8sIHRoZSBtYXhpbXVtIG51bWJlciB3aWxsIGJlIGNvbnN0cmFpbmVkLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtYXhGaWxlU2l6ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk1heGltdW0gRmlsZSBTaXplIChpbiBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgcGVyIHVwbG9hZC4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgd2lsbCBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzaXplIGluIGJ5dGVzLiAgSWYgLTEsIHRoZW4gbm8gbGltaXQgaXMgaW1wb3NlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IC0xCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZmlsZVR5cGVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRmlsZSBUeXBlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaW1pdGluZyB0aGUgZmlsZSB0eXBlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCBiYXNlZCBvbiBmaWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIk11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gYWxsb3cgbXVsdGlwbGUgZmlsZSB1cGxvYWRzLiAgSWYgbWF4TnVtYmVyT2ZGaWxlcyBpcyBub3Qgc3BlY2lmaWVkLCBtdWx0aXBsZSB3aWxsIHRvZ2dsZSBiZXR3ZWVuIDEgYW5kIHVubGltaXRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInNob3dVcGxvYWRQcmV2aWV3IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiU2hvdyBVcGxvYWQgUHJldmlldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHNob3cgdGh1bWJuYWlscyBmb3IgdXBsb2FkZWQgYXNzZXRzIChyZXF1aXJlcyBwcmV2aWV3IHN1cHBvcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVycm9ySGFuZGxlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogIkVycm9yIEhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgZnVuY3Rpb24gaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBmaWxlcyBmYWlscyB0byB1cGxvYWQuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIHhIUiByZXF1ZXN0IGFuZCBwb3B1bGF0aW5nIHRoZSBlcnJvciBtZXNzYWdlIHN0YXRlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBlbmRfYnVpbGRlcl9oZWxwZXJzICovCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cGxvYWQiLCBBbHBhY2EuRmllbGRzLlVwbG9hZEZpZWxkKTsKCiAgICBBbHBhY2EucmVnaXN0ZXJNZXNzYWdlcyh7CgkiZmlsZVRvb0JpZyI6ICJGaWxlIGlzIHRvbyBiaWc6ICIsCgkidGh1bWJuYWlsIjogIlRodW1ibmFpbCIsCgkiZmlsZW5hbWUiOiAiTmFtZSIsCgkiZmlsZVNpemUiOiAiU2l6ZSIsCgkiZmlsZVVwbG9hZEFjdGlvbnMiOiAiQWN0aW9ucyIsCiAgICAgICAgImNob29zZUZpbGUiOiAiQ2hvb3NlIEZpbGUuLi4iLAogICAgICAgICJjaG9vc2VGaWxlcyI6ICJDaG9vc2UgRmlsZXMuLi4iLAogICAgICAgICJkcm9wWm9uZVNpbmdsZSI6ICJDbGljayB0aGUgQ2hvb3NlIGJ1dHRvbiBvciBEcmFnIGFuZCBEcm9wIGEgZmlsZSBoZXJlIHRvIHVwbG9hZC4uLiIsCiAgICAgICAgImRyb3Bab25lTXVsdGlwbGUiOiAiQ2xpY2sgdGhlIENob29zZSBidXR0b24gb3IgRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlIHRvIHVwbG9hZC4uLiIKICAgIH0pOwoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YXRlLWZhY2UvanF1ZXJ5LmJpbmQtZmlyc3QvYmxvYi9tYXN0ZXIvZGV2L2pxdWVyeS5iaW5kLWZpcnN0LmpzCiAgICAvLyBqcXVlcnkuYmluZC1maXJzdC5qcwogICAgKGZ1bmN0aW9uKCQpIHsKICAgICAgICB2YXIgc3BsaXRWZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoIi4iKTsKICAgICAgICB2YXIgbWFqb3IgPSBwYXJzZUludChzcGxpdFZlcnNpb25bMF0pOwogICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KHNwbGl0VmVyc2lvblsxXSk7CgogICAgICAgIHZhciBKUV9MVF8xNyA9IChtYWpvciA8IDEpIHx8IChtYWpvciA9PT0gMSAmJiBtaW5vciA8IDcpOwoKICAgICAgICBmdW5jdGlvbiBldmVudHNEYXRhKCRlbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBKUV9MVF8xNyA/ICRlbC5kYXRhKCdldmVudHMnKSA6ICQuX2RhdGEoJGVsWzBdKS5ldmVudHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlSGFuZGxlclRvVG9wKCRlbCwgZXZlbnROYW1lLCBpc0RlbGVnYXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYXRhID0gZXZlbnRzRGF0YSgkZWwpOwogICAgICAgICAgICB2YXIgZXZlbnRzID0gZGF0YVtldmVudE5hbWVdOwoKICAgICAgICAgICAgaWYgKCFKUV9MVF8xNykgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBpc0RlbGVnYXRlZCA/IGV2ZW50cy5zcGxpY2UoZXZlbnRzLmRlbGVnYXRlQ291bnQgLSAxLCAxKVswXSA6IGV2ZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaXNEZWxlZ2F0ZWQgPyAwIDogKGV2ZW50cy5kZWxlZ2F0ZUNvdW50IHx8IDApLCAwLCBoYW5kbGVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlZCkgewogICAgICAgICAgICAgICAgZGF0YS5saXZlLnVuc2hpZnQoZGF0YS5saXZlLnBvcCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KGV2ZW50cy5wb3AoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmVFdmVudEhhbmRsZXJzKCRlbGVtcywgZXZlbnRzU3RyaW5nLCBpc0RlbGVnYXRlKSB7CiAgICAgICAgICAgIHZhciBldmVudHMgPSBldmVudHNTdHJpbmcuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICAkZWxlbXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB1cmVFdmVudE5hbWUgPSAkLnRyaW0oZXZlbnRzW2ldKS5tYXRjaCgvW15cLl0rL2kpWzBdOwogICAgICAgICAgICAgICAgICAgIG1vdmVIYW5kbGVyVG9Ub3AoJCh0aGlzKSwgcHVyZUV2ZW50TmFtZSwgaXNEZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJC5mbi5iaW5kRmlyc3QgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYXJncyA9ICQubWFrZUFycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICAgIHZhciBldmVudHNTdHJpbmcgPSBhcmdzLnNoaWZ0KCk7CgogICAgICAgICAgICBpZiAoZXZlbnRzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAkLmZuLmJpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIG1vdmVFdmVudEhhbmRsZXJzKHRoaXMsIGV2ZW50c1N0cmluZyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgfSkoJCk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLkZpZWxkcy5VcHBlckNhc2VGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQucHJvdG90eXBlCiAgICAgKi8KICAgIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVwcGVyY2FzZSI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICB0aGlzLmJhc2UoKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXRWYWx1ZQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWwpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXZhbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZSh2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdXBwZXJWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICh2YWwgJiYgQWxwYWNhLmlzU3RyaW5nKHZhbCkpIHsKICAgICAgICAgICAgICAgIHVwcGVyVmFsdWUgPSB2YWwudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVwcGVyVmFsdWUgIT0gdGhpcy5nZXRWYWx1ZSgpKSAvLyBqc2hpbnQgaWdub3JlOmxpbmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5iYXNlKHVwcGVyVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuQ29udHJvbEZpZWxkI29uS2V5UHJlc3MKICAgICAgICAgKi8KICAgICAgICBvbktleVByZXNzOiBmdW5jdGlvbihlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKGUpOwoKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIEFscGFjYS5sYXRlcigyNSwgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdiA9IF90aGlzLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVXBwZXJjYXNlIFRleHQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiVGV4dCBmaWVsZCBmb3IgdXBwZXJjYXNlIHRleHQuIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3RlckZpZWxkQ2xhc3MoInVwcGVyY2FzZSIsIEFscGFjYS5GaWVsZHMuVXBwZXJDYXNlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygidXBwZXJjYXNlIiwgInVwcGVyY2FzZSIpOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5GaWVsZHMuVVJMRmllbGQgPSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZC5leHRlbmQoCiAgICAvKioKICAgICAqIEBsZW5kcyBBbHBhY2EuRmllbGRzLlVSTEZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInVybCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNzZXR1cAogICAgICAgICAqLwogICAgICAgIHNldHVwOiBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICAvLyBkZWZhdWx0IGh0bWw1IGlucHV0IHR5cGUgPSAidXJsIjsKICAgICAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSAidXJsIjsKCiAgICAgICAgICAgIHRoaXMuYmFzZSgpOwoKICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCkgPT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dJbnRyYW5ldCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93SW50cmFuZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siaW50cmFuZXQtdXJsIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2NoZW1hLmZvcm1hdCA9ICJ1cmkiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjaGFuZGxlVmFsaWRhdGUKICAgICAgICAgKi8KICAgICAgICBoYW5kbGVWYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICB2YWxJbmZvWyJpbnZhbGlkUGF0dGVybiJdWyJtZXNzYWdlIl0gPSB0aGlzLmdldE1lc3NhZ2UoImludmFsaWRVUkxGb3JtYXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKICAgICAgICAvKiBidWlsZGVyX2hlbHBlcnMgKi8KICAgICAgICAsCgogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRTY2hlbWFPZk9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRTY2hlbWFPZk9wdGlvbnM6IGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgcmV0dXJuIEFscGFjYS5tZXJnZSh0aGlzLmJhc2UoKSwgewogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJBbGxvdyBpbnRyYW5ldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGxvd3MgVVJMcyB3aXRoIHVucXVhbGlmaWVkIGhvc3RuYW1lcyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImFsbG93SW50cmFuZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRUaXRsZQogICAgICAgICAqLwogICAgICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwgRmllbGQiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0RGVzY3JpcHRpb24KICAgICAgICAgKi8KICAgICAgICBnZXREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCB2YWxpZGF0aW9uIGZvciBhbiBpbnRlcm5ldCB3ZWIgYWRkcmVzcy4iOwogICAgICAgIH0KCiAgICAgICAgLyogZW5kX2J1aWxkZXJfaGVscGVycyAqLwogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyTWVzc2FnZXMoewogICAgICAgICJpbnZhbGlkVVJMRm9ybWF0IjogIlRoZSBVUkwgcHJvdmlkZWQgaXMgbm90IGEgdmFsaWQgd2ViIGFkZHJlc3MuIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ1cmwiLCBBbHBhY2EuRmllbGRzLlVSTEZpZWxkKTsKICAgIEFscGFjYS5yZWdpc3RlckRlZmF1bHRGb3JtYXRGaWVsZE1hcHBpbmcoInVybCIsICJ1cmwiKTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EuRmllbGRzLlppcGNvZGVGaWVsZCA9IEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkLmV4dGVuZCgKICAgIC8qKgogICAgICogQGxlbmRzIEFscGFjYS5GaWVsZHMuWmlwY29kZUZpZWxkLnByb3RvdHlwZQogICAgICovCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXRGaWVsZFR5cGUKICAgICAgICAgKi8KICAgICAgICBnZXRGaWVsZFR5cGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gInppcGNvZGUiOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjc2V0dXAKICAgICAgICAgKi8KICAgICAgICBzZXR1cDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZm9ybWF0ID0gKHRoaXMub3B0aW9ucy5mb3JtYXQgPyB0aGlzLm9wdGlvbnMuZm9ybWF0IDogIm5pbmUiKTsKCiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAibmluZSIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnBhdHRlcm4gPSBBbHBhY2EucmVnZXhwc1siemlwY29kZS1uaW5lIl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtZml2ZSJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWxwYWNhLmxvZ0Vycm9yKCJUaGUgY29uZmlndXJlZCB6aXBjb2RlIGZvcm1hdDogIiArIHRoaXMub3B0aW9ucy5mb3JtYXQgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIFtmaXZlLCBuaW5lXSIpOwoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbmluZSBmb3JtYXQKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXQgPSAibmluZSI7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wYXR0ZXJuID0gQWxwYWNhLnJlZ2V4cHNbInppcGNvZGUtbmluZSJdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgbWFzayBzdHJpbmcKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQgPT09ICJuaW5lIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zWyJtYXNrU3RyaW5nIl0gPSAiOTk5OTktOTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gImZpdmUiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNbIm1hc2tTdHJpbmciXSA9ICI5OTk5OSI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2hhbmRsZVZhbGlkYXRlCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlVmFsaWRhdGU6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBiYXNlU3RhdHVzID0gdGhpcy5iYXNlKCk7CgogICAgICAgICAgICB2YXIgdmFsSW5mbyA9IHRoaXMudmFsaWRhdGlvbjsKCiAgICAgICAgICAgIGlmICghdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsic3RhdHVzIl0pIHsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCA9PT0gIm5pbmUiKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhbEluZm9bImludmFsaWRQYXR0ZXJuIl1bIm1lc3NhZ2UiXSA9IHRoaXMuZ2V0TWVzc2FnZSgiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0ID09PSAiZml2ZSIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFsSW5mb1siaW52YWxpZFBhdHRlcm4iXVsibWVzc2FnZSJdID0gdGhpcy5nZXRNZXNzYWdlKCJpbnZhbGlkWmlwY29kZUZvcm1hdEZpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGJhc2VTdGF0dXM7CiAgICAgICAgfQoKCgogICAgICAgIC8qIGJ1aWxkZXJfaGVscGVycyAqLwogICAgICAgICwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAc2VlIEFscGFjYS5GaWVsZHMuVGV4dEZpZWxkI2dldFNjaGVtYU9mT3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGdldFNjaGVtYU9mT3B0aW9uczogZnVuY3Rpb24oKSB7CgogICAgICAgICAgICByZXR1cm4gQWxwYWNhLm1lcmdlKHRoaXMuYmFzZSgpLCB7CiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiRm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvdyB0byByZXByZXNlbnQgdGhlIHppcGNvZGUgZmllbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJmaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOlsiZml2ZSIsICJuaW5lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkb25seSI6IHRydWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0T3B0aW9uc0Zvck9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBnZXRPcHRpb25zRm9yT3B0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBBbHBhY2EubWVyZ2UodGhpcy5iYXNlKCksIHsKICAgICAgICAgICAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBzZWUgQWxwYWNhLkZpZWxkcy5UZXh0RmllbGQjZ2V0VGl0bGUKICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiWmlwY29kZSBGaWVsZCI7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHNlZSBBbHBhY2EuRmllbGRzLlRleHRGaWVsZCNnZXREZXNjcmlwdGlvbgogICAgICAgICAqLwogICAgICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlcyBhIGZpdmUgb3IgbmluZS1kaWdpdGFsIFVTIHppcGNvZGUgY29udHJvbCB3aXRoIHZhbGlkYXRpb24uIjsKICAgICAgICB9CgogICAgICAgIC8qIGVuZF9idWlsZGVyX2hlbHBlcnMgKi8KICAgIH0pOwoKICAgIEFscGFjYS5yZWdpc3Rlck1lc3NhZ2VzKHsKICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIkludmFsaWQgRml2ZS1EaWdpdCBaaXBjb2RlICgjIyMjIykiLAogICAgICAgICJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiSW52YWxpZCBOaW5lLURpZ2l0IFppcGNvZGUgKCMjIyMjLSMjIyMpIgogICAgfSk7CiAgICBBbHBhY2EucmVnaXN0ZXJGaWVsZENsYXNzKCJ6aXBjb2RlIiwgQWxwYWNhLkZpZWxkcy5aaXBjb2RlRmllbGQpOwogICAgQWxwYWNhLnJlZ2lzdGVyRGVmYXVsdEZvcm1hdEZpZWxkTWFwcGluZygiemlwY29kZSIsICJ6aXBjb2RlIik7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIERlZmluZXMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIHZpZXdzLiAgQWxsIHZpZXdzIGluIEFscGFjYSB1bHRpbWF0ZWx5IGV4dGVuZCB0aGlzIGZvcm0uCiAqIFRoaXMgcHJvdmlkZXMgdGhlIGlkZWFsIHBsYWNlIGZvciBhbnkgZ2xvYmFsIG92ZXJyaWRlcyBvZiB2aWV3IHRlbXBsYXRlcywgbWVzc2FnZSBidW5kbGVzIG9yIG90aGVyIHNldHRpbmdzLgogKi8KKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJ0aXRsZSI6ICJBYnN0cmFjdCBiYXNlIHZpZXciLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImNvdW50cmllcyI6IHsKICAgICAgICAgICAgICAgICJhZmciOiJBZmdoYW5pc3RhbiIsCiAgICAgICAgICAgICAgICAiYWxhIjoiQWxhbmQgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiYWxiIjoiQWxiYW5pYSIsCiAgICAgICAgICAgICAgICAiZHphIjoiQWxnZXJpYSIsCiAgICAgICAgICAgICAgICAiYXNtIjoiQW1lcmljYW4gU2Ftb2EiLAogICAgICAgICAgICAgICAgImFuZCI6IkFuZG9ycmEiLAogICAgICAgICAgICAgICAgImFnbyI6IkFuZ29sYSIsCiAgICAgICAgICAgICAgICAiYWlhIjoiQW5ndWlsbGEiLAogICAgICAgICAgICAgICAgImF0YSI6IkFudGFyY3RpY2EiLAogICAgICAgICAgICAgICAgImF0ZyI6IkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICAgICAgICAgImFyZyI6IkFyZ2VudGluYSIsCiAgICAgICAgICAgICAgICAiYXJtIjoiQXJtZW5pYSIsCiAgICAgICAgICAgICAgICAiYWJ3IjoiQXJ1YmEiLAogICAgICAgICAgICAgICAgImF1cyI6IkF1c3RyYWxpYSIsCiAgICAgICAgICAgICAgICAiYXV0IjoiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAiYXplIjoiQXplcmJhaWphbiIsCiAgICAgICAgICAgICAgICAiYmhzIjoiQmFoYW1hcyIsCiAgICAgICAgICAgICAgICAiYmhyIjoiQmFocmFpbiIsCiAgICAgICAgICAgICAgICAiYmdkIjoiQmFuZ2xhZGVzaCIsCiAgICAgICAgICAgICAgICAiYnJiIjoiQmFyYmFkb3MiLAogICAgICAgICAgICAgICAgImJsciI6IkJlbGFydXMiLAogICAgICAgICAgICAgICAgImJlbCI6IkJlbGdpdW0iLAogICAgICAgICAgICAgICAgImJseiI6IkJlbGl6ZSIsCiAgICAgICAgICAgICAgICAiYmVuIjoiQmVuaW4iLAogICAgICAgICAgICAgICAgImJtdSI6IkJlcm11ZGEiLAogICAgICAgICAgICAgICAgImJ0biI6IkJodXRhbiIsCiAgICAgICAgICAgICAgICAiYm9sIjoiQm9saXZpYSIsCiAgICAgICAgICAgICAgICAiYmloIjoiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgICAgICAgICAiYndhIjoiQm90c3dhbmEiLAogICAgICAgICAgICAgICAgImJ2dCI6IkJvdXZldCBJc2xhbmQiLAogICAgICAgICAgICAgICAgImJyYSI6IkJyYXppbCIsCiAgICAgICAgICAgICAgICAiaW90IjoiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwKICAgICAgICAgICAgICAgICJicm4iOiJCcnVuZWkgRGFydXNzYWxhbSIsCiAgICAgICAgICAgICAgICAiYmdyIjoiQnVsZ2FyaWEiLAogICAgICAgICAgICAgICAgImJmYSI6IkJ1cmtpbmEgRmFzbyIsCiAgICAgICAgICAgICAgICAiYmRpIjoiQnVydW5kaSIsCiAgICAgICAgICAgICAgICAia2htIjoiQ2FtYm9kaWEiLAogICAgICAgICAgICAgICAgImNtciI6IkNhbWVyb29uIiwKICAgICAgICAgICAgICAgICJjYW4iOiJDYW5hZGEiLAogICAgICAgICAgICAgICAgImNwdiI6IkNhcGUgVmVyZGUiLAogICAgICAgICAgICAgICAgImN5bSI6IkNheW1hbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjYWYiOiJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInRjZCI6IkNoYWQiLAogICAgICAgICAgICAgICAgImNobCI6IkNoaWxlIiwKICAgICAgICAgICAgICAgICJjaG4iOiJDaGluYSIsCiAgICAgICAgICAgICAgICAiY3hyIjoiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgICAgICAgICAiY2NrIjoiQ29jb3MgKEtlZWxpbmcpLCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJjb2wiOiJDb2xvbWJpYSIsCiAgICAgICAgICAgICAgICAiY29tIjoiQ29tb3JvcyIsCiAgICAgICAgICAgICAgICAiY29nIjoiQ29uZ28iLAogICAgICAgICAgICAgICAgImNvZCI6IkNvbmdvLCB0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUiLAogICAgICAgICAgICAgICAgImNvayI6IkNvb2sgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAiY3JpIjoiQ29zdGEgUmljYSIsCiAgICAgICAgICAgICAgICAiaHJ2IjoiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAiY3ViIjoiQ3ViYSIsCiAgICAgICAgICAgICAgICAiY3lwIjoiQ3lwcnVzIiwKICAgICAgICAgICAgICAgICJjemUiOiJDemVjaCBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAiY2l2IjoiQ290ZSBkJ0l2b2lyZSIsCiAgICAgICAgICAgICAgICAiZG5rIjoiRGVubWFyayIsCiAgICAgICAgICAgICAgICAiZGppIjoiRGppYm91dGkiLAogICAgICAgICAgICAgICAgImRtYSI6IkRvbWluaWNhIiwKICAgICAgICAgICAgICAgICJkb20iOiJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgImVjdSI6IkVjdWFkb3IiLAogICAgICAgICAgICAgICAgImVneSI6IkVneXB0IiwKICAgICAgICAgICAgICAgICJzbHYiOiJFbCBTYWx2YWRvciIsCiAgICAgICAgICAgICAgICAiZ25xIjoiRXF1YXRvcmlhbCBHdWluZWEiLAogICAgICAgICAgICAgICAgImVyaSI6IkVyaXRyZWEiLAogICAgICAgICAgICAgICAgImVzdCI6IkVzdG9uaWEiLAogICAgICAgICAgICAgICAgImV0aCI6IkV0aGlvcGlhIiwKICAgICAgICAgICAgICAgICJmbGsiOiJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyksIiwKICAgICAgICAgICAgICAgICJmcm8iOiJGYXJvZSBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJmamkiOiJGaWppIiwKICAgICAgICAgICAgICAgICJmaW4iOiJGaW5sYW5kIiwKICAgICAgICAgICAgICAgICJmcmEiOiJGcmFuY2UiLAogICAgICAgICAgICAgICAgImd1ZiI6IkZyZW5jaCBHdWlhbmEiLAogICAgICAgICAgICAgICAgInB5ZiI6IkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICAgICAgICAgImF0ZiI6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsCiAgICAgICAgICAgICAgICAiZ2FiIjoiR2Fib24iLAogICAgICAgICAgICAgICAgImdtYiI6IkdhbWJpYSIsCiAgICAgICAgICAgICAgICAiZ2VvIjoiR2VvcmdpYSIsCiAgICAgICAgICAgICAgICAiZGV1IjoiR2VybWFueSIsCiAgICAgICAgICAgICAgICAiZ2hhIjoiR2hhbmEiLAogICAgICAgICAgICAgICAgImdpYiI6IkdpYnJhbHRhciIsCiAgICAgICAgICAgICAgICAiZ3JjIjoiR3JlZWNlIiwKICAgICAgICAgICAgICAgICJncmwiOiJHcmVlbmxhbmQiLAogICAgICAgICAgICAgICAgImdyZCI6IkdyZW5hZGEiLAogICAgICAgICAgICAgICAgImdscCI6Ikd1YWRlbG91cGUiLAogICAgICAgICAgICAgICAgImd1bSI6Ikd1YW0iLAogICAgICAgICAgICAgICAgImd0bSI6Ikd1YXRlbWFsYSIsCiAgICAgICAgICAgICAgICAiZ2d5IjoiR3Vlcm5zZXkiLAogICAgICAgICAgICAgICAgImdpbiI6Ikd1aW5lYSIsCiAgICAgICAgICAgICAgICAiZ25iIjoiR3VpbmVhLUJpc3NhdSIsCiAgICAgICAgICAgICAgICAiZ3V5IjoiR3V5YW5hIiwKICAgICAgICAgICAgICAgICJodGkiOiJIYWl0aSIsCiAgICAgICAgICAgICAgICAiaG1kIjoiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJ2YXQiOiJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKSwiLAogICAgICAgICAgICAgICAgImhuZCI6IkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICJoa2ciOiJIb25nIEtvbmciLAogICAgICAgICAgICAgICAgImh1biI6Ikh1bmdhcnkiLAogICAgICAgICAgICAgICAgImlzbCI6IkljZWxhbmQiLAogICAgICAgICAgICAgICAgImluZCI6IkluZGlhIiwKICAgICAgICAgICAgICAgICJpZG4iOiJJbmRvbmVzaWEiLAogICAgICAgICAgICAgICAgImlybiI6IklyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImlycSI6IklyYXEiLAogICAgICAgICAgICAgICAgImlybCI6IklyZWxhbmQiLAogICAgICAgICAgICAgICAgImltbiI6IklzbGUgb2YgTWFuIiwKICAgICAgICAgICAgICAgICJpc3IiOiJJc3JhZWwiLAogICAgICAgICAgICAgICAgIml0YSI6Ikl0YWx5IiwKICAgICAgICAgICAgICAgICJqYW0iOiJKYW1haWNhIiwKICAgICAgICAgICAgICAgICJqcG4iOiJKYXBhbiIsCiAgICAgICAgICAgICAgICAiamV5IjoiSmVyc2V5IiwKICAgICAgICAgICAgICAgICJqb3IiOiJKb3JkYW4iLAogICAgICAgICAgICAgICAgImtheiI6IkthemFraHN0YW4iLAogICAgICAgICAgICAgICAgImtlbiI6IktlbnlhIiwKICAgICAgICAgICAgICAgICJraXIiOiJLaXJpYmF0aSIsCiAgICAgICAgICAgICAgICAicHJrIjoiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgImtvciI6IktvcmVhLCBSZXB1YmxpYyBvZiIsCiAgICAgICAgICAgICAgICAia3d0IjoiS3V3YWl0IiwKICAgICAgICAgICAgICAgICJrZ3oiOiJLeXJneXpzdGFuIiwKICAgICAgICAgICAgICAgICJsYW8iOiJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAibHZhIjoiTGF0dmlhIiwKICAgICAgICAgICAgICAgICJsYm4iOiJMZWJhbm9uIiwKICAgICAgICAgICAgICAgICJsc28iOiJMZXNvdGhvIiwKICAgICAgICAgICAgICAgICJsYnIiOiJMaWJlcmlhIiwKICAgICAgICAgICAgICAgICJsYnkiOiJMaWJ5YW4gQXJhYiBKYW1haGlyaXlhIiwKICAgICAgICAgICAgICAgICJsaWUiOiJMaWVjaHRlbnN0ZWluIiwKICAgICAgICAgICAgICAgICJsdHUiOiJMaXRodWFuaWEiLAogICAgICAgICAgICAgICAgImx1eCI6Ikx1eGVtYm91cmciLAogICAgICAgICAgICAgICAgIm1hYyI6Ik1hY2FvIiwKICAgICAgICAgICAgICAgICJta2QiOiJNYWNlZG9uaWEsIHRoZSBmb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgIm1kZyI6Ik1hZGFnYXNjYXIiLAogICAgICAgICAgICAgICAgIm13aSI6Ik1hbGF3aSIsCiAgICAgICAgICAgICAgICAibXlzIjoiTWFsYXlzaWEiLAogICAgICAgICAgICAgICAgIm1kdiI6Ik1hbGRpdmVzIiwKICAgICAgICAgICAgICAgICJtbGkiOiJNYWxpIiwKICAgICAgICAgICAgICAgICJtbHQiOiJNYWx0YSIsCiAgICAgICAgICAgICAgICAibWhsIjoiTWFyc2hhbGwgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAibXRxIjoiTWFydGluaXF1ZSIsCiAgICAgICAgICAgICAgICAibXJ0IjoiTWF1cml0YW5pYSIsCiAgICAgICAgICAgICAgICAibXVzIjoiTWF1cml0aXVzIiwKICAgICAgICAgICAgICAgICJteXQiOiJNYXlvdHRlIiwKICAgICAgICAgICAgICAgICJtZXgiOiJNZXhpY28iLAogICAgICAgICAgICAgICAgImZzbSI6Ik1pY3JvbmVzaWEsIEZlZGVyYXRlZCBTdGF0ZXMgb2YiLAogICAgICAgICAgICAgICAgIm1kYSI6Ik1vbGRvdmEsIFJlcHVibGljIG9mIiwKICAgICAgICAgICAgICAgICJtY28iOiJNb25hY28iLAogICAgICAgICAgICAgICAgIm1uZyI6Ik1vbmdvbGlhIiwKICAgICAgICAgICAgICAgICJtbmUiOiJNb250ZW5lZ3JvIiwKICAgICAgICAgICAgICAgICJtc3IiOiJNb250c2VycmF0IiwKICAgICAgICAgICAgICAgICJtYXIiOiJNb3JvY2NvIiwKICAgICAgICAgICAgICAgICJtb3oiOiJNb3phbWJpcXVlIiwKICAgICAgICAgICAgICAgICJtbXIiOiJNeWFubWFyIiwKICAgICAgICAgICAgICAgICJuYW0iOiJOYW1pYmlhIiwKICAgICAgICAgICAgICAgICJucnUiOiJOYXVydSIsCiAgICAgICAgICAgICAgICAibnBsIjoiTmVwYWwiLAogICAgICAgICAgICAgICAgIm5sZCI6Ik5ldGhlcmxhbmRzIiwKICAgICAgICAgICAgICAgICJhbnQiOiJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsCiAgICAgICAgICAgICAgICAibmNsIjoiTmV3IENhbGVkb25pYSIsCiAgICAgICAgICAgICAgICAibnpsIjoiTmV3IFplYWxhbmQiLAogICAgICAgICAgICAgICAgIm5pYyI6Ik5pY2FyYWd1YSIsCiAgICAgICAgICAgICAgICAibmVyIjoiTmlnZXIiLAogICAgICAgICAgICAgICAgIm5nYSI6Ik5pZ2VyaWEiLAogICAgICAgICAgICAgICAgIm5pdSI6Ik5pdWUiLAogICAgICAgICAgICAgICAgIm5mayI6Ik5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAgICAgICAgICJtbnAiOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLAogICAgICAgICAgICAgICAgIm5vciI6Ik5vcndheSIsCiAgICAgICAgICAgICAgICAib21uIjoiT21hbiIsCiAgICAgICAgICAgICAgICAicGFrIjoiUGFraXN0YW4iLAogICAgICAgICAgICAgICAgInBsdyI6IlBhbGF1IiwKICAgICAgICAgICAgICAgICJwc2UiOiJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkIiwKICAgICAgICAgICAgICAgICJwYW4iOiJQYW5hbWEiLAogICAgICAgICAgICAgICAgInBuZyI6IlBhcHVhIE5ldyBHdWluZWEiLAogICAgICAgICAgICAgICAgInByeSI6IlBhcmFndWF5IiwKICAgICAgICAgICAgICAgICJwZXIiOiJQZXJ1IiwKICAgICAgICAgICAgICAgICJwaGwiOiJQaGlsaXBwaW5lcyIsCiAgICAgICAgICAgICAgICAicGNuIjoiUGl0Y2Fpcm4iLAogICAgICAgICAgICAgICAgInBvbCI6IlBvbGFuZCIsCiAgICAgICAgICAgICAgICAicHJ0IjoiUG9ydHVnYWwiLAogICAgICAgICAgICAgICAgInByaSI6IlB1ZXJ0byBSaWNvIiwKICAgICAgICAgICAgICAgICJxYXQiOiJRYXRhciIsCiAgICAgICAgICAgICAgICAicm91IjoiUm9tYW5pYSIsCiAgICAgICAgICAgICAgICAicnVzIjoiUnVzc2lhbiBGZWRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICJyd2EiOiJSd2FuZGEiLAogICAgICAgICAgICAgICAgInJldSI6IlJldW5pb24iLAogICAgICAgICAgICAgICAgImJsbSI6IlNhaW50IEJhcnRoZWxlbXkiLAogICAgICAgICAgICAgICAgInNobiI6IlNhaW50IEhlbGVuYSIsCiAgICAgICAgICAgICAgICAia25hIjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAgICAgICAgICJsY2EiOiJTYWludCBMdWNpYSIsCiAgICAgICAgICAgICAgICAibWFmIjoiU2FpbnQgTWFydGluIChGcmVuY2ggcGFydCkiLAogICAgICAgICAgICAgICAgInNwbSI6IlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICAgICAgICAgInZjdCI6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwKICAgICAgICAgICAgICAgICJ3c20iOiJTYW1vYSIsCiAgICAgICAgICAgICAgICAic21yIjoiU2FuIE1hcmlubyIsCiAgICAgICAgICAgICAgICAic3RwIjoiU2FvIFRvbWUgYW5kIFByaW5jaXBlIiwKICAgICAgICAgICAgICAgICJzYXUiOiJTYXVkaSBBcmFiaWEiLAogICAgICAgICAgICAgICAgInNlbiI6IlNlbmVnYWwiLAogICAgICAgICAgICAgICAgInNyYiI6IlNlcmJpYSIsCiAgICAgICAgICAgICAgICAic3ljIjoiU2V5Y2hlbGxlcyIsCiAgICAgICAgICAgICAgICAic2xlIjoiU2llcnJhIExlb25lIiwKICAgICAgICAgICAgICAgICJzZ3AiOiJTaW5nYXBvcmUiLAogICAgICAgICAgICAgICAgInN2ayI6IlNsb3Zha2lhIiwKICAgICAgICAgICAgICAgICJzdm4iOiJTbG92ZW5pYSIsCiAgICAgICAgICAgICAgICAic2xiIjoiU29sb21vbiBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJzb20iOiJTb21hbGlhIiwKICAgICAgICAgICAgICAgICJ6YWYiOiJTb3V0aCBBZnJpY2EiLAogICAgICAgICAgICAgICAgInNncyI6IlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwKICAgICAgICAgICAgICAgICJlc3AiOiJTcGFpbiIsCiAgICAgICAgICAgICAgICAibGthIjoiU3JpIExhbmthIiwKICAgICAgICAgICAgICAgICJzZG4iOiJTdWRhbiIsCiAgICAgICAgICAgICAgICAic3VyIjoiU3VyaW5hbWUiLAogICAgICAgICAgICAgICAgInNqbSI6IlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICAgICAgICAgInN3eiI6IlN3YXppbGFuZCIsCiAgICAgICAgICAgICAgICAic3dlIjoiU3dlZGVuIiwKICAgICAgICAgICAgICAgICJjaGUiOiJTd2l0emVybGFuZCIsCiAgICAgICAgICAgICAgICAic3lyIjoiU3lyaWFuIEFyYWIgUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgInR3biI6IlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiLAogICAgICAgICAgICAgICAgInRqayI6IlRhamlraXN0YW4iLAogICAgICAgICAgICAgICAgInR6YSI6IlRhbnphbmlhLCBVbml0ZWQgUmVwdWJsaWMgb2YiLAogICAgICAgICAgICAgICAgInRoYSI6IlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICJ0bHMiOiJUaW1vci1MZXN0ZSIsCiAgICAgICAgICAgICAgICAidGdvIjoiVG9nbyIsCiAgICAgICAgICAgICAgICAidGtsIjoiVG9rZWxhdSIsCiAgICAgICAgICAgICAgICAidG9uIjoiVG9uZ2EiLAogICAgICAgICAgICAgICAgInR0byI6IlRyaW5pZGFkIGFuZCBUb2JhZ28iLAogICAgICAgICAgICAgICAgInR1biI6IlR1bmlzaWEiLAogICAgICAgICAgICAgICAgInR1ciI6IlR1cmtleSIsCiAgICAgICAgICAgICAgICAidGttIjoiVHVya21lbmlzdGFuIiwKICAgICAgICAgICAgICAgICJ0Y2EiOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLAogICAgICAgICAgICAgICAgInR1diI6IlR1dmFsdSIsCiAgICAgICAgICAgICAgICAidWdhIjoiVWdhbmRhIiwKICAgICAgICAgICAgICAgICJ1a3IiOiJVa3JhaW5lIiwKICAgICAgICAgICAgICAgICJhcmUiOiJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsCiAgICAgICAgICAgICAgICAiZ2JyIjoiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgInVzYSI6IlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgICAgInVtaSI6IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsCiAgICAgICAgICAgICAgICAidXJ5IjoiVXJ1Z3VheSIsCiAgICAgICAgICAgICAgICAidXpiIjoiVXpiZWtpc3RhbiIsCiAgICAgICAgICAgICAgICAidnV0IjoiVmFudWF0dSIsCiAgICAgICAgICAgICAgICAidmVuIjoiVmVuZXp1ZWxhIiwKICAgICAgICAgICAgICAgICJ2bm0iOiJWaWV0IE5hbSIsCiAgICAgICAgICAgICAgICAidmdiIjoiVmlyZ2luIElzbGFuZHMsIEJyaXRpc2giLAogICAgICAgICAgICAgICAgInZpciI6IlZpcmdpbiBJc2xhbmRzLCBVLlMuIiwKICAgICAgICAgICAgICAgICJ3bGYiOiJXYWxsaXMgYW5kIEZ1dHVuYSIsCiAgICAgICAgICAgICAgICAiZXNoIjoiV2VzdGVybiBTYWhhcmEiLAogICAgICAgICAgICAgICAgInllbSI6IlllbWVuIiwKICAgICAgICAgICAgICAgICJ6bWIiOiJaYW1iaWEiLAogICAgICAgICAgICAgICAgInp3ZSI6IlppbWJhYndlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZW1wdHkiOiAiIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAidmFsaWQiOiAiIiwKICAgICAgICAgICAgImludmFsaWQiOiAiVGhpcyBmaWVsZCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgIm1vbnRocyI6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAidGltZVVuaXRzIjogeyBTRUNPTkQ6ICJzZWNvbmRzIiwgTUlOVVRFOiAibWludXRlcyIsIEhPVVI6ICJob3VycyIsIERBWTogImRheXMiLCBNT05USDogIm1vbnRocyIsIFlFQVI6ICJ5ZWFycyIgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKCgkvLyBjemVjaCAtIGN6ZWNoIHJlcHVibGljCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiY3NfQ1oiOiB7CgkJCQlyZXF1aXJlZDogIlRvdG8gcG9sZSBqZSB2ecW+YWRvdsOhbm8iLAoJCQkJaW52YWxpZDogIlRvdG8gcG9sZSBqZSBuZXBsYXRuw6kiLAoJCQkJbW9udGhzOiBbIkxlZGVuIiwgIsOabm9yIiwgIkLFmWV6ZW4iLCAiRHViZW4iLCAiS3bEm3RlbiIsICLEjGVydmVuIiwgIsSMZXJ2ZW5lYyIsICJTcnBlbiIsICJaw6HFmcOtIiwgIsWYw61qZW4iLCAiTGlzdG9wYWQiLCAiUHJvc2luZWMiXSwKCQkJCXRpbWVVbml0czogewoJCQkJCVNFQ09ORDogInNla3VuZHkiLAoJCQkJCU1JTlVURTogIm1pbnV0eSIsCgkJCQkJSE9VUjogImhvZGlueSIsCgkJCQkJREFZOiAiZG55IiwKCQkJCQlNT05USDogIm3Em3PDrWNlIiwKCQkJCQlZRUFSOiAicm9reSIKCQkJCX0sCgkJCQkvLyBDb250cm9sRmllbGQuanMKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG90byBwb2xlIG11c8OtIG9ic2Fob3ZhdCBqZWRudSBob2Rub3R1IHogezB9LiBBa3R1w6FsbsOtIGhvZG5vdGEgamU6IHsxfSIsCgoJCQkJLy8gRmllbGQuanMKCQkJCSJub3RPcHRpb25hbCI6ICJUb3RvIHBvbGUgbmVuw60gdm9saXRlbG7DqSIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0ganNvdSB6YWvDoXphbsOpIGhvZG5vdHkuIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvQXJyYXlGaWVsZC5qcwoJCQkJIm5vdEVub3VnaEl0ZW1zIjogIk1pbmltw6FsbsOtIHBvxI1ldCBwb2xvxb5layBqZSB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJNYXhpbcOhbG7DrSBwb8SNZXQgcG9sb8W+ZWsgamUgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJIb2Rub3R5IG5lanNvdSB1bmlrw6F0bsOtIiwKCQkJCSJub3RBbkFycmF5IjogIlRhdG8gaG9kbm90YSBuZW7DrSBwb2xlIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCBub3ZvdSBwb2xvxb5rdSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiUMWZaWRhdCIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiT2RlYnJhdCIsCgkJCQkidXBCdXR0b25MYWJlbCI6ICJOYWhvcnUiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJEb2zFryIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL0xpc3RGaWVsZC5qcwoJCQkJIm5vbmVMYWJlbCI6ICLFvcOhZG7DvSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL051bWJlckZpZWxkLmpzCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJNaW5pbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJNYXhpbcOhbG7DrSBob2Rub3RhIHRvaG90byBwb2xlIGplIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJIb2Rub3RhIHRvaG90byBwb2xlIG11c8OtIGLDvXQgdsSbdMWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSG9kbm90YSB0b2hvdG8gcG9sZSBtdXPDrSBiw710IG1lbsWhw60gbmXFviB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkhvZG5vdGEgbXVzw60gYsO9dCBkxJtsaXRlbG7DoSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiSG9kbm90YSBuZW7DrSDEjcOtc2xvLiIsCgkJCQkic3RyaW5nVmFsdWVOb3RNdWx0aXBsZU9mIjogIsSMw61zbG8gbmVuw60gbsOhc29ia2VtIHswfSIsCgoJCQkJLy8gZmllbGRzL2Jhc2ljL09iamVjdEZpZWxkLmpzCgkJCQkidG9vTWFueVByb3BlcnRpZXMiOiAiTWF4aW3DoWxuw60gcG/EjWV0IHZsYXN0bm9zdMOtICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoJCQkJInRvb0Zld1Byb3BlcnRpZXMiOiAiTmVuw60gZG9zdGF0ZWsgdmxhc3Rub3N0w60gKGplIHBvxb5hZG92w6FubyB7MH0pIiwKCgkJCQkvLyBmaWVsZHMvYmFzaWMvVGV4dEFyZWFGaWVsZC5qcwoJCQkJIndvcmRMaW1pdEV4Y2VlZGVkIjogIk1heGltw6FsbsOtIHBvxI1ldCBzbG92ICh7MH0pIGJ5bCBwxZlla3JvxI1lbi4iLAoKCQkJCS8vIGZpZWxkcy9iYXNpYy9UZXh0RmllbGQuanMKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJUb3RvIHBvbGUgbcOhIG3DrXQgdnpvciB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIlRvdG8gcG9sZSBtdXPDrSBvYnNhaG92YXQgbmVqbWVuxJsgezB9IHpuYWvFryIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJUb3RvIHBvbGUgbXVzw60gb2JzYWhvdmF0IG1heGltw6FsbsSbIHswfSB6bmFrxa8iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9EYXRlRmllbGQuanMKCQkJCSJpbnZhbGlkRGF0ZSI6ICJOZXNwcsOhdm7DqSBkYXR1bSBwcm8gZm9ybcOhdCB7MH0iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmVkL0VkaXRvckZpZWxkLmpzCgkJCQkiZWRpdG9yQW5ub3RhdGlvbnNFeGlzdCI6ICJFZGl0b3IgbcOhIHYgc29ixJsgY2h5YnksIGt0ZXLDqSBtdXPDrSBiw710IG9wcmF2ZW55IiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvRW1haWxGaWVsZC5qcwoJCQkJImludmFsaWRFbWFpbCI6ICJDaHlibsOhIGUtbWFpbG92w6EgYWRyZXNhLCBwxZkuOiBpbmZvQGNsb3VkY21zLmNvbSIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkLkludGVnZXJGaWVsZC5qcwoJCQkJInN0cmluZ05vdEFuSW50ZWdlciI6ICJUYXRvIGhvZG5vdGEgbmVuw60gxI3DrXNsby4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9JUHY0RmllbGQuanMKCQkJCSJpbnZhbGlkSVB2NCI6ICJDaHlibsOhIElQdjQgYWRyZXNhLCBleDogMTkyLjE2OC4wLjEiLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9KU09ORmllbGQuanMKCQkJCSJzdHJpbmdOb3RBSlNPTiI6ICJUYXRvIGhvZG5vdGEgbmVuw60gcGxhdG7DvSBKU09OIHRleHQuIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvTWFwRmllbGQuanMKCQkJCSJrZXlNaXNzaW5nIjogIk1hcGEgb2JzYWh1amUgcHLDoXpkbsO9IGtsw63EjS4iLAoJCQkJImtleU5vdFVuaXF1ZSI6ICJLbMOtxI1lIG5lanNvdSBqZWRpbmXEjW7DqS4iLAoKCQkJCS8vIGZpZWxkcy9hZHZhbmNlZC9QYXNzd29yZEZpZWxkLmpzCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIsWgcGF0bsOpIGhlc2xvIiwKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvUGFzc3dvcmRGaWVsZC5qcwoJCQkJImludmFsaWRQaG9uZSI6ICLFoHBhdG7DqSB0ZWxlZm9ubsOtIMSNw61zbG8sIHDFmS46ICgxMjMpIDQ1Ni05OTk5IiwgLy8gVE9ETzogaW52YWxpZCBwYXR0ZXJuIGZvciBjemVjaCBsb2NhbGUKCgkJCQkvLyBmaWVsZHMvYWR2YW5jZWQvVXBsb2FkRmllbGQuanMKCQkJCSJjaG9vc2VGaWxlIjogIlZ5YmVydGUgc291Ym9yLi4uIiwKCQkJCSJjaG9vc2VGaWxlcyI6ICJWeWJlcnRlIHNvdWJvcnkuLi4iLAoJCQkJImRyb3Bab25lU2luZ2xlIjogIlZ5YmVydGUgc291Ym9yIG5lYm8gamVqIHDFmWV0w6FobsSbdGUgc2VtIHBybyBuYWhyw6Fuw60uLi4iLAoJCQkJImRyb3Bab25lTXVsdGlwbGUiOiAiVnliZXJ0ZSBzb3Vib3J5IG5lYm8gamUgcMWZZXTDoWhuxJt0ZSBzZW0gcHJvIG5haHLDoW7DrS4uLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL1VSTEZpZWxkLmpzCgkJCQkiaW52YWxpZFVSTEZvcm1hdCI6ICJVdmVkZW7DoSBVUkwgbmVuw60gcGxhdG5hIHdlYm92w6EgYWRyZXNhLiIsCgoJCQkJLy8gZmllbGRzL2FkdmFuY2VkL0NpcGNvZGVGaWVsZC5qcwoJCQkJImludmFsaWRaaXBjb2RlRm9ybWF0Rml2ZSI6ICJDaHlibsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMpIiwKCQkJCSJpbnZhbGlkWmlwY29kZUZvcm1hdE5pbmUiOiAiQ2h5Ym7DqSBkZXbDrXRpLW3DrXN0bsOpIHBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsbyAoIyMjIyMtIyMjIykiCgkJCX0KICAgICAgICB9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdlcm1hbiAtIGF1c3RyaWEKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJkZV9BVCI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRWluZ2FiZSBlcmZvcmRlcmxpY2giLAogICAgICAgICAgICAgICAgaW52YWxpZDogIkVpbmdhYmUgaW52YWxpZCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSsOkbm5lciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiVW5nw7xsdGlnZSBlLU1haWwgQWRyZXNzZSwgei5CLjogaW5mb0BjbG91ZGNtcy5jb20iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFaW5nYWJlIGlzdCBrZWluZSBHYW56IFphaGwuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSwgei5CLjogMTkyLjE2OC4wLjEiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGllIE1pbmRlc3RhbnphaGwgdm9uIFplaWNoZW4gaXN0IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gWmVpY2hlbiBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBBbnphaGwgZGVyIFplaWNoZW4gbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIEFuemFobCBkZXIgWmVpY2hlbiBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiVW5nw7xsdGlnZSBUZWxlZm9ubnVtbWVyLCB6LkIuOiAoMTIzKSA0NTYtOTk5OSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRGllc2UgRmVsZCBzdGltbXQgbmljaHQgbWl0IGZvbGdlbmRlciBWb3JnYWJlIMO8YmVyZWluIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGllc2VzIEZlbGQgc29sbHRlIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZW50aGFsdGVuIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBow7ZjaHN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZ2VybWFuIC0gZ2VybWFueQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImRlX0RFIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFaW5nYWJlIGVyZm9yZGVybGljaCIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRWluZ2FiZSB1bmfDvGx0aWciLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbnVhciIsICJGZWJydWFyIiwgIk3DpHJ6IiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlemVtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlbiIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXRlbiIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIlN0dW5kZW4iLAogICAgICAgICAgICAgICAgICAgIERBWTogIlRhZ2UiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTW9uYXRlIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiSmFocmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRpZXNlcyBGZWxkIGlzdCBuaWNodCBvcHRpb25hbCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEaWVzZSBXZXJ0ZSBzaW5kIG5pY2h0IGVybGF1YnQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpZXNlIEZlbGQgc29sbHRlIGVpbmVuIGRlciBmb2xnZW5kZW4gV2VydGUgZW50aGFsdGVuOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJEaWUgTWluZGVzdGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJEaWUgTWF4aW1hbGFuemFobCB2b24gRWxlbWVudGVuIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIkRpZXNlIFdlcnRlIHNpbmQgbmljaHQgZWluZGV1dGlnIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIktlaW5lIExpc3RlIHZvbiBXZXJ0ZW4iLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkZhbHNjaGVzIERhdHVtc2Zvcm1hdDogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiS2VpbmUgZ8O8bHRpZ2UgRS1NYWlsIEFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJLZWluZSBHYW56ZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJVbmfDvGx0aWdlIElQdjQgQWRyZXNzZSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJEaWUga2xlaW5zdG3DtmdsaWNoZSBaYWhsIGlzdCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBpc3QgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkRpZSBrbGVpbnN0bcO2Z2xpY2hlIFphaGwgbXVzcyBncsO2w59lciBzZWluIGFscyB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiRGllIGdyw7Zzc3Rtw7ZnbGljaGUgWmFobCBtdXNzIGtsZWluZXIgc2VpbiBhbHMgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJEZXIgV2VydCBtdXNzIGR1cmNoIHswfSBkaXZpZGllcmJhciBzZWluIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIkRpZSBFaW5nYWJlIGlzdCBrZWluZSBaYWhsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiVW5nw7xsdGlnZXMgUGFzc3dvcnQiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJVbmfDvGx0aWdlIFRlbGVmb25udW1tZXIiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkRpZXNlIEZlbGQgc3RpbW10IG5pY2h0IG1pdCBmb2xnZW5kZXIgVm9yZ2FiZSDDvGJlcmVpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpZXNlcyBGZWxkIHNvbGx0ZSBtaW5kZXN0ZW5zIHswfSBaZWljaGVuIGVudGhhbHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaWVzZXMgRmVsZCBzb2xsdGUgaMO2Y2hzdGVucyB7MH0gWmVpY2hlbiBlbnRoYWx0ZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIGdyZWVrIC0gZ3JlZWNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiZWxfR1IiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIs6lz4DOv8+Hz4HOtc+Jz4TOuc66z4wiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIs6bzqzOuM6/z4IiLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIs6ZzrHOvc6/z4XOrM+BzrnOv8+CIiwgIs6mzrXOss+Bzr/Phc6sz4HOuc6/z4IiLCAizpzOrM+Bz4TOuc6/z4IiLCAizpHPgM+Bzq/Ou865zr/PgiIsICLOnM6szrnOv8+CIiwgIs6Zzr/Pjc69zrnOv8+CIiwgIs6Zzr/Pjc67zrnOv8+CIiwgIs6Rz43Os86/z4XPg8+Ezr/PgiIsICLOo861z4DPhM6tzrzOss+BzrnOv8+CIiwgIs6fzrrPhM+OzrLPgc65zr/PgiIsICLOnc6/zq3OvM6yz4HOuc6/z4IiLCAizpTOtc66zq3OvM6yz4HOuc6/z4IiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogIs6UzrXPhc+EzrXPgc+MzrvOtc+Az4TOsSIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAizpvOtc+Az4TOrCIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogIs6Pz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICLOnM6tz4HOtc+CIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIs6czq7Ovc61z4IiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLOp8+Bz4zOvc65zrEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzrXOr869zrHOuSDPgM+Bzr/Osc65z4HOtc+EzrnOus+MIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogIs6czrcgzrXPgM65z4TPgc61z4DPhM6uIM+EzrnOvM6uOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRWYWx1ZU9mRW51bSI6ICLOpM6/IM+AzrXOtM6vzr8gz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSDOvM6vzrEgzrHPgM+MIM+EzrnPgiDOsc66z4zOu86/z4XOuM61z4Igz4TOuc68zq3PgjogezB9LiBbezF9XSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAizp8gzrXOu86sz4fOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLOnyDOvM6tzrPOuc+Dz4TOv8+CIM6xz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs+Ozr0gzrXOr869zrHOuSB7MH0iLAogICAgICAgICAgICAgICAgInZhbHVlTm90VW5pcXVlIjogIs6fzrkgz4TOuc68zq3PgiDOtM61zr0gzrXOr869zrHOuSDOvM6/zr3Osc60zrnOus6tz4IiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAizpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrXOs86zz4HOsc+Gzq3PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAizpvOrM64zr/PgiDOvM6/z4HPhs6uIM63zrzOtc+Bzr/OvM63zr3Or86xz4I6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIs6czrcgzq3Os866z4XPgc6/IGVtYWlsIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAizpTOtc69IM61zq/Ovc6xzrkgzrHOus6tz4HOsc65zr/PgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAizpzOtyDOrc6zzrrPhc+BzrcgSVB2NCDOtM65zrXPjc64z4XOvc+DzrciLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAizqTOvyDOtc67zqzPh865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLOpM6/IM68zq3Os865z4PPhM6/IM+AzrvOrs64zr/PgiDPh86xz4HOsc66z4TOrs+Bz4nOvSDOtc6vzr3Osc65IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs61z4IgzrHPgM+MIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLOkc+AzrHOuc+Ezr/Pjc69z4TOsc65IM67zrnOs8+Mz4TOtc+Bzr/OuSDPh86xz4HOsc66z4TOrs+BzrXPgiDOsc+Az4wgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICLOlyDPhM65zrzOriDOtM61zr0gzrXOr869zrHOuSDOsc+BzrnOuM68z4zPgiIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIs6czrcgzq3Os866z4XPgc6/IHBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAizpzOtyDOrc6zzrrPhc+Bzr/PgiDOsc+BzrnOuM68z4zPgiDPhM63zrvOtc+Gz47Ovc6/z4UiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIs6Rz4XPhM+MIM+Ezr8gz4DOtc60zq/OvyDOtM61zr0gzq3Ph861zrkgz4TOt869IM6xz4DOsc65z4TOv8+NzrzOtc69zrcgzrzOv8+Bz4bOriB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIs6kzr8gz4DOtc60zq/OvyDPgM+Bzq3PgM61zrkgzr3OsSDOrc+HzrXOuSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPh86xz4HOsc66z4TOrs+BzrXPgiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICLOpM6/IM+AzrXOtM6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzq3Ph861zrkgz4TOvyDPgM6/zrvPjSB7MH0gz4fOsc+BzrHOus+Ezq7Pgc61z4IiCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKCS8vIHNwYW5pc2ggLSBzcGFpbgoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJImVzX0VTIjogewoJCQkJcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvIiwKCQkJCWludmFsaWQ6ICJFc3RlIGNhbXBvIGVzIGludsOhbGlkbyIsCgkJCQltb250aHM6IFsiRW5lcm8iLCAiRmVicmVybyIsICJNYXJ6byIsICJBYnJpbCIsICJNYXlvIiwgIkp1bmlvIiwgIkp1bGlvIiwgIkFnb3N0byIsICJTZXB0aWVtYnJlIiwgIk9jdHVicmUiLCAiTm92aWVtYnJlIiwgIkRpY2llbWJyZSJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2VndW5kb3MiLAoJCQkJCU1JTlVURTogIm1pbnV0b3MiLAoJCQkJCUhPVVI6ICJob3JhcyIsCgkJCQkJREFZOiAiZMOtYXMiLAoJCQkJCU1PTlRIOiAibWVzZXMiLAoJCQkJCVlFQVI6ICJhw7FvcyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBubyBlcyBvcGNpb25hbC4iLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbiBsb3MgdmFsb3JlcyByZWNoYXphZG9zLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkVzdGUgY2FtcG8gZGViZSB0ZW5lciB1bm8gZGUgbG9zIHZhbG9yZXMgYWRlbnRybyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJFbCBuw7ptZXJvIG3DrW5pbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJFbCBuw7ptZXJvIG3DoXhpbW8gZGUgYXJ0w61jdWxvcyBlcyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkxvcyB2YWxvcmVzIG5vIHNvbiDDum5pY29zIiwKCQkJCSJub3RBbkFycmF5IjogIkVzdGUgdmFsb3Igbm8gZXMgdW4gYXJzZW5hbCIsCgkJCQkiaW52YWxpZERhdGUiOiAiRmVjaGEgaW52w6FsaWRhIHBhcmEgZWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJFbWFpbCBhZGRyZXNzIGludsOhbGlkbywgZXg6IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvIGVudGVyby4iLAoJCQkJImludmFsaWRJUHY0IjogIkRpcmVjY2nDs24gaW52w6FsaWRhIElQdjQsIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJFbCB2YWxvciBtw61uaW1vIHBhcmEgZXN0ZSBjYW1wbyBlcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiRWwgdmFsb3IgbcOheGltbyBwYXJhIGVzdGUgY2FtcG8gZXMgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIkVsIHZhbG9yIGRlIGVzdGUgY2FtcG8gZGViZSBzZXIgbWF5b3IgcXVlIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJFbCB2YWxvciBkZSBlc3RlIGNhbXBvIGRlYmUgc2VyIG1lbm9zIHF1ZSB7MH0iLAoJCQkJInN0cmluZ0RpdmlzaWJsZUJ5IjogIkVsIHZhbG9yIGRlYmUgc2VyIGRpdmlzaWJsZSBjZXJjYSB7MH0iLAoJCQkJInN0cmluZ05vdEFOdW1iZXIiOiAiRXN0ZSB2YWxvciBubyBlcyB1biBuw7ptZXJvLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIkNvbnRyYXNlw7FhIGludsOhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsw6lmb25vIGludsOhbGlkbywgZXg6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJFc3RlIGNhbXBvIGRlYmUgdGVuZXIgcGF0csOzbiB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIkVzdGUgY2FtcG8gZGViZSBjb250ZW5lciBwb3IgbG8gbWVub3MgezB9IG7Dum1lcm9zIG8gY2FyYWN0ZXJlcyIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIGRlYmUgY29udGVuZXIgYSBsbyBtw6FzIHswfSBuw7ptZXJvcyBvIGNhcmFjdGVyZXMiLAoJCQkJIm5vbmVMYWJlbCI6ICJOaW5ndW5vIiwKCQkJCSJhZGRJdGVtQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQcOxYWRpciIsCgkJCQkicmVtb3ZlQnV0dG9uTGFiZWwiOiAiUXVpdGFyIiwKCQkJCSJ1cEJ1dHRvbkxhYmVsIjogIkFycmliYSIsCgkJCQkiZG93bkJ1dHRvbkxhYmVsIjogIkFiYWpvIgoJCQl9CiAgICAgICAgfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBmaW5uaXNoIC0gZmlubGFuZAoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgImZpX0ZJIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJLZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlN5w7Z0ZSBvbiB2aXJoZWVsbGluZW4iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIlRhbW1pa3V1IiwgIkhlbG1pa3V1IiwgIk1hYWxpc2t1dSIsICJIdWh0aWt1dSIsICJUb3Vrb2t1dSIsICJLZXPDpGt1dSIsICJIZWluw6RrdXUiLCAiRWxva3V1IiwgIlN5eXNrdXUiLCAiTG9rYWt1dSIsICJNYXJyYXNrdXUiLCAiSm91bHVrdXUiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VudGlhIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICJtaW51dXR0aWEiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0dW50aWEiLAogICAgICAgICAgICAgICAgICAgIERBWTogInDDpGl2w6TDpCIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJrdXVrYXV0dGEiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJ2dW90dGEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIlTDpG3DpCBrZW50dMOkIG9uIHBha29sbGluZW4iLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiU2V1cmFhdmF0IHN5w7Z0dGVldCBlaXbDpHQgb2xlIHNhbGxpdHR1amE6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIktlbnTDpG4gcGl0w6TDpCBzaXPDpGx0w6TDpCB5a3NpIHNldXJhYXZpc3RhIGFydm9pc3RhOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJQaWVuaW4gc2FsbGl0dHUgbcOkw6Ryw6QgYXJ2b2phIG9uIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIlN1dXJpbiBzYWxsaXR0dSBtw6TDpHLDpCBhcnZvamEgb24gezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJTecO2dGV0eXQgYXJ2b3QgZWl2w6R0IG9sZSB1bmlpa2tlamEiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiU3nDtnRlIGVpIG9sZSBsaXN0YSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVmlyaGVlbGxpbmVuIHDDpGl2w6Rtw6TDpHLDpG11b3RvOiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJWaXJoZWVsbGluZW4gc8OkaGvDtnBvc3Rpb3NvaXRlIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiQXJ2byBlaSBvbGUga29rb25haXNsdWt1IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJWaXJoZWVsbGluZW4gSVB2NC1vc29pdGUiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiUGllbmluIHNhbGxpdHR1IGFydm8gb24gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIlN1dXJpbiBzYWxsaXR0dSBhcnZvIG9uIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJBcnZvbiBwaXTDpMOkIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiQXJ2b24gcGl0w6TDpCBvbGxhIHBpZW5lbXBpIGt1aW4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJMdXZ1biBwaXTDpMOkIG9sbGEgamFvbGxpbmVuIGx1dnVsbGEgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBTnVtYmVyIjogIlN5w7Z0ZSBlaSBvbGUgbHVrdSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlZpcmhlZWxsaW5lbiBzYWxhc2FuYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlZpcmhlZWxsaW5lbiBwdWhlbGlubnVtZXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICJTecO2dHRlZW4gdMOkeXR5eSBvbGxhIHNldXJhYXZhc3NhIG11b2Rvc3NhOiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlN5w7Z0dGVlbiBtaW5pbWlwaXR1dXMgb24gezB9IG1lcmtracOkIiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlN5w7Z0dGVlbiBtYWtzaW1pcGl0dXVzIG9uIHswfSBtZXJra2nDpCIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZnJlbmNoIC0gZnJhbmNlCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiZnJfRlIiOiB7CgkJCQlyZXF1aXJlZDogIkNlIGNoYW1wIGVzdCByZXF1aXMiLAoJCQkJaW52YWxpZDogIkNlIGNoYW1wIGVzdCBpbnZhbGlkZSIsCgkJCQltb250aHM6IFsiSmFudmllciIsICJGw6l2cmllciIsICJNYXJzIiwgIkF2cmlsIiwgIk1haSIsICJKdWluIiwgIkp1aWxsZXQiLCAiQW/Du3QiLCAiU2VwdGVtYnJlIiwgIk9jdG9icmUiLCAiTm92ZW1icmUiLCAiRMOpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRlcyIsCgkJCQkJTUlOVVRFOiAibWludXRlcyIsCgkJCQkJSE9VUjogImhldXJlcyIsCgkJCQkJREFZOiAiam91cnMiLAoJCQkJCU1PTlRIOiAibW9pcyIsCgkJCQkJWUVBUjogImFubsOpZXMiCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkNlIGNoYW1wIG4nZXN0IHBhcyBvcHRpb25uZWwuIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSBzb250IGRlcyB2YWxldXJzIGludGVyZGl0ZXMuIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiQ2UgY2hhbXAgZG9pdCBwcmVuZHJlIHVuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgOiB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICJMZSBub21icmUgbWluaW11bSBkJ8OpbMOpbWVudHMgZXN0IHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIkxlIG5vbWJyZSBtYXhpbXVtIGQnw6lsw6ltZW50cyBlc3QgezB9IiwKCQkJCSJ2YWx1ZU5vdFVuaXF1ZSI6ICJMZXMgdmFsZXVycyBzb250IHVuaXF1ZXMiLAoJCQkJIm5vdEFuQXJyYXkiOiAiQ2V0dGUgdmFsZXVyIG4nZXN0IHBhcyB1bmUgbGlzdGUiLAoJCQkJImludmFsaWREYXRlIjogIkNldHRlIGRhdGUgbmUgY29ycmVzcG9uZCBwYXMgYXUgZm9ybWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkFkcmVzc2UgZGUgY291cnJpZWwgaW52YWxpZGUsIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIkNldHRlIHZhbGV1ciBuJ2VzdCBwYXMgdW4gbm9tYnJlIGVudGllci4iLAoJCQkJImludmFsaWRJUHY0IjogIkFkcmVzc2UgSVB2NCBpbnZhbGlkZSwgZXg6IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkxhIHZhbGV1ciBtaW5pbWFsZSBwb3VyIGNlIGNoYW1wIGVzdCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiTGEgdmFsZXVyIG1heGltYWxlIHBvdXIgY2UgY2hhbXAgZXN0IHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBzdXDDqXJpZXVyZSDDoCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTGEgdmFsZXVyIGRvaXQtw6p0cmUgaW5mw6lyaWV1cmUgw6AgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJMYSB2YWxldXIgZG9pdC3DqnRyZSBkaXZpc2libGUgcGFyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJDZXR0ZSB2YWxldXIgbidlc3QgcGFzIHVuIG5vbWJyZS4iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJNb3QgZGUgcGFzc2UgaW52YWxpZGUiLAoJCQkJImludmFsaWRQaG9uZSI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlLCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIkNlIGNoYW1wIGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiQ2UgY2hhbXAgZG9pdCBjb250ZW5pciBhdSBwbHVzIHswfSBjYXJhY3TDqHJlcyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gY3JvYXRpYW4gLSBjcm9hdGlhCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaHJfSFIiOiB7CgkJCQlyZXF1aXJlZDogIlBvbGplIGplIG9iYXZlem5vIiwKCQkJCWludmFsaWQ6ICJQb2dyZcWhbmEgdnJpamVkbm9zdCIsCgkJCQltb250aHM6IFsiU2lqZcSNYW5qIiwgIlZlbGphxI1hIiwgIk/FvnVqYWsiLCAiVHJhdmFuaiIsICJTdmliYW5qIiwgIkxpcGFuaiIsICJTcnBhbmoiLCAiS29sb3ZveiIsICJSdWphbiIsICJMaXN0b3BhZCIsICJTdHVkZW5pIiwgIlByb3NpbmFjIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWt1bmRhIiwKCQkJCQlNSU5VVEU6ICJtaW51dGEiLAoJCQkJCUhPVVI6ICJzYXRpIiwKCQkJCQlEQVk6ICJkYW4iLAoJCQkJCU1PTlRIOiAibWplc2VjIiwKCQkJCQlZRUFSOiAiZ29kaW5hIgoJCQkJfSwKCQkJCSJub3RPcHRpb25hbCI6ICJQb2xqZSBuaWplIG9wY2lvbm8uIiwKCQkJCSJkaXNhbGxvd1ZhbHVlIjogInswfSB2cmlqZWRub3N0IG5pamUgZG96dm9samVuYS4iLAoJCQkJImludmFsaWRWYWx1ZU9mRW51bSI6ICJNb2d1xIdlIHZyaWplZG5vc3RpIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiT2RhYmVyaXRlIG5ham1hbmplIHswfSIsCgkJCQkidG9vTWFueUl0ZW1zIjogIk9kYWJlcml0ZSBuYWp2acWhZSB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIlZyaWplZG5vc3QgbmlqZSBqZWRpbnN0dmVuYSIsCgkJCQkibm90QW5BcnJheSI6ICJWcmlqZWRub3N0IG5pamUgcG9waXMiLAoJCQkJImludmFsaWREYXRlIjogIkRhdHVtIG5pamUgdSBmb3JtYXR1IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIkUtbWFpbCBhZHJlc2EgbmlqZSB1IGlzcHJhdm5vbSBmb3JtYXR1LCBucHI6IGltZS5wcmV6aW1lQGludGVybmV0LmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIlZyaWplZG5vc3QgbmlqZSBjaWplbGkgYnJvai4iLAoJCQkJImludmFsaWRJUHY0IjogIklQdjQgYWRyZXNhIG5pamUgaXNwcmF2bmEsIG5wcjogMTkyLjE2OC4wLjEiLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiVnJpamVkbm9zdCBqZSBpc3BvZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiVnJpamVkbm9zdCBqZSBpem5hZCBkb3B1xaF0ZW5vZyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgdmXEh2Egb2QgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZyaWplZG5vc3QgbW9yYSBiaXRpIG1hbmphIG9kIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiVnJpamVkbm9zdCBtb3JhIGJpdGkgZGplbGppdmEgc2EgezB9IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIlZyaWplZG5vc3QgbmlqZSBicm9qLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk5laXNwcmF2bmEgbG96aW5rYSIsCgkJCQkiaW52YWxpZFBob25lIjogIlRlbGVmb24gbmlqZSBpc3ByYXZhbiwgbnByOiAoMTIzKSA0NTYtOTk5OSIsCgkJCQkiaW52YWxpZFBhdHRlcm4iOiAiUG9ncmXFoWFuIHV6b3JhayB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIlBvbGplIG1vcmEgaW1hdGkgbmFtamFuamUgezB9IHpuYWtvdmEiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiUG9samUgbW9yYSBpbWF0aSBuYWp2acWhZSB7MH0gem5ha292YSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gaXRhbGlhbiAtIGl0YWx5CgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkiaXRfSVQiOiB7CgkJCQlyZXF1aXJlZDogIlF1ZXN0byBjYW1wbyDDqCBvYmJsaWdhdG9yaW8iLAoJCQkJaW52YWxpZDogIlF1ZXN0byBjYW1wbyDDqCBpbnZhbGlkbyIsCgkJCQltb250aHM6IFsiR2VubmFpbyIsICJGZWJicmFpbyIsICJNYXJ6byIsICJBcHJpbGUiLCAiTWFnZ2lvIiwgIkdpdWdubyIsICJMdWdsaW8iLCAiQWdvc3RvIiwgIlNldHRlbWJyZSIsICJPdHRvYnJlIiwgIk5vdmVtYnJlIiwgIkRpY2VtYnJlIl0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICJzZWNvbmRpIiwKCQkJCQlNSU5VVEU6ICJtaW51dGkiLAoJCQkJCUhPVVI6ICJvcmUiLAoJCQkJCURBWTogImdpb3JuaSIsCgkJCQkJTU9OVEg6ICJtZXNpIiwKCQkJCQlZRUFSOiAiYW5uaSIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiUXVlc3RvIGNhbXBvIG5vbiDDqCBvcHppb25hbGUiLAoJCQkJImRpc2FsbG93VmFsdWUiOiAiezB9IHNvbm8gdmFsb3JpIGludmFsaWRpIiwKCQkJCSJpbnZhbGlkVmFsdWVPZkVudW0iOiAiUXVlc3RvIGNhbXBvIGRldmUgYXZlcmUgdW5vIGRlaSBzZWd1ZW50aSB2YWxvcmkgezB9ICh2YWxvcmUgYXR0dWFsZTogezF9KSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSWwgbnVtZXJvIG1pbmltbyBkaSBlbGVtZW50aSByaWNoaWVzdGkgw6ggezB9IiwKCQkJCSJ0b29NYW55SXRlbXMiOiAiSWwgbnVtZXJvIG1hc3NpbW8gZGkgZWxlbWVudGkgYW1tZXNzaSDDqCB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIkkgdmFsb3JpIG5vbiBzb25vIHVuaXZvY2kiLAoJCQkJIm5vdEFuQXJyYXkiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggZGkgdGlwbyBhcnJheSIsCgkJCQkiaW52YWxpZERhdGUiOiAiRGF0YSBpbnZhbGlkYSBwZXIgaWwgZm9ybWF0byB7MH0iLAoJCQkJImludmFsaWRFbWFpbCI6ICJJbmRpcml6em8gZW1haWwgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiUXVlc3RvIHZhbG9yZSBub24gw6ggdW4gbnVtZXJvIGludGVybyIsCgkJCQkiaW52YWxpZElQdjQiOiAiSW5kaXJpenpvIElQdjQgaW52YWxpZG8sIHNpIGF0dGVuZG9ubyB2YWxvcmkgZGVsIHRpcG86IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIklsIHZhbG9yZSBtaW5pbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiSWwgdmFsb3JlIG1hc3NpbW8gcGVyIHF1ZXN0byBjYW1wbyDDqCB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtYWdnaW9yZSBkaSB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiSWwgdmFsb3JlIGRpIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBtaW5vcmUgZGkgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICJJbCB2YWxvcmUgZGkgcXVlc3RvIGNhbXBvIGRldmUgZXNzZXJlIGRpdmlzaWJpbGUgcGVyIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJRdWVzdG8gdmFsb3JlIG5vbiDDqCB1biBudW1lcm8iLAoJCQkJImludmFsaWRQYXNzd29yZCI6ICJQYXNzd29yZCBpbnZhbGlkYSIsCgkJCQkiaW52YWxpZFBob25lIjogIk51bWVybyBkaSB0ZWxlZm9ubyBpbnZhbGlkbywgc2kgYXR0ZW5kb25vIHZhbG9yaSBkZWwgdGlwbzogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIlF1ZXN0byBjYW1wbyBkZXZlIGF2ZXJlIGxhIHNlZ3VlbnRlIHN0cnV0dHVyYTogezB9IiwKCQkJCSJzdHJpbmdUb29TaG9ydCI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIG1lbm8gZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkic3RyaW5nVG9vTG9uZyI6ICJRdWVzdG8gY2FtcG8gbm9uIGRldmUgY29udGVuZXJlIHBpw7kgZGkgezB9IGNhcmF0dGVyaSIsCgkJCQkibm9uZUxhYmVsIjogIk5lc3N1bm8iLAoJCQkJImFkZEl0ZW1CdXR0b25MYWJlbCI6ICJBZ2dpdW5naSIsCgkJCQkiYWRkQnV0dG9uTGFiZWwiOiAiQWdnaXVuZ2kiLAoJCQkJInJlbW92ZUJ1dHRvbkxhYmVsIjogIlJpbXVvdmkiLAoJCQkJInVwQnV0dG9uTGFiZWwiOiAiU3UiLAoJCQkJImRvd25CdXR0b25MYWJlbCI6ICJHacO5IgoJCQl9CgkJfQoJfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAvLyBqYXBhbmVzZSAtIGphcGFuCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAiamFfSlAiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIuOBk+OBrumgheebruOBr+W/hemgiOOBp+OBmSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAi44GT44Gu6aCF55uu44Gv5q2j44GX44GE5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyIx5pyIIiwgIjLmnIgiLCAiM+aciCIsICI05pyIIiwgIjXmnIgiLCAiNuaciCIsICI35pyIIiwgIjjmnIgiLCAiOeaciCIsICIxMOaciCIsICIxMeaciCIsICIxMuaciCJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAi56eSIiwKICAgICAgICAgICAgICAgICAgICBNSU5VVEU6ICLliIYiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICLmmYIiLAogICAgICAgICAgICAgICAgICAgIERBWTogIuaXpSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICLmnIgiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLlubQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIuOBk+OBrumgheebruOBr+S7u+aEj+OBruWbnuetlOmgheebruOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0g44Gv56aB5q2i44GV44KM44Gm44GE44KL5YCk44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAi44GT44Gu6aCF55uu44GvIHswfSDjga7kuK3jgYvjgonpgbjjgbDjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILnj77lnKjjga7lgKTjga8gezF9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAibm90RW5vdWdoSXRlbXMiOiAi6aCF55uu5pWw44GvIHswfSDku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICLpoIXnm67mlbDjga8gezB9IOS7peS4i+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAi5YCk44GM5LiA5oSP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIuOBk+OBrumgheebruOBruWApOOBjOmFjeWIl+OBp+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICLjgZPjga7poIXnm67jga7mnIDlsI/lgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICLjgZPjga7poIXnm67jga7mnIDlpKflgKTjga8gezB9IOOBp+OBmSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICLjgZPjga7poIXnm67jga7lgKTjga8gezB9IOOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nRGl2aXNpYmxlQnkiOiAi5YCk44GvIHswfSDjgavjgojjgaPjgablibLjgorliIfjgozjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAi44GT44Gu6aCF55uu44Gu5YCk44GM5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZU5vdE11bHRpcGxlT2YiOiAi5YCk44GMIHswfSDjga7lgI3mlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICLjgZPjga7poIXnm67jga7lgKTjgYzmlbTmlbDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFKU09OIjogIuWApOOBjOato+OBl+OBhCBKU09OIOW9ouW8j+OBruaWh+Wtl+WIl+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIrlv4XopoHjgafjgZkiLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAi44GT44Gu6aCF55uu44GvIHswfSDmloflrZfku6XkuIvjgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRUaW1lIjogIuaZgumWk+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAi5pel5LuY44GMIHswfSDjgafjga/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgaW5mb0BjbG91ZGNtcy5jb20g44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJJUHY0IOOCouODieODrOOCueOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguS+i+OBiOOBsCAxOTIuMTY4LjAuMSDjga7jgojjgYbjgarlvaLlvI/jgafjgZkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICLjg5Hjgrnjg6/jg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpMiLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICLpm7voqbHnlarlj7fjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILkvovjgYjjgbAgKDEyMykgNDU2LTk5OTkg44Gu44KI44GG44Gq5b2i5byP44Gn44GZIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGF0dGVybiI6ICLjgZPjga7poIXnm67jga8gezB9IOOBruODkeOCv+ODvOODs+OBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFVSTEZvcm1hdCI6ICJVUkwg44GM5q2j44GX44GE5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KTIiwKICAgICAgICAgICAgICAgICJrZXlNaXNzaW5nIjogIuWcsOWbs+OBjOepuuOBruOCreODvOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAia2V5Tm90VW5pcXVlIjogIuWcsOWbs+OBruOCreODvOOBjOS4gOaEj+OBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiT2JqZWN0dG9vRmV3UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqPjgYzotrPjgorjgb7jgZvjgpMgKHswfSDjgYzlv4XopoHjgafjgZkpIiwKICAgICAgICAgICAgICAgICJ0b29NYW55UHJvcGVydGllcyI6ICLjg5fjg63jg5Hjg4bjgqMgKHswfSkg44Gu5pyA5aSn5pWw44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJ3b3JkTGltaXRFeGNlZWRlZCI6ICJ7MH0g44Gu5Y2Y6Kqe5pWw44Gu5Yi26ZmQ44KS6LaF44GI44Gm44GE44G+44GZIiwKICAgICAgICAgICAgICAgICJlZGl0b3JBbm5vdGF0aW9uc0V4aXN0IjogIuOCqOODh+OCo+OCv+OBjOS/ruato+OBmeOBueOBjeOCqOODqeODvOOCkuWgseWRiuOBl+OBpuOBhOOBvuOBmSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXRGaXZlIjogIjXmoYHjga4gWmlwY29kZSAoIyMjIyMpIOOBp+OBr+OBguOCiuOBvuOBm+OCkyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFppcGNvZGVGb3JtYXROaW5lIjogIjnmoYHjga4gWmlwY29kZSAoIyMjIyMtIyMjIykg44Gn44Gv44GC44KK44G+44Gb44KTIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBub3J3ZWdpYW4gLSBub3J3YXkKCgl2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgoJQWxwYWNhLnJlZ2lzdGVyVmlldyAoewoJCSJpZCI6ICJiYXNlIiwKCQkibWVzc2FnZXMiOiB7CiAgICAgICAgICAgICJuYl9OTyI6IHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAiRmVsdGV0IGVyIG9ibGlnYXRvcmlzayIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVmVyZGllbiBlciB1Z3lsZGlnIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJKYW51YXIiLCAiRmVicnVhciIsICJNYXJzIiwgIkFwcmlsIiwgIk1haSIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPa3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlc2VtYmVyIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJTZWt1bmRlciIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAiTWludXR0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJUaW1lciIsCiAgICAgICAgICAgICAgICAgICAgREFZOiAiRGFnZXIiLAogICAgICAgICAgICAgICAgICAgIE1PTlRIOiAiTcOlbmVkZXIiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICLDhXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vdE9wdGlvbmFsIjogIkRldHRlIGZlbHRldCBlciBvYmxpZ2F0b3Jpc2siLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiRGVubmUgdmVyZGllbiBlciBpa2tlIHRpbGxhdHQ6IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkZlbHRldCBtw6UgaW5uZWhvbGRlIGVuIGF2IGbDuGxnZW5kZSB2ZXJkaWVyOiB7MH0uIE7DpXbDpnJlbmRlIHZlcmRpIGVyOiB7MX0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGUgdGlsbGF0dGUgYW50YWxsZXQgZWxlbWVudGVyIGVyIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIkRldCBzdMO4cnN0ZSB0aWxsYXR0ZSBhbnRhbGxldCBlbGVtZW50ZXIgZXIgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJWZXJkaWVuZSBlciBpa2tlIHVuaWtlIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIklra2UgZW4gbGlzdGUgYXYgdmVyZGllciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZERhdGUiOiAiVWd5bGRpZyBkYXRvZm9ybWF0OiB7MH0iLAogICAgICAgICAgICAgICAgImludmFsaWRFbWFpbCI6ICJVZ3lsZGlnIGUtcG9zdGFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgaGVsdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZElQdjQiOiAiVWd5bGRpZyBJUHY0LWFkcmVzc2UiLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGwiOiAiRGVuIG1pbnN0ZSB0aWxsYXR0ZSB2ZXJkaWVuIGVyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZW4gc3TDuHJzdGUgdGlsbGF0dGUgdmVyZGllbiBlciB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiVmVyZGllbiBtw6UgdsOmcmUgc3TDuHJyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIlZlcmRpZW4gbcOlIHbDpnJlIG1pbmRyZSBlbm4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxsZXQgbcOlIHbDpnJlIGRlbGJhcnQgbWVkIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJWZXJkaWVuIGVyIGlra2UgZXQgdGFsbCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlVneWxkaWcgcGFzc29yZCIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIlVneWxkaWcgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRmVsdGV0IG3DpSB2w6ZyZSBpIGbDuGxnZW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGUgZmVsdGV0IG3DpSBtaW5zdCBpbm5laG9sZGUgezB9IHRlZ24iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb0xvbmciOiAiRGV0dGUgZmVsdGV0IGthbiBtYWtzIGlubmVob2xkZSB7MH0gdGVnbiIKICAgICAgICAgICAgfQoJCX0KCX0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgoJLy8gZHV0Y2ggLSBiZWxnaXVtCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewoJCQkibmxfQkUiOiB7CgkJCQlyZXF1aXJlZDogIkRpdCB2ZWxkIGlzIHZlcnBsaWNodCIsCgkJCQlpbnZhbGlkOiAiRGl0IHZlbGQgaXMgb25nZWxkaWciLAoJCQkJbW9udGhzOiBbIkphbnVhcmkiLCAiRmVicnVhcmkiLCAiTWFhcnQiLCAiQXByaWwiLCAiTWVpIiwgIkp1bmkiLCAiSnVseSIsICJBdWd1c3R1cyIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAoJCQkJdGltZVVuaXRzOiB7CgkJCQkJU0VDT05EOiAic2Vjb25kZW4iLAoJCQkJCU1JTlVURTogIm1pbnV0ZW4iLAoJCQkJCUhPVVI6ICJ1cmVuIiwKCQkJCQlEQVk6ICJkYWdlbiIsCgkJCQkJTU9OVEg6ICJtYWFuZGVuIiwKCQkJCQlZRUFSOiAiamFyZW4iCgkJCQl9LAoJCQkJIm5vdE9wdGlvbmFsIjogIkRpdCB2ZWxkIGlzIG5pZXQgb3B0aW9uZWVsLiIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICJ7MH0gemlqbiB2ZXJib2RlbiB3YWFyZGVuLiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIkRpdCB2ZWxkIG1vZXQgw6nDqW4gdmFuIHZvbGdlbmRlIGJldmF0dGVuIDogezB9LiBbezF9XSIsCgkJCQkibm90RW5vdWdoSXRlbXMiOiAiSGV0IG1pbmltdW0gYWFudGFsIGVsZW1lbnRlbiBpcyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICJIZXQgbWF4aW11bSBhYW50YWwgZWxlbWVudGVuIGlzIHswfSIsCgkJCQkidmFsdWVOb3RVbmlxdWUiOiAiRGUgd2FhcmRlbiB6aWpuIHVuaWVrIiwKCQkJCSJub3RBbkFycmF5IjogIkRlemUgd2FhcmRlIGlzIGdlZW4gbGlqc3QiLAoJCQkJImludmFsaWREYXRlIjogIkRlIGRhdHVtIGtvbXQgbmlldCBvdmVyZWVuIG1ldCBmb3JtYWF0IHswfSIsCgkJCQkiaW52YWxpZEVtYWlsIjogIk9uZ2VsZGlnIGUtbWFpbGFkcmVzLCB2Yi46IGluZm9AY2xvdWRjbXMuY29tIiwKCQkJCSJzdHJpbmdOb3RBbkludGVnZXIiOiAiRGV6ZSB3YWFyZGUgaXMgZ2VlbiBnZWhlZWwgZ2V0YWwuIiwKCQkJCSJpbnZhbGlkSVB2NCI6ICJPbmdlbGRpZyBJUHY0IGFkcmVzLCB2Yi46IDE5Mi4xNjguMC4xIiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRlIG1pbmltYWxlIHdhYXJkZSB2b29yIGRpdCB2ZWxkIGlzIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZSBtYXhpbWFsZSB3YWFyZGUgdm9vciBkaXQgdmVsZCBpcyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vU21hbGxFeGNsdXNpdmUiOiAiRGUgd2FhcmRlIG1vZXQgZ3JvdGVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJEZSB3YWFyZGUgbW9ldCBrbGVpbmVyIHppam4gZGFuIHswfSIsCgkJCQkic3RyaW5nRGl2aXNpYmxlQnkiOiAiRGUgd2FhcmRlIG1vZXQgZGVlbGJhYXIgemlqbiBkb29yIHswfSIsCgkJCQkic3RyaW5nTm90QU51bWJlciI6ICJEZXplIHdhYXJkZSBpcyBnZWVuIGdldGFsLiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIk9uZ2VsZGlnIHdhY2h0d29vcmQiLAoJCQkJImludmFsaWRQaG9uZSI6ICJPbmdlbGRpZyB0ZWxlZm9vbm51bW1lciwgdmI6ICgxMjMpIDQ1Ni05OTk5IiwKCQkJCSJpbnZhbGlkUGF0dGVybiI6ICJEaXQgdmVsZCBtb2V0IG92ZXJlZW5rb21lbiBtZXQgcGF0cm9vbiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1Rvb1Nob3J0IjogIkRpdCB2ZWxkIG1vZXQgbWluc3RlbnMgezB9IHRla2VucyBiZXZhdHRlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEaXQgdmVsZCBtb2V0IG1pbmRlciBkYW4gezB9IHRla2VucyBiZXZhdHRlbiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbigkKSB7CgogICAgLy8gcG9saXNoIC0gcG9sYW5kCgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcgKHsKICAgICAgICAiaWQiOiAiYmFzZSIsCiAgICAgICAgIm1lc3NhZ2VzIjogewogICAgICAgICAgICAicGxfUEwiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIlRvIHBvbGUgamVzdCB3eW1hZ2FuZSIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiVG8gcG9sZSBqZXN0IG5pZXByYXdpZMWCb3dlIiwKICAgICAgICAgICAgICAgIG1vbnRoczogWyJTdHljemXFhCIsICJMdXR5IiwgIk1hcnplYyIsICJLd2llY2llxYQiLCAiTWFqIiwgIkN6ZXJ3aWVjIiwgIkxpcGllYyIsICJTaWVycGllxYQiLCAiV3J6ZXNpZcWEIiwgIlBhxbpkemllcm5payIsICJMaXN0b3BhZCIsICJHcnVkemllxYQiXSwKICAgICAgICAgICAgICAgIHRpbWVVbml0czogewogICAgICAgICAgICAgICAgICAgIFNFQ09ORDogInNla3VuZHkiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0eSIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImdvZHppbnkiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRuaSIsCiAgICAgICAgICAgICAgICAgICAgTU9OVEg6ICJtaWVzacSFY2UiLAogICAgICAgICAgICAgICAgICAgIFlFQVI6ICJsYXRhIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJUbyBwb2xlIG5pZSBqZXN0IG9wY2pvbmFsbmUiLAogICAgICAgICAgICAgICAgImRpc2FsbG93VmFsdWUiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGRvendvbG9uYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiVG8gcG9sZSBwb3dpbm5vIHphd2llcmHEhyBqZWRuxIUgeiBuYXN0xJlwdWrEhWN5Y2ggd2FydG/Fm2NpOiB7MH0uIFt7MX1dIiwKICAgICAgICAgICAgICAgICJub3RFbm91Z2hJdGVtcyI6ICJNaW5pbWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidG9vTWFueUl0ZW1zIjogIk1ha3N5bWFsbmEgbGljemJhIGVsZW1lbnTDs3cgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVGUgd2FydG/Fm2NpIG5pZSBzxIUgdW5pa2FsbmUiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IHRhYmxpY8SFIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJOaWVwb3ByYXdueSBmb3JtYXQgZGF0eTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiTmllcG9wcmF3bnkgYWRyZXMgZW1haWwsIG4ucC46IGluZm9AY2xvdWRjbXMuY29tIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVGEgd2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUgY2HFgmtvd2l0xIUiLAogICAgICAgICAgICAgICAgImludmFsaWRJUHY0IjogIk5pZXBvcHJhd255IGFkcmVzIElQdjQsIG4ucC46IDE5Mi4xNjguMC4xIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIk1pbmltYWxuYSB3YXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSB3eW5vc2kgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb0xhcmdlIjogIk1ha3N5bWFsbmEgd2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgd3lub3NpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJXYXJ0b8WbxIcgZGxhIHRlZ28gcG9sYSBtdXNpIGJ5xIcgd2nEmWtzemEgbmnFvCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiV2FydG/Fm8SHIGRsYSB0ZWdvIHBvbGEgbXVzaSBiecSHIG1uaWVqc3phIG5pxbwgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJXYXJ0b8WbxIcgbXVzaSBiecSHIHBvZHppZWxuYSBwcnpleiB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiV2FydG/Fm8SHIG5pZSBqZXN0IGxpY3pixIUiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXNzd29yZCI6ICJOaWVwb3ByYXduZSBoYXPFgm8iLAogICAgICAgICAgICAgICAgImludmFsaWRQaG9uZSI6ICJOaWVwb3ByYXdueSBudW1lciB0ZWxlZm9udSwgbi5wLjogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIlRvIHBvbGUgcG93aW5ubyBtaWXEhyBmb3JtYXQgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29TaG9ydCI6ICJUbyBwb2xlIHBvd2lubm8gemF3aWVyYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3IiwKICAgICAgICAgICAgICAgICJzdHJpbmdUb29Mb25nIjogIlRvIHBvbGUgcG93aW5ubyB6YXdpZXJhxIcgbmFqd3nFvGVqIHswfSB6bmFrw7N3IgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwooZnVuY3Rpb24oJCkgewoKICAgIC8vIHBvcnR1Z3Vlc2UgLSBwb3J0dWdhbAoKICAgIHZhciBBbHBhY2EgPSAkLmFscGFjYTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CiAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICJtZXNzYWdlcyI6IHsKICAgICAgICAgICAgInB0X0JSIjogewogICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICJFc3RlIGNhbXBvIMOpIG9icmlnYXTDs3JpbyIsCiAgICAgICAgICAgICAgICBpbnZhbGlkOiAiRXN0ZSBjYW1wbyDDqSBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgbW9udGhzOiBbIkphbmVpcm8iLCAiRmV2ZXJlaXJvIiwgIk1hcsOnbyIsICJBYnJpbCIsICJNYWlvIiwgIkp1bmhvIiwgIkp1bGhvIiwgIkFnb3N0byIsICJTZXRlbWJybyIsICJPdXR1YnJvIiwgIk5vdmVtYnJvIiwgIkRlemVtYnJvIl0sCiAgICAgICAgICAgICAgICB0aW1lVW5pdHM6IHsKICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICJzZWd1bmRvcyIsCiAgICAgICAgICAgICAgICAgICAgTUlOVVRFOiAibWludXRvcyIsCiAgICAgICAgICAgICAgICAgICAgSE9VUjogImhvcmFzIiwKICAgICAgICAgICAgICAgICAgICBEQVk6ICJkaWFzIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm1lc2VzIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiYW5vcyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90T3B0aW9uYWwiOiAiRXN0ZSBjYW1wbyBuw6NvIMOpIG9wY2lvbmFsIiwKICAgICAgICAgICAgICAgICJkaXNhbGxvd1ZhbHVlIjogInswfSBzw6NvIHZhbG9yZXMgcHJvaWJpZG9zIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRXN0ZSBjYW1wbyBkZXZlIHRlciB1bSBkb3Mgc2VndWludGVzIHZhbG9yZXM6IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIk8gbsO6bWVybyBtw61uaW1vIGRlIGVsZW1lbnRvcyDDqSB7MH0iLAogICAgICAgICAgICAgICAgInRvb01hbnlJdGVtcyI6ICJPIG7Dum1lcm8gbcOheGltbyBkZSBlbGVtZW50b3Mgw6kgezB9IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU5vdFVuaXF1ZSI6ICJPcyB2YWxvcmVzIG7Do28gc8OjbyDDum5pY29zIiwKICAgICAgICAgICAgICAgICJub3RBbkFycmF5IjogIkVzdGUgdmFsb3IgbsOjbyDDqSB1bWEgbGlzdGEiLAogICAgICAgICAgICAgICAgImludmFsaWREYXRlIjogIkVzdGEgZGF0YSBuw6NvIHRlbSBvIGZvcm1hdG8gezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRW1haWwiOiAiRW5kZXJlw6dvIGRlIGUtbWFpbCBpbnbDoWxpZG8iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFuSW50ZWdlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyBpbnRlaXJvIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJFbmRlcmXDp28gSVB2NCBpbnbDoWxpZG8sIGV4OiAxOTIuMTY4LjAuMSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbCI6ICJPIHZhbG9yIG3DrW5pbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJPIHZhbG9yIG3DoXhpbW8gcGFyYSBlc3RlIGNhbXBvIMOpIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJPIHZhbG9yIGRlc3RlIGNhbXBvIGRldmUgc2VyIG1haW9yIHF1ZSB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ1ZhbHVlVG9vTGFyZ2VFeGNsdXNpdmUiOiAiTyB2YWxvciBkZXN0ZSBjYW1wbyBkZXZlIHNlciBtZW5vciBxdWUgezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJPIHZhbG9yIGRldmUgc2VyIGRpdmlzw612ZWwgcG9yIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nTm90QU51bWJlciI6ICJFc3RlIHZhbG9yIG7Do28gw6kgdW0gbsO6bWVybyIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhc3N3b3JkIjogIlNlbmhhIGludsOhbGlkYSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBob25lIjogIk7Dum1lcm8gZGUgdGVsZWZvbmUgaW52w6FsaWRvLCBleDogKDEyMykgNDU2LTk5OTkiLAogICAgICAgICAgICAgICAgImludmFsaWRQYXR0ZXJuIjogIkVzdGUgY2FtcG8gZGV2ZSB0ZXIgbyBwYWRyw6NvIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRXN0ZSBjYW1wbyBkZXZlIGluY2x1aXIgcGVsbyBtZW5vcyB7MH0gY2FyYWN0ZXJlcyIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJFc3RlIGNhbXBvIHBvZGUgaW5jbHVpciBubyBtw6F4aW1vIHswfSBjYXJhY3RlcmVzIiwKCQkidGh1bWJuYWlsIjogIk1pbmlhdHVyYSIsCiAgICAgICAgCSJmaWxlbmFtZSI6ICJBcnF1aXZvIiwKICAgICAgICAJImZpbGVTaXplIjogIlRhbWFuaG8oYnl0ZXMpIiwKICAgICAgICAJImZpbGVVcGxvYWRBY3Rpb25zIjogIkNvbWFuZG9zIiwKICAgICAgICAJImNob29zZUZpbGUiOiAiRXNjb2xoZXIgYXJxdWl2by4uLiIsCiAgICAgICAgCSJjaG9vc2VGaWxlcyI6ICJFc2NvbGhlciBhcnF1aXZvcy4uLiIsCiAgICAgICAgCSJkcm9wWm9uZVNpbmdsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSB1bSBhcnF1aXZvIGFxdWkuLi4iLAogICAgICAgIAkiZHJvcFpvbmVNdWx0aXBsZSI6ICJDbGlxdWUgZW0gRXNjb2xoZXIgb3UgYXJyYXN0ZSBhcnF1aXZvcyBhcXVpLi4uIiwKCQkiZmlsZVRvb0JpZyI6ICJBcnF1aXZvIG11aXRvIGdyYW5kZTogIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCQpIHsKCgkvLyBzd2VkaXNoIC0gc3dlZGVuCgoJdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKCUFscGFjYS5yZWdpc3RlclZpZXcgKHsKCQkiaWQiOiAiYmFzZSIsCgkJIm1lc3NhZ2VzIjogewogICAgICAgICAgICAic3ZfU0UiOiB7CiAgICAgICAgICAgICAgICByZXF1aXJlZDogIkbDpGx0ZXQgw6RyIG9ibGlnYXRvcmlza3QiLAogICAgICAgICAgICAgICAgaW52YWxpZDogIlbDpHJkZXQgw6RyIGZlbGFrdGlndCIsCiAgICAgICAgICAgICAgICBtb250aHM6IFsiSmFudWFyaSIsICJGZWJydWFyaSIsICJNYXJzIiwgIkFwcmlsIiwgIk1haiIsICJKdW5pIiwgIkp1bGkiLCAiQXVndXN0aSIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLAogICAgICAgICAgICAgICAgdGltZVVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgU0VDT05EOiAic2VrdW5kZXIiLAogICAgICAgICAgICAgICAgICAgIE1JTlVURTogIm1pbnV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEhPVVI6ICJ0aW1tYXIiLAogICAgICAgICAgICAgICAgICAgIERBWTogImRhZ2FyIiwKICAgICAgICAgICAgICAgICAgICBNT05USDogIm3DpW5hZGVyIiwKICAgICAgICAgICAgICAgICAgICBZRUFSOiAiw6VyIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RPcHRpb25hbCI6ICJEZXR0YSBmw6RsdCDDpHIgb2JsaWdhdG9yaXNrdCIsCiAgICAgICAgICAgICAgICAiZGlzYWxsb3dWYWx1ZSI6ICJEZXNzYSB2w6RyZGVuIMOkciBpbnRlIHRpbGzDpXRuYTogezB9IiwKICAgICAgICAgICAgICAgICJpbnZhbGlkVmFsdWVPZkVudW0iOiAiRsOkbHRldCBtw6VzdGUgaW5uZWjDpWxsYSBldHQgYXYgZsO2bGphbmRlIHbDpHJkZW46IHswfS4gW3sxfV0iLAogICAgICAgICAgICAgICAgIm5vdEVub3VnaEl0ZW1zIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIGFudGFsZXQgZWxlbWVudCDDpHIgezB9IiwKICAgICAgICAgICAgICAgICJ0b29NYW55SXRlbXMiOiAiRGV0IHN0w7Zyc3RhIHRpbGzDpXRuYSBhbnRhbGV0IGVsZW1lbnQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAidmFsdWVOb3RVbmlxdWUiOiAiVsOkcmRlbmEgw6RyIGludGUgdW5pa2EiLAogICAgICAgICAgICAgICAgIm5vdEFuQXJyYXkiOiAiSW50ZSBlbiBsaXN0YSBhdiB2w6RyZGVuIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkRGF0ZSI6ICJGZWxha3RpZ3QgZm9ybWF0IGbDtnIgZGF0dW06IHswfSIsCiAgICAgICAgICAgICAgICAiaW52YWxpZEVtYWlsIjogIk9naWx0aWcgZS1wb3N0YWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdOb3RBbkludGVnZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgaGVsdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkSVB2NCI6ICJPZ2lsdGlnIElQdjQtYWRyZXNzIiwKICAgICAgICAgICAgICAgICJzdHJpbmdWYWx1ZVRvb1NtYWxsIjogIkRldCBtaW5zdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZSI6ICJEZXQgc3TDtnJzdGEgdGlsbMOldG5hIHbDpHJkZXQgw6RyIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29TbWFsbEV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIHN0w7ZycmUgw6RuIHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVmFsdWVUb29MYXJnZUV4Y2x1c2l2ZSI6ICJWw6RyZGV0IG3DpXN0ZSB2YXJhIG1pbmRyZSDDpG4gezB9IiwKICAgICAgICAgICAgICAgICJzdHJpbmdEaXZpc2libGVCeSI6ICJUYWxldCBtw6VzdGUgdmFyYSBkZWxiYXJ0IG1lZCB7MH0iLAogICAgICAgICAgICAgICAgInN0cmluZ05vdEFOdW1iZXIiOiAiVsOkcmRldCDDpHIgaW50ZSBldHQgdGFsIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGFzc3dvcmQiOiAiT2dpbHRpZ3QgbMO2c2Vub3JkIiwKICAgICAgICAgICAgICAgICJpbnZhbGlkUGhvbmUiOiAiT2dpbHRpZ3QgdGVsZWZvbm51bW1lciIsCiAgICAgICAgICAgICAgICAiaW52YWxpZFBhdHRlcm4iOiAiRsOkbHRldCBtw6VzdGUgdmFyYSBpIGbDtmxqYW5kZSBmb3JtYXQ6IHswfSIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vU2hvcnQiOiAiRGV0dGEgZsOkbHQgbcOlc3RlIGlubmVow6VsbGEgbWluc3QgezB9IHRlY2tlbiIsCiAgICAgICAgICAgICAgICAic3RyaW5nVG9vTG9uZyI6ICJEZXR0YSBmw6RsdCBmw6VyIGlubmVow6VsbGEgaMO2Z3N0IHswfSB0ZWNrZW4iCiAgICAgICAgICAgIH0KCQl9Cgl9KTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oJCkgewoKICAgIC8vIGNoaW5lc2UgLSBjaGluYQoKCXZhciBBbHBhY2EgPSAkLmFscGFjYTsKCglBbHBhY2EucmVnaXN0ZXJWaWV3ICh7CgkJImlkIjogImJhc2UiLAoJCSJtZXNzYWdlcyI6IHsKCQkJInpoX0NOIjogewoJCQkJcmVxdWlyZWQ6ICImIzI3NDkyOyYjMjI0OTU7JiMyNDUxNzsmIzM5MDM1OyIsCgkJCQlpbnZhbGlkOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMTk5ODE7JiMyMTUxMjsmIzI2Njg0OyIsCgkJCQltb250aHM6IFsiJiMxOTk2ODsmIzI2Mzc2OyIsICImIzIwMTA4OyYjMjYzNzY7IiwgIiYjMTk5Nzc7JiMyNjM3NjsiLCAiJiMyMjIzNTsmIzI2Mzc2OyIsICImIzIwMTE2OyYjMjYzNzY7IiwgIiYjMjA4NDU7JiMyNjM3NjsiLCAiJiMxOTk3MTsmIzI2Mzc2OyIsICImIzIwODQzOyYjMjYzNzY7IiwgIiYjMjAwNjE7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzI2Mzc2OyIsICImIzIxMzEzOyYjMTk5Njg7JiMyNjM3NjsiLCAiJiMyMTMxMzsmIzIwMTA4OyYjMjYzNzY7Il0sCgkJCQl0aW1lVW5pdHM6IHsKCQkJCQlTRUNPTkQ6ICImIzMxMTg2OyIsCgkJCQkJTUlOVVRFOiAiJiMyMDk5ODsiLAoJCQkJCUhPVVI6ICImIzI2MTAyOyIsCgkJCQkJREFZOiAiJiMyNjA4NTsiLAoJCQkJCU1PTlRIOiAiJiMyNjM3NjsiLAoJCQkJCVlFQVI6ICImIzI0MTgwOyIKCQkJCX0sCgkJCQkibm90T3B0aW9uYWwiOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMzg3NTA7JiMyMDIxOTsmIzM2ODczOyIsCgkJCQkiZGlzYWxsb3dWYWx1ZSI6ICImIzM4NzUwOyYjMjc4NjE7JiMzNjc1NTsmIzIwODM3OyYjMjEyNTM7JiMyNTMyNDsgezB9LiIsCgkJCQkiaW52YWxpZFZhbHVlT2ZFbnVtIjogIiYjMjA4MDE7JiMzNTc2ODsmIzM2NzU1OyYjMjA4Mzc7JiMyMTI1MzsmIzI1MzI0OyB7MH0uIFt7MX1dIiwKCQkJCSJub3RFbm91Z2hJdGVtcyI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInRvb01hbnlJdGVtcyI6ICImIzI2MzY4OyYjMjI4MjM7JiMyMDAxMDsmIzI1OTY4OyB7MH0iLAoJCQkJInZhbHVlTm90VW5pcXVlIjogIiYjMzY3NTU7JiMyMDgzNzsmIzIwNTQwOyYjMTk5ODE7JiMyOTQyMDsmIzI5MzA1OyIsCgkJCQkibm90QW5BcnJheSI6ICImIzE5OTgxOyYjMjYxNTk7JiMyNTk2ODsmIzMyNDUyOyIsCgkJCQkiaW52YWxpZERhdGUiOiAiJiMyNjA4NTsmIzI2Mzk5OyYjMjY2ODQ7JiMyNDMzNTsmIzIyMjQwOyYjMzU4MTM7JiMyNjE1OTsgezB9IiwKCQkJCSJpbnZhbGlkRW1haWwiOiAiJiMyMDIzNDsmIzIyOTY5OyYjMjA3OTk7JiMyNjY4NDsmIzI0MzM1OyYjMTk5ODE7JiMyMzU0NTssIGV4OiBpbmZvQGNsb3VkY21zLmNvbSIsCgkJCQkic3RyaW5nTm90QW5JbnRlZ2VyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTcyOyYjMjU5Njg7LiIsCgkJCQkiaW52YWxpZElQdjQiOiAiJiMxOTk4MTsmIzI2MTU5OyYjMjE1MTI7JiMyNzg2MTtJUCYjMjIzMjA7JiMyMjMzNjssIGV4OiAxOTIuMTY4LjAuMSIsCgkJCQkic3RyaW5nVmFsdWVUb29TbWFsbCI6ICImIzI2MzY4OyYjMjM1Njc7JiMyMDU0MDsmIzI2MTU5OyB7MH0iLAoJCQkJInN0cmluZ1ZhbHVlVG9vTGFyZ2UiOiAiJiMyNjM2ODsmIzIyODIzOyYjMjA1NDA7JiMyNjE1OTsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb1NtYWxsRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjI4MjM7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdWYWx1ZVRvb0xhcmdlRXhjbHVzaXZlIjogIiYjMjA1NDA7JiMyNDUxNzsmIzM5MDM1OyYjMjM1Njc7JiMyMDExMDsgezB9IiwKCQkJCSJzdHJpbmdEaXZpc2libGVCeSI6ICImIzIwNTQwOyYjMjQ1MTc7JiMzOTAzNTsmIzMzMDIxOyYjMzQ5ODc7IHswfSAmIzI1OTcyOyYjMzg1MDA7IiwKCQkJCSJzdHJpbmdOb3RBTnVtYmVyIjogIiYjMTk5ODE7JiMyNjE1OTsmIzI1OTY4OyYjMjMzODM7LiIsCgkJCQkiaW52YWxpZFBhc3N3b3JkIjogIiYjMzg3NTA7JiMyNzg2MTsmIzIzNDk0OyYjMzA3MjE7IiwKCQkJCSJpbnZhbGlkUGhvbmUiOiAiJiMzODc1MDsmIzI3ODYxOyYjMzAwMDU7JiMzNTgwNTsmIzIxNDk1OyYjMzA3MjE7LCBleDogKDEyMykgNDU2LTk5OTkiLAoJCQkJImludmFsaWRQYXR0ZXJuIjogIiYjMjc0OTI7JiMyMjQ5NTsmIzM5MDM1OyYjMjYzNzc7JiMyNjY4NDsmIzI0MzM1OyB7MH0iLAoJCQkJInN0cmluZ1Rvb1Nob3J0IjogIiYjMjc0OTI7JiMyMjQ5NTsmIzMzMjY3OyYjMjM1Njk7JiMzODI3MTsmIzI0MjMwOyB7MH0iLAoJCQkJInN0cmluZ1Rvb0xvbmciOiAiJiMyNzQ5MjsmIzIyNDk1OyYjMjYzNjg7JiMyMjgxMDsmIzM4MjcxOyYjMjQyMzA7IHswfSIKCQkJfQogICAgICAgIH0KICAgIH0pOwoKfSkoalF1ZXJ5KTsKCi8qKgogKiBXZWIgVGhlbWUgKCJ3ZWIiKQogKgogKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdlYiB0aGVtZSBmb3IgcHVyZSBIVE1MNSBmb3Jtcy4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgd2ViLXZpZXcKICogICAgd2ViLWVkaXQKICogICAgd2ViLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJ3ZWIiLAogKiAgICAgICAidHlwZSI6IG51bGwgfCAidmlldyIgfCAiZWRpdCIgfCAiY3JlYXRlIgogKiAgICB9CiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICB2YXIgQWxwYWNhID0gJC5hbHBhY2E7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluamVjdG9yICgid2ViIikuCiAgICAgKgogICAgICogVGhlIGhvb2tzIHByb3ZpZGVkIGhlcmUgYXJlIGVtcHR5LiAgVGhlIHdlYiB2aWV3IGZhbGxzIGJhY2sgb24gc3RyYWlnaHQgSFRNTDUgZm9yIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcuCiAgICAgKiBBcyBzdWNoLCB0aGVzZSBtb3N0bHkgc2VydmUgYXMgYSByZWZlcmVuY2UgZm9yIGV4dGVuc2lvbi4KICAgICAqLwogICAgdmFyIGNhbGxiYWNrcyA9IHt9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmaWVsZCByZW5kZXJzCiAgICBjYWxsYmFja3NbImZpZWxkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBjb250cm9sIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udHJvbCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIGFmdGVyIGEgY29udGFpbmVyIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgYWZ0ZXIgYSBmb3JtIHJlbmRlcnMKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQKICAgIGNhbGxiYWNrc1sicmVxdWlyZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIG9wdGlvbmFsCiAgICBjYWxsYmFja3NbIm9wdGlvbmFsIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhcyByZWFkb25seQogICAgY2FsbGJhY2tzWyJyZWFkb25seSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgZGlzYWJsZWQKICAgIGNhbGxiYWNrc1siZGlzYWJsZWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgIH07CiAgICAvLyBmaXJlcyB3aGVuIGEgZmllbGQgaXMgbWFya2VkIGFzIGVuYWJsZWQKICAgIGNhbGxiYWNrc1siZW5hYmxlZCJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGNhbGxlZCB3aGVuIHZhbGlkaXR5IHN0YXRlIGZvciBhIGZpZWxkIGlzIGJlaW5nIGNsZWFyZWQKICAgIGNhbGxiYWNrc1siY2xlYXJWYWxpZGl0eSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtYXJrZWQgYXMgaW52YWxpZAogICAgY2FsbGJhY2tzWyJpbnZhbGlkIl0gPSBmdW5jdGlvbihoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZXMgd2hlbiBhIGZpZWxkIGlzIG1hcmtlZCBhIHZhbGlkCiAgICBjYWxsYmFja3NbInZhbGlkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gYWRkIGEgbWVzc2FnZSB0byBhbiBpbnZhbGlkIGZpZWxkCiAgICBjYWxsYmFja3NbImFkZE1lc3NhZ2UiXSA9IGZ1bmN0aW9uKGluZGV4LCBtZXNzYWdlSWQsIG1lc3NhZ2VUZXh0LCBoaWRkZW4pCiAgICB7CiAgICB9OwogICAgLy8gZmlyZWQgdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmb3IgYSBmaWVsZAogICAgY2FsbGJhY2tzWyJyZW1vdmVNZXNzYWdlcyJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKICAgIC8vIGZpcmVkIHdoZW4gYSBidXR0b24gaXMgYmVpbmcgZW5hYmxlZAogICAgY2FsbGJhY2tzWyJlbmFibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB3aGVuIGEgYnV0dG9uIGlzIGJlaW5nIGRpc2FibGVkCiAgICBjYWxsYmFja3NbImRpc2FibGVCdXR0b24iXSA9IGZ1bmN0aW9uKGJ1dHRvbikKICAgIHsKICAgIH07CiAgICAvLyBmaXJlZCB0byBhZGQgb3IgcmVtb3ZlIHRoZSBhcnJheSB0b29sYmFyIGZvciBhIGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5VG9vbGJhciJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmIChyZW1vdmUpCiAgICAgICAgewogICAgICAgICAgICAvLyBzd2FwIGV4aXN0aW5nIHRvb2xiYXIgd2l0aCBhbiBpbnNlcnRpb24gcG9pbnQgbWFya2VyCiAgICAgICAgICAgIHZhciBleGlzdGluZ1Rvb2xiYXIgPSAkKHNlbGYuZ2V0RmllbGRFbCgpKS5maW5kKCIuYWxwYWNhLWFycmF5LXRvb2xiYXJbZGF0YS1hbHBhY2EtYXJyYXktdG9vbGJhci1maWVsZC1pZD0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmdUb29sYmFyLmxlbmd0aCA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludEVsID0gJCgiPGRpdiBjbGFzcz0nIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICInICIgKyBBbHBhY2EuTUFSS0VSX0RBVEFfQVJSQVlfVE9PTEJBUl9GSUVMRF9JRCArICI9JyIgKyBzZWxmLmdldElkKCkgKyAiJz48L2Rpdj4iKTsKCgkJCQlpZiAoc2VsZi5vcHRpb25zLnRvb2xiYXJQb3NpdGlvbiAmJiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uID09PSAiYm90dG9tIikgewoJCQkJCXZhciBjb250YWluZXJMYXN0SXRlbSA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5jaGlsZHJlbigiLmFscGFjYS1jb250YWluZXItaXRlbS1sYXN0Iik7CgkJCQkJaWYgKGNvbnRhaW5lckxhc3RJdGVtLmxlbmd0aCA+IDApewoJCQkJCQljb250YWluZXJMYXN0SXRlbS5hZnRlcihpbnNlcnRpb25Qb2ludEVsKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlleGlzdGluZ1Rvb2xiYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZXhpc3RpbmdUb29sYmFyLmJlZm9yZShpbnNlcnRpb25Qb2ludEVsKTsKCQkJCX0KCQkJCWV4aXN0aW5nVG9vbGJhci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBmaW5kIHRoZSB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRDb250YWluZXJFbCgpKS5maW5kKCIuIiArIEFscGFjYS5NQVJLRVJfQ0xBU1NfQVJSQVlfVE9PTEJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9UT09MQkFSX0ZJRUxEX0lEICsgIj0nIiArIHNlbGYuZ2V0SWQoKSArICInXSIpOwogICAgICAgICAgICBpZiAoaW5zZXJ0aW9uUG9pbnRFbC5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdG9vbGJhcgogICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS10b29sYmFyIiwgc2VsZik7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciB0b29sYmFyID0gQWxwYWNhLnRtcGwodGVtcGxhdGVEZXNjcmlwdG9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25zIjogc2VsZi50b29sYmFyLmFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXJTdHlsZSI6IHNlbGYub3B0aW9ucy50b29sYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sYmFyUG9zaXRpb24iOiBzZWxmLm9wdGlvbnMudG9vbGJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZSh0b29sYmFyKTsKICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIC8vIGZpcmVkIHRvIGFkZCBvciByZW1vdmUgdGhlIGFycmF5IGFjdGlvbmJhcnMgYWxsIGNoaWxkcmVuIG9mIGFuIGFycmF5IGZpZWxkCiAgICBjYWxsYmFja3NbImFycmF5QWN0aW9uYmFycyJdID0gZnVuY3Rpb24ocmVtb3ZlKQogICAgewogICAgICAgIC8vIE5PVEU6IHRoaXMgPSBhcnJheSBmaWVsZAoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIHdhbGsgb3ZlciBhbGwgY2hpbGRyZW4KICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IHNlbGYuY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGRGaWVsZCA9IHNlbGYuY2hpbGRyZW5bY2hpbGRJbmRleF07CiAgICAgICAgICAgIHZhciBjaGlsZEZpZWxkSWQgPSBjaGlsZEZpZWxkLmdldElkKCk7CgogICAgICAgICAgICBpZiAocmVtb3ZlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBleGlzdGluZyBhY3Rpb24gYmFyIGZvciB0aGlzIGNoaWxkCiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSwgcmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggYW4gaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nQWN0aW9uYmFyID0gJChzZWxmLmdldEZpZWxkRWwoKSkuZmluZCgiLmFscGFjYS1hcnJheS1hY3Rpb25iYXJbZGF0YS1hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWZpZWxkLWlkPSciICsgY2hpbGRGaWVsZElkICsgIiddIik7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb25iYXIubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoIjxkaXYgY2xhc3M9JyIgKyBBbHBhY2EuTUFSS0VSX0NMQVNTX0FSUkFZX0lURU1fQUNUSU9OQkFSICsgIicgIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJz48L2Rpdj4iKTsKCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25iYXIuYmVmb3JlKGluc2VydGlvblBvaW50RWwpOwogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uYmFyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IG1hcmtlcgogICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBvbmUsIGJpbmQgaW4gdGhlIGFjdGlvbiB0b29sYmFyCiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnRFbCA9ICQoc2VsZi5nZXRGaWVsZEVsKCkpLmZpbmQoIi4iICsgQWxwYWNhLk1BUktFUl9DTEFTU19BUlJBWV9JVEVNX0FDVElPTkJBUiArICJbIiArIEFscGFjYS5NQVJLRVJfREFUQV9BUlJBWV9JVEVNX0tFWSArICI9JyIgKyBjaGlsZEZpZWxkLm5hbWUgKyAiJ10iKTsKICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25Qb2ludEVsLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGVzY3JpcHRvciA9IHNlbGYudmlldy5nZXRUZW1wbGF0ZURlc2NyaXB0b3IoImNvbnRhaW5lci1hcnJheS1hY3Rpb25iYXIiLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVEZXNjcmlwdG9yKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbmJhciA9IEFscGFjYS50bXBsKHRlbXBsYXRlRGVzY3JpcHRvciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbnMiOiBzZWxmLmFjdGlvbmJhci5hY3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjaGlsZEZpZWxkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50RmllbGRJZCI6IHNlbGYuZ2V0SWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZElkIjogY2hpbGRGaWVsZC5nZXRJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1JbmRleCI6IGNoaWxkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uYmFyU3R5bGUiOiBzZWxmLm9wdGlvbnMuYWN0aW9uYmFyU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlldyI6IHNlbGYudmlldwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLmJlZm9yZShhY3Rpb25iYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkKGluc2VydGlvblBvaW50RWwpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvLyBmaXJlZCBhZnRlciBhIHRleHQgZmllbGQgaXMgZGVlbWVkIHRvIGJlIGF1dG9jb21wbGV0ZS1hYmxlCiAgICBjYWxsYmFja3NbImF1dG9jb21wbGV0ZSJdID0gZnVuY3Rpb24oKQogICAgewogICAgfTsKCgogICAgdmFyIHN0eWxlcyA9IHt9OwogICAgc3R5bGVzWyJidXR0b24iXSA9ICIiOwogICAgc3R5bGVzWyJzbWFsbEJ1dHRvbiJdID0gIiI7CiAgICBzdHlsZXNbImFkZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJyZW1vdmVJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidXBJY29uIl0gPSAiIjsKICAgIHN0eWxlc1siZG93bkljb24iXSA9ICIiOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICIiOwogICAgc3R5bGVzWyJjb2xsYXBzZWRJY29uIl0gPSAiIjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICIiOwoKICAgIEFscGFjYS5yZWdpc3RlclZpZXcoewogICAgICAgICJpZCI6ICJ3ZWItZGlzcGxheSIsCiAgICAgICAgInBhcmVudCI6ICJiYXNlIiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAid2ViIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBkaXNwbGF5IHZpZXciLAogICAgICAgICJkaXNwbGF5UmVhZG9ubHkiOiB0cnVlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiY2FsbGJhY2tzIjogY2FsbGJhY2tzLAogICAgICAgICJzdHlsZXMiOiBzdHlsZXMsCiAgICAgICAgImhvcml6b250YWwiOiBmYWxzZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAid2ViLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogIndlYi1lZGl0IiwKICAgICAgICAicGFyZW50IjogImJhc2UiLAogICAgICAgICJ0eXBlIjogImVkaXQiLAogICAgICAgICJ1aSI6ICJ3ZWIiLAogICAgICAgICJ0aXRsZSI6ICJEZWZhdWx0IEhUTUw1IGVkaXQgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgInRlbXBsYXRlcyI6IHt9LAogICAgICAgICJjYWxsYmFja3MiOiBjYWxsYmFja3MsCiAgICAgICAgInN0eWxlcyI6IHN0eWxlcywKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWVkaXQtaG9yaXpvbnRhbCIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgImhvcml6b250YWwiOiB0cnVlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZSIsCiAgICAgICAgInBhcmVudCI6ICJ3ZWItZWRpdCIsCiAgICAgICAgInR5cGUiOiAiY3JlYXRlIiwKICAgICAgICAidGl0bGUiOiAiRGVmYXVsdCBIVE1MNSBjcmVhdGUgdmlldyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fSwKICAgICAgICAiaG9yaXpvbnRhbCI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAid2ViLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogIndlYi1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKLyoqCiAqIFR3aXR0ZXIgQm9vdHN0cmFwIFRoZW1lICgiYm9vdHN0cmFwIikKICoKICogRGVmaW5lcyB0aGUgQWxwYWNhIHRoZW1lIGZvciBUd2l0dGVyIEJvb3RzdHJhcCB2My4KICoKICogVGhlIHZpZXdzIGFyZToKICoKICogICAgYm9vdHN0cmFwLXZpZXcKICogICAgYm9vdHN0cmFwLWVkaXQKICogICAgYm9vdHN0cmFwLWNyZWF0ZQogKgogKiBUaGlzIHRoZW1lIGNhbiBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZvbGxvd2luZyB2aWV3OgogKgogKiAgICB7CiAqICAgICAgICJ1aSI6ICJib290c3RyYXAiLAogKiAgICAgICAidHlwZSI6ICJ2aWV3IiB8ICJlZGl0IiB8ICJjcmVhdGUiCiAqICAgIH0KICoKICovCihmdW5jdGlvbigkKSB7CgogICAgdmFyIEFscGFjYSA9ICQuYWxwYWNhOwoKICAgIC8vIGN1c3RvbSBzdHlsZXMKICAgIHZhciBzdHlsZXMgPSB7fTsKICAgIHN0eWxlc1siYnV0dG9uIl0gPSAiYnRuIGJ0bi1kZWZhdWx0IjsKICAgIHN0eWxlc1sic21hbGxCdXR0b24iXSA9ICJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIjsKICAgIHN0eWxlc1siYWRkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tcGx1cy1zaWduIjsKICAgIHN0eWxlc1sicmVtb3ZlSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tbWludXMtc2lnbiI7CiAgICBzdHlsZXNbInVwSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCI7CiAgICBzdHlsZXNbImRvd25JY29uIl0gPSAiZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iOwogICAgc3R5bGVzWyJleHBhbmRlZEljb24iXSA9ICJnbHlwaGljb24gZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy1kb3duIjsKICAgIHN0eWxlc1siY29sbGFwc2VkSWNvbiJdID0gImdseXBoaWNvbiBnbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0IjsKICAgIHN0eWxlc1sidGFibGUiXSA9ICJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIjsKCiAgICAvLyBjdXN0b20gY2FsbGJhY2tzCiAgICB2YXIgY2FsbGJhY2tzID0ge307CiAgICBjYWxsYmFja3NbInJlcXVpcmVkIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGZpZWxkRWwgPSB0aGlzLmdldEZpZWxkRWwoKTsKCiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgdmFyIGxhYmVsID0gJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpOwogICAgICAgICQoJzxzcGFuIGNsYXNzPSJhbHBhY2EtaWNvbi1yZXF1aXJlZCBnbHlwaGljb24gZ2x5cGhpY29uLXN0YXIiPjwvc3Bhbj4nKS5wcmVwZW5kVG8obGFiZWwpOwoKICAgIH07CiAgICBjYWxsYmFja3NbImludmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgY29udHJvbCBmaWVsZCwgYWRkIGNsYXNzICJoYXMtZXJyb3IiCiAgICAgICAgaWYgKHRoaXMuaXNDb250cm9sRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIGFkZCBjbGFzcyAiaGFzLWVycm9yIgogICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyRmllbGQpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMuZ2V0RmllbGRFbCgpKS5hZGRDbGFzcygnaGFzLWVycm9yJyk7CiAgICAgICAgfQogICAgICAgICovCgogICAgfTsKICAgIGNhbGxiYWNrc1sidmFsaWQiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyB2YWxpZCBmaWVsZHMgcmVtb3ZlIHRoZSBjbGFzcyAnaGFzLWVycm9yJwogICAgICAgICQodGhpcy5nZXRGaWVsZEVsKCkpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKTsKICAgIH07CiAgICBjYWxsYmFja3NbImNvbnRyb2wiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICAvLyBjb250cm9scyBnZXQgc29tZSBzcGVjaWFsIGZvcm1hdHRpbmcKCiAgICAgICAgLy8gZmllbGRFbAogICAgICAgIHZhciBmaWVsZEVsID0gdGhpcy5nZXRGaWVsZEVsKCk7CgogICAgICAgIC8vIGNvbnRyb2xFbAogICAgICAgIHZhciBjb250cm9sRWwgPSB0aGlzLmdldENvbnRyb2xFbCgpOwoKICAgICAgICAvLyBhbGwgY29udHJvbHMgZ2V0IHRoZSAiZm9ybS1jb250cm9sIiBjbGFzcyBpbmplY3RlZAogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXQiKS5hZGRDbGFzcygiZm9ybS1jb250cm9sIik7CiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJ0ZXh0YXJlYSIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoInNlbGVjdCIpLmFkZENsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1maWxlXSIpLnJlbW92ZUNsYXNzKCJmb3JtLWNvbnRyb2wiKTsKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwoKICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHR5cGUgPT0gY29sb3IsIHJlbW92ZSBmb3JtLWNvbnRyb2wKICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICJjb2xvciIpCiAgICAgICAgewogICAgICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0IikucmVtb3ZlQ2xhc3MoImZvcm0tY29udHJvbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gYW55IGNoZWNrYm94IGlucHV0cyBnZXQgdGhlICJjaGVja2JveCIgY2xhc3Mgb24gdGhlaXIgY2hlY2tib3gKICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9Y2hlY2tib3hdIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoImNoZWNrYm94Iik7CiAgICAgICAgLy8gYW55IHJhZGlvIGlucHV0cyBnZXQgdGhlICJyYWRpbyIgY2xhc3Mgb24gdGhlaXIgcmFkaW8KICAgICAgICAkKGZpZWxkRWwpLmZpbmQoImlucHV0W3R5cGU9cmFkaW9dIikucGFyZW50KCkucGFyZW50KCkuYWRkQ2xhc3MoInJhZGlvIik7CgogICAgICAgIC8vIGlmIGZvcm0gaGFzICJmb3JtLWlubGluZSIgY2xhc3MsIHRoZW4gcmFkaW8gYW5kIGNoZWNrYm94IGxhYmVscyBnZXQgaW5saW5lIGNsYXNzZXMKICAgICAgICBpZiAoJChmaWVsZEVsKS5wYXJlbnRzKCJmb3JtIikuaGFzQ2xhc3MoImZvcm0taW5saW5lIikpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaGVja2JveGVzCiAgICAgICAgICAgICQoZmllbGRFbCkuZmluZCgiaW5wdXRbdHlwZT1jaGVja2JveF0iKS5wYXJlbnQoKS5hZGRDbGFzcygiY2hlY2tib3gtaW5saW5lIik7CgogICAgICAgICAgICAvLyByYWRpb3MKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJpbnB1dFt0eXBlPXJhZGlvXSIpLnBhcmVudCgpLmFkZENsYXNzKCJyYWRpby1pbmxpbmUiKTsKICAgICAgICB9CgogICAgICAgIC8vIGFsbCBjb250cm9sIGxhYmVscyBnZXQgY2xhc3MgImNvbnRyb2wtbGFiZWwiCiAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb250cm9sLWxhYmVsIik7CgogICAgICAgIC8vIGlmIGluIGhvcml6b250YWwgbW9kZSwgYWRkIGEgd3JhcHBlciBkaXYgKGNvbC1zbS05KSBhbmQgbGFiZWwgZ2V0cyAoY29sLXNtLTMpCiAgICAgICAgaWYgKHRoaXMudmlldy5ob3Jpem9udGFsKQogICAgICAgIHsKICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCJsYWJlbC5hbHBhY2EtY29udHJvbC1sYWJlbCIpLmFkZENsYXNzKCJjb2wtc20tMyIpOwoKICAgICAgICAgICAgLy9hbGlnbiBoZWxwIHRleHQgd2l0aCBpbnB1dC4KICAgICAgICAgICAgJChmaWVsZEVsKS5maW5kKCIuaGVscC1ibG9jayIpLmFkZENsYXNzKCJjb2wtc20tb2Zmc2V0LTMgY29sLXNtLTkiKTsKCiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gJCgiPGRpdj48L2Rpdj4iKTsKICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygiY29sLXNtLTkiKTsKCiAgICAgICAgICAgICQoY29udHJvbEVsKS5hZnRlcih3cmFwcGVyKTsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmQoY29udHJvbEVsKTsKCiAgICAgICAgICAgICQoZmllbGRFbCkuYXBwZW5kKCI8ZGl2IHN0eWxlPSdjbGVhcjpib3RoOyc+PC9kaXY+Iik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siY29udGFpbmVyIl0gPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsID0gdGhpcy5nZXRDb250YWluZXJFbCgpOwoKICAgICAgICBpZiAodGhpcy52aWV3Lmhvcml6b250YWwpCiAgICAgICAgewogICAgICAgICAgICAkKGNvbnRhaW5lckVsKS5hZGRDbGFzcygiZm9ybS1ob3Jpem9udGFsIik7CiAgICAgICAgfQogICAgfTsKICAgIGNhbGxiYWNrc1siZm9ybSJdID0gZnVuY3Rpb24oKQogICAgewogICAgICAgIHZhciBmb3JtRWwgPSB0aGlzLmdldEZvcm1FbCgpOwoKICAgICAgICAvLyB1c2UgcHVsbC1yaWdodCBmb3IgZm9ybSBidXR0b25zCiAgICAgICAgLy8kKGZvcm1FbCkuZmluZCgiLmFscGFjYS1mb3JtLWJ1dHRvbnMtY29udGFpbmVyIikuYWRkQ2xhc3MoInB1bGwtcmlnaHQiKTsKICAgIH07CiAgICBjYWxsYmFja3NbImVuYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siZGlzYWJsZUJ1dHRvbiJdID0gZnVuY3Rpb24oYnV0dG9uKQogICAgewogICAgICAgICQoYnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfTsKICAgIGNhbGxiYWNrc1siY29sbGFwc2libGUiXSA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgZmllbGRFbCA9IHRoaXMuZ2V0RmllbGRFbCgpOwogICAgICAgIHZhciBsZWdlbmRFbCA9ICQoZmllbGRFbCkuZmluZCgibGVnZW5kIikuZmlyc3QoKTsKICAgICAgICB2YXIgYW5jaG9yRWwgPSAkKCJbZGF0YS10b2dnbGU9J2NvbGxhcHNlJ10iLCBsZWdlbmRFbCk7CiAgICAgICAgaWYgKCQoYW5jaG9yRWwpLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgY29udGFpbmVyRWwgPSB0aGlzLmdldENvbnRhaW5lckVsKCk7CgogICAgICAgICAgICAvLyBjb250YWluZXIgaWQKICAgICAgICAgICAgdmFyIGlkID0gJChjb250YWluZXJFbCkuYXR0cigiaWQiKTsKICAgICAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICAgICAgaWQgPSBBbHBhY2EuZ2VuZXJhdGVJZCgpOwogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYXR0cigiaWQiLCBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBjb250YWluZXIgdG8gYmUgY29sbGFwc2libGUKICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImNvbGxhcHNlIik7CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbGxhcHNlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJChjb250YWluZXJFbCkuYWRkQ2xhc3MoImluIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCB1cCBsZWdlbmQgYW5jaG9yCiAgICAgICAgICAgIGlmICghJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiKSkgewogICAgICAgICAgICAgICAgJChhbmNob3JFbCkuYXR0cigiZGF0YS10YXJnZXQiLCAiIyIgKyBpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoYW5jaG9yRWwpLm1vdXNlb3ZlcihmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwoKICAgIC8vIHRhYmxlLWNvbnRyb2wgY2FsbGJhY2tzCiAgICBjYWxsYmFja3NbInRhYmxlSGVhZGVyUmVxdWlyZWQiXSA9IGZ1bmN0aW9uKHNjaGVtYSwgb3B0aW9ucywgZG9tRWwpCiAgICB7CiAgICAgICAgLy8gcmVxdWlyZWQgZmllbGRzIGdldCBhIGxpdHRsZSBzdGFyIGluIHRoZWlyIGxhYmVsCiAgICAgICAgJCgnPHNwYW4gY2xhc3M9ImFscGFjYS1pY29uLXJlcXVpcmVkIGdseXBoaWNvbiBnbHlwaGljb24tc3RhciI+PC9zcGFuPicpLnByZXBlbmRUbyhkb21FbCk7CgogICAgfTsKICAgIGNhbGxiYWNrc1sidGFibGVIZWFkZXJPcHRpb25hbCJdID0gZnVuY3Rpb24oc2NoZW1hLCBvcHRpb25zLCBkb21FbCkKICAgIHsKICAgIH07CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5IiwKICAgICAgICAicGFyZW50IjogIndlYi1kaXNwbGF5IiwKICAgICAgICAidHlwZSI6ICJkaXNwbGF5IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRGlzcGxheSBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1kaXNwbGF5LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWRpc3BsYXkiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0IiwKICAgICAgICAicGFyZW50IjogIndlYi1lZGl0IiwKICAgICAgICAidHlwZSI6ICJlZGl0IiwKICAgICAgICAidWkiOiAiYm9vdHN0cmFwIiwKICAgICAgICAidGl0bGUiOiAiRWRpdCBWaWV3IGZvciBCb290c3RyYXAgMyIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IHRydWUsCiAgICAgICAgImNhbGxiYWNrcyI6IGNhbGxiYWNrcywKICAgICAgICAic3R5bGVzIjogc3R5bGVzLAogICAgICAgICJ0ZW1wbGF0ZXMiOiB7fQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1lZGl0LWhvcml6b250YWwiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7CgogICAgQWxwYWNhLnJlZ2lzdGVyVmlldyh7CiAgICAgICAgImlkIjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJwYXJlbnQiOiAiYm9vdHN0cmFwLWVkaXQiLAogICAgICAgICJ0aXRsZSI6ICJDcmVhdGUgVmlldyBmb3IgQm9vdHN0cmFwIDMiLAogICAgICAgICJ0eXBlIjogImNyZWF0ZSIsCiAgICAgICAgImRpc3BsYXlSZWFkb25seSI6IGZhbHNlCiAgICB9KTsKCiAgICBBbHBhY2EucmVnaXN0ZXJWaWV3KHsKICAgICAgICAiaWQiOiAiYm9vdHN0cmFwLWNyZWF0ZS1ob3Jpem9udGFsIiwKICAgICAgICAicGFyZW50IjogImJvb3RzdHJhcC1jcmVhdGUiLAogICAgICAgICJob3Jpem9udGFsIjogdHJ1ZQogICAgfSk7Cgp9KShqUXVlcnkpOwoKICAgICAgICAKICAgICAgICAgICAgQWxwYWNhLmRlZmF1bHRWaWV3ID0gJ2Jvb3RzdHJhcCc7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIEFscGFjYTsKCiAgICAKCn0pKTsK</File> | |
| 54 | + <File Location="var/httpd/htdocs/js/thirdparty/alpaca/handlebars.js" Permission="644" Encode="Base64">LyohCgogaGFuZGxlYmFycyB2NC4wLjUKCkNvcHlyaWdodCAoQykgMjAxMS0yMDE1IGJ5IFllaHVkYSBLYXR6CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKQGxpY2Vuc2UKKi8KKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHsKCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQoJCWRlZmluZShbXSwgZmFjdG9yeSk7CgllbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykKCQlleHBvcnRzWyJIYW5kbGViYXJzIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiSGFuZGxlYmFycyJdID0gZmFjdG9yeSgpOwp9KSh0aGlzLCBmdW5jdGlvbigpIHsKcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXAKLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CgovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKCi8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwoKLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJZXhwb3J0czoge30sCi8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQovKioqKioqLyAJCX07CgovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmxvYWRlZCA9IHRydWU7CgovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQoKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKCi8qKioqKiovIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsKCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CgovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsKLyoqKioqKi8gfSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gKFsKLyogMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKCgl2YXIgX2hhbmRsZWJhcnNSdW50aW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNSdW50aW1lKTsKCgkvLyBDb21waWxlciBpbXBvcnRzCgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJBc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckFzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzQ29tcGlsZXJBc3QpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTsKCgl2YXIgX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpOwoKCXZhciBfaGFuZGxlYmFyc0NvbXBpbGVySmF2YXNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlckphdmFzY3JpcHRDb21waWxlcik7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7CgoJdmFyIF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNDb21waWxlclZpc2l0b3IpOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKCgl2YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTsKCgl2YXIgX2NyZWF0ZSA9IF9oYW5kbGViYXJzUnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7CglmdW5jdGlvbiBjcmVhdGUoKSB7CgkgIHZhciBoYiA9IF9jcmVhdGUoKTsKCgkgIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKCSAgICByZXR1cm4gX2hhbmRsZWJhcnNDb21waWxlckNvbXBpbGVyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGhiKTsKCSAgfTsKCSAgaGIucHJlY29tcGlsZSA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykgewoJICAgIHJldHVybiBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwoJICB9OwoKCSAgaGIuQVNUID0gX2hhbmRsZWJhcnNDb21waWxlckFzdDJbJ2RlZmF1bHQnXTsKCSAgaGIuQ29tcGlsZXIgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQ29tcGlsZXIuQ29tcGlsZXI7CgkgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJKYXZhc2NyaXB0Q29tcGlsZXIyWydkZWZhdWx0J107CgkgIGhiLlBhcnNlciA9IF9oYW5kbGViYXJzQ29tcGlsZXJCYXNlLnBhcnNlcjsKCSAgaGIucGFyc2UgPSBfaGFuZGxlYmFyc0NvbXBpbGVyQmFzZS5wYXJzZTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3QuVmlzaXRvciA9IF9oYW5kbGViYXJzQ29tcGlsZXJWaXNpdG9yMlsnZGVmYXVsdCddOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogewoJICAgICJkZWZhdWx0Ijogb2JqCgkgIH07Cgl9OwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgovKioqLyB9LAovKiAyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpWydkZWZhdWx0J107CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2hhbmRsZWJhcnNCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7CgoJLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLgoJLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cykKCgl2YXIgX2hhbmRsZWJhcnNTYWZlU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgoJdmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7CgoJdmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTsKCgl2YXIgX2hhbmRsZWJhcnNFeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc0V4Y2VwdGlvbik7CgoJdmFyIF9oYW5kbGViYXJzVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzVXRpbHMpOwoKCXZhciBfaGFuZGxlYmFyc1J1bnRpbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKCgl2YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzUnVudGltZSk7CgoJdmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjApOwoKCXZhciBfaGFuZGxlYmFyc05vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFuZGxlYmFyc05vQ29uZmxpY3QpOwoKCS8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQoJZnVuY3Rpb24gY3JlYXRlKCkgewoJICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTsKCgkgIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7CgkgIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107CgkgIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddOwoJICBoYi5VdGlscyA9IFV0aWxzOwoJICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjsKCgkgIGhiLlZNID0gcnVudGltZTsKCSAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykgewoJICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTsKCSAgfTsKCgkgIHJldHVybiBoYjsKCX0KCgl2YXIgaW5zdCA9IGNyZWF0ZSgpOwoJaW5zdC5jcmVhdGUgPSBjcmVhdGU7CgoJX2hhbmRsZWJhcnNOb0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpOwoKCWluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkidXNlIHN0cmljdCI7CgoJZXhwb3J0c1siZGVmYXVsdCJdID0gZnVuY3Rpb24gKG9iaikgewoJICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CgkgICAgcmV0dXJuIG9iajsKCSAgfSBlbHNlIHsKCSAgICB2YXIgbmV3T2JqID0ge307CgoJICAgIGlmIChvYmogIT0gbnVsbCkgewoJICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewoJICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIG5ld09ialsiZGVmYXVsdCJdID0gb2JqOwoJICAgIHJldHVybiBuZXdPYmo7CgkgIH0KCX07CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCi8qKiovIH0sCi8qIDQgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2hlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpOwoKCXZhciBfZGVjb3JhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwoKCXZhciBfbG9nZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7CgoJdmFyIF9sb2dnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9nZ2VyKTsKCgl2YXIgVkVSU0lPTiA9ICc0LjAuNSc7CglleHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OOwoJdmFyIENPTVBJTEVSX1JFVklTSU9OID0gNzsKCglleHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047Cgl2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHsKCSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKCSAgMjogJz09IDEuMC4wLXJjLjMnLAoJICAzOiAnPT0gMS4wLjAtcmMuNCcsCgkgIDQ6ICc9PSAxLngueCcsCgkgIDU6ICc9PSAyLjAuMC1hbHBoYS54JywKCSAgNjogJz49IDIuMC4wLWJldGEuMScsCgkgIDc6ICc+PSA0LjAuMCcKCX07CgoJZXhwb3J0cy5SRVZJU0lPTl9DSEFOR0VTID0gUkVWSVNJT05fQ0hBTkdFUzsKCXZhciBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7CgoJZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7CgkgIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307CgkgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKCSAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTsKCgkgIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7CgkgIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7Cgl9CgoJSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCwKCgkgIGxvZ2dlcjogX2xvZ2dlcjJbJ2RlZmF1bHQnXSwKCSAgbG9nOiBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZywKCgkgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgaWYgKGZuKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsKCSAgICAgIH0KCSAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHsKCSAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiByZWdpc3RlclBhcnRpYWwobmFtZSwgcGFydGlhbCkgewoJICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgewoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTsKCSAgICB9IGVsc2UgewoJICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkICInICsgbmFtZSArICciIGFzIHVuZGVmaW5lZCcpOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7CgkgICAgfQoJICB9LAoJICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdOwoJICB9LAoKCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUsIGZuKSB7CgkgICAgaWYgKF91dGlscy50b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7CgkgICAgICBpZiAoZm4pIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOwoJICAgICAgfQoJICAgICAgX3V0aWxzLmV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjsKCSAgICB9CgkgIH0sCgkgIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHVucmVnaXN0ZXJEZWNvcmF0b3IobmFtZSkgewoJICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07CgkgIH0KCX07CgoJdmFyIGxvZyA9IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nOwoKCWV4cG9ydHMubG9nID0gbG9nOwoJZXhwb3J0cy5jcmVhdGVGcmFtZSA9IF91dGlscy5jcmVhdGVGcmFtZTsKCWV4cG9ydHMubG9nZ2VyID0gX2xvZ2dlcjJbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmV4dGVuZCA9IGV4dGVuZDsKCWV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7CglleHBvcnRzLmVzY2FwZUV4cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uOwoJZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTsKCWV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTsKCWV4cG9ydHMuYmxvY2tQYXJhbXMgPSBibG9ja1BhcmFtczsKCWV4cG9ydHMuYXBwZW5kQ29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aDsKCXZhciBlc2NhcGUgPSB7CgkgICcmJzogJyZhbXA7JywKCSAgJzwnOiAnJmx0OycsCgkgICc+JzogJyZndDsnLAoJICAnIic6ICcmcXVvdDsnLAoJICAiJyI6ICcmI3gyNzsnLAoJICAnYCc6ICcmI3g2MDsnLAoJICAnPSc6ICcmI3gzRDsnCgl9OwoKCXZhciBiYWRDaGFycyA9IC9bJjw+IidgPV0vZywKCSAgICBwb3NzaWJsZSA9IC9bJjw+IidgPV0vOwoKCWZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7CgkgIHJldHVybiBlc2NhcGVbY2hyXTsKCX0KCglmdW5jdGlvbiBleHRlbmQob2JqIC8qICwgLi4uc291cmNlICovKSB7CgkgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkgewoJICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHsKCSAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCgkgIHJldHVybiBvYmo7Cgl9CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCglleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7CgkvLyBTb3VyY2VkIGZyb20gbG9kYXNoCgkvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CgkvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovCgl2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKCSAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzsKCX07CgkvLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCglpZiAoaXNGdW5jdGlvbigveC8pKSB7CgkgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKCSAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwoJICB9OwoJfQoJZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKCgkvKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi8KCgkvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkgewoJICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7Cgl9OwoKCWV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CgkvLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LgoKCWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7CgkgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKCSAgICAgIHJldHVybiBpOwoJICAgIH0KCSAgfQoJICByZXR1cm4gLTE7Cgl9CgoJZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKCSAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CgkgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZQoJICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkgewoJICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTsKCSAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7CgkgICAgICByZXR1cm4gJyc7CgkgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CgkgICAgICByZXR1cm4gc3RyaW5nICsgJyc7CgkgICAgfQoKCSAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQKCSAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKCSAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KCSAgICBzdHJpbmcgPSAnJyArIHN0cmluZzsKCSAgfQoKCSAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKCSAgICByZXR1cm4gc3RyaW5nOwoJICB9CgkgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cgl9CgoJZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewoJICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CgkgICAgcmV0dXJuIHRydWU7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIGZhbHNlOwoJICB9Cgl9CgoJZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7CgkgIHZhciBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTsKCSAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDsKCSAgcmV0dXJuIGZyYW1lOwoJfQoKCWZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7CgkgIHBhcmFtcy5wYXRoID0gaWRzOwoJICByZXR1cm4gcGFyYW1zOwoJfQoKCWZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkgewoJICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDsKCX0KCi8qKiovIH0sCi8qIDYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwoKCWZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7CgkgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jLAoJICAgICAgbGluZSA9IHVuZGVmaW5lZCwKCSAgICAgIGNvbHVtbiA9IHVuZGVmaW5lZDsKCSAgaWYgKGxvYykgewoJICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTsKCSAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uOwoKCSAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjsKCSAgfQoKCSAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpOwoKCSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCgkgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewoJICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwoJICB9CgoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHsKCSAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pOwoJICB9CgoJICBpZiAobG9jKSB7CgkgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKCSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKCSAgfQoJfQoKCUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMgPSByZWdpc3RlckRlZmF1bHRIZWxwZXJzOwoKCXZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7CgoJdmFyIF9oZWxwZXJzQmxvY2tIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcpOwoKCXZhciBfaGVscGVyc0VhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwoKCXZhciBfaGVscGVyc0VhY2gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0VhY2gpOwoKCXZhciBfaGVscGVyc0hlbHBlck1pc3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTsKCgl2YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTsKCgl2YXIgX2hlbHBlcnNJZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwoKCXZhciBfaGVscGVyc0lmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNJZik7CgoJdmFyIF9oZWxwZXJzTG9nID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CgoJdmFyIF9oZWxwZXJzTG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb2cpOwoKCXZhciBfaGVscGVyc0xvb2t1cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpOwoKCXZhciBfaGVscGVyc0xvb2t1cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzTG9va3VwKTsKCgl2YXIgX2hlbHBlcnNXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CgoJdmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7CgoJZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkgewoJICBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzRWFjaDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSGVscGVyTWlzc2luZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzSWYyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJICBfaGVscGVyc0xvZzJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7CgkgIF9oZWxwZXJzTG9va3VwMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCSAgX2hlbHBlcnNXaXRoMlsnZGVmYXVsdCddKGluc3RhbmNlKTsKCX0KCi8qKiovIH0sCi8qIDggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAoJICAgICAgICBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7CgkgICAgICByZXR1cm4gZm4odGhpcyk7CgkgICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHsKCSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHsKCSAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHsKCSAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTsKCSAgICAgICAgfQoKCSAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7CgkgICAgICAgIHZhciBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpOwoJICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIH0KCSAgfSk7Cgl9OwoKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmICghb3B0aW9ucykgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpOwoJICAgIH0KCgkgICAgdmFyIGZuID0gb3B0aW9ucy5mbiwKCSAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKCSAgICAgICAgaSA9IDAsCgkgICAgICAgIHJldCA9ICcnLAoJICAgICAgICBkYXRhID0gdW5kZWZpbmVkLAoJICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7CgkgICAgfQoKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29udGV4dCkpIHsKCSAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICBpZiAob3B0aW9ucy5kYXRhKSB7CgkgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgfQoKCSAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkgewoJICAgICAgaWYgKGRhdGEpIHsKCSAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDsKCSAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4OwoJICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7CgkgICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDsKCgkgICAgICAgIGlmIChjb250ZXh0UGF0aCkgewoJICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkOwoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKQoJICAgICAgfSk7CgkgICAgfQoKCSAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHsKCSAgICAgIGlmIChfdXRpbHMuaXNBcnJheShjb250ZXh0KSkgewoJICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKCSAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7CgkgICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7CgoJICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkgewoJICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKCSAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdAoJICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZQoJICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS4KCSAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7CgkgICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5OwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGkgPT09IDApIHsKCSAgICAgIHJldCA9IGludmVyc2UodGhpcyk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSAvKiBbYXJncywgXW9wdGlvbnMgKi97CgkgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKCSAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3RydWN0LgoJICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCSAgICB9IGVsc2UgewoJICAgICAgLy8gU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8gY2FsbCBzb21ldGhpbmcsIGJsb3cgdXAuCgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTWlzc2luZyBoZWxwZXI6ICInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJyInKTsKCSAgICB9CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDExICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHsKCSAgICBpZiAoX3V0aWxzLmlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7CgkgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7CgkgICAgfQoKCSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCgkgICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGUKCSAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgoJICAgIGlmICghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCB8fCBfdXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOwoJICAgIH0KCSAgfSk7CgoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CgkgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwgeyBmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2ggfSk7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDEyICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkgewoJICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKCkgLyogbWVzc2FnZSwgb3B0aW9ucyAqL3sKCSAgICB2YXIgYXJncyA9IFt1bmRlZmluZWRdLAoJICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHsKCSAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwoJICAgIH0KCgkgICAgdmFyIGxldmVsID0gMTsKCSAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHsKCSAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsOwoJICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7CgkgICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDsKCSAgICB9CgkgICAgYXJnc1swXSA9IGxldmVsOwoKCSAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxMyAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7CgkgICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdOwoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKCSAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkgewoJICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsKCSAgICB9CgoJICAgIHZhciBmbiA9IG9wdGlvbnMuZm47CgoJICAgIGlmICghX3V0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKCSAgICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhOwoJICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykgewoJICAgICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CgkgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBfdXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7CgkgICAgICB9CgoJICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHsKCSAgICAgICAgZGF0YTogZGF0YSwKCSAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKQoJICAgICAgfSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CgkgICAgfQoJICB9KTsKCX07CgoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxNSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyA9IHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnM7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CgoJdmFyIF9kZWNvcmF0b3JzSW5saW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlY29yYXRvcnNJbmxpbmUpOwoKCWZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHsKCSAgX2RlY29yYXRvcnNJbmxpbmUyWydkZWZhdWx0J10oaW5zdGFuY2UpOwoJfQoKLyoqKi8gfSwKLyogMTYgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7CgkgIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbiAoZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHsKCSAgICB2YXIgcmV0ID0gZm47CgkgICAgaWYgKCFwcm9wcy5wYXJ0aWFscykgewoJICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTsKCSAgICAgIHJldCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7CgkgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLgoJICAgICAgICB2YXIgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7CgkgICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IF91dGlscy5leHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7CgkgICAgICAgIHZhciByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTsKCSAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7CgkgICAgICAgIHJldHVybiByZXQ7CgkgICAgICB9OwoJICAgIH0KCgkgICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47CgoJICAgIHJldHVybiByZXQ7CgkgIH0pOwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0sCi8qIDE3ICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoKCXZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwoKCXZhciBsb2dnZXIgPSB7CgkgIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSwKCSAgbGV2ZWw6ICdpbmZvJywKCgkgIC8vIE1hcHMgYSBnaXZlbiBsZXZlbCB2YWx1ZSB0byB0aGUgYG1ldGhvZE1hcGAgaW5kZXhlcyBhYm92ZS4KCSAgbG9va3VwTGV2ZWw6IGZ1bmN0aW9uIGxvb2t1cExldmVsKGxldmVsKSB7CgkgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3N0cmluZycpIHsKCSAgICAgIHZhciBsZXZlbE1hcCA9IF91dGlscy5pbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpOwoJICAgICAgaWYgKGxldmVsTWFwID49IDApIHsKCSAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHJldHVybiBsZXZlbDsKCSAgfSwKCgkgIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CgkgIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsKSB7CgkgICAgbGV2ZWwgPSBsb2dnZXIubG9va3VwTGV2ZWwobGV2ZWwpOwoKCSAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7CgkgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CgkgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgewoJICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGUKCSAgICAgICAgbWV0aG9kID0gJ2xvZyc7CgkgICAgICB9CgoJICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CgkgICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwoJICAgICAgfQoKCSAgICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBtZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCgkgICAgfQoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGxvZ2dlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMTggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7CgoJLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGUKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHsKCSAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cgl9CgoJU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7CgkgIHJldHVybiAnJyArIHRoaXMuc3RyaW5nOwoJfTsKCglleHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAxOSAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CglleHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uOwoJZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwoJZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtOwoJZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsOwoJZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDsKCWV4cG9ydHMubm9vcCA9IG5vb3A7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX2Jhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwoKCWZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7CgkgIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLAoJICAgICAgY3VycmVudFJldmlzaW9uID0gX2Jhc2UuQ09NUElMRVJfUkVWSVNJT047CgoJICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7CgkgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKCSAgICAgIHZhciBydW50aW1lVmVyc2lvbnMgPSBfYmFzZS5SRVZJU0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCgkgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7CgkgICAgfQoJICB9Cgl9CgoJZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKCFlbnYpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7CgkgIH0KCSAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7CgkgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7CgkgIH0KCgkgIHRlbXBsYXRlU3BlYy5tYWluLmRlY29yYXRvciA9IHRlbXBsYXRlU3BlYy5tYWluX2Q7CgoJICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvdwoJICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLgoJICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpOwoKCSAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykgewoJICAgIGlmIChvcHRpb25zLmhhc2gpIHsKCSAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7CgkgICAgICBpZiAob3B0aW9ucy5pZHMpIHsKCSAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoJICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpOwoKCSAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7CgkgICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7CgkgICAgfQoJICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoJICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7CgkgICAgICAgIHZhciBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXG4nKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICB9CgoJICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTsKCSAgICAgICAgfQoJICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcbicpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUnKTsKCSAgICB9CgkgIH0KCgkgIC8vIEp1c3QgYWRkIHdhdGVyCgkgIHZhciBjb250YWluZXIgPSB7CgkgICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7CgkgICAgICBpZiAoIShuYW1lIGluIG9iaikpIHsKCSAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyInICsgbmFtZSArICciIG5vdCBkZWZpbmVkIGluICcgKyBvYmopOwoJICAgICAgfQoJICAgICAgcmV0dXJuIG9ialtuYW1lXTsKCSAgICB9LAoJICAgIGxvb2t1cDogZnVuY3Rpb24gbG9va3VwKGRlcHRocywgbmFtZSkgewoJICAgICAgdmFyIGxlbiA9IGRlcHRocy5sZW5ndGg7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHsKCSAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSwKCSAgICBsYW1iZGE6IGZ1bmN0aW9uIGxhbWJkYShjdXJyZW50LCBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50OwoJICAgIH0sCgoJICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCgkgICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsCgoJICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7CgkgICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldOwoJICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0sCgoJICAgIHByb2dyYW1zOiBbXSwKCSAgICBwcm9ncmFtOiBmdW5jdGlvbiBwcm9ncmFtKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHsKCSAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sCgkgICAgICAgICAgZm4gPSB0aGlzLmZuKGkpOwoJICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7CgkgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewoJICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7CgkgICAgICB9CgkgICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7CgkgICAgfSwKCgkgICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHsKCSAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7CgkgICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9LAoJICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7CgkgICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uOwoKCSAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikgewoJICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pOwoJICAgICAgfQoKCSAgICAgIHJldHVybiBvYmo7CgkgICAgfSwKCgkgICAgbm9vcDogZW52LlZNLm5vb3AsCgkgICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXIKCSAgfTsKCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7CgkgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKCgkgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7CgoJICAgIHJldC5fc2V0dXAob3B0aW9ucyk7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHsKCSAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTsKCSAgICB9CgkgICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCwKCSAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDsKCSAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykgewoJICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7CgkgICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRoczsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7CgkgICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIH0KCSAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTsKCSAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTsKCSAgfQoJICByZXQuaXNUb3AgPSB0cnVlOwoKCSAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgkgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKCSAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpOwoKCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkgewoJICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTsKCSAgICAgIH0KCSAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykgewoJICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7CgkgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOwoJICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7CgkgICAgfQoJICB9OwoKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpOwoJICAgIH0KCgkgICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgIGZ1bmN0aW9uIHByb2coY29udGV4dCkgewoJICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07CgoJICAgIHZhciBjdXJyZW50RGVwdGhzID0gZGVwdGhzOwoJICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPT0gZGVwdGhzWzBdKSB7CgkgICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpOwoJICAgIH0KCgkgICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTsKCSAgfQoKCSAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpOwoKCSAgcHJvZy5wcm9ncmFtID0gaTsKCSAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwOwoJICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwOwoJICByZXR1cm4gcHJvZzsKCX0KCglmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7CgkgIGlmICghcGFydGlhbCkgewoJICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHsKCSAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTsKCSAgICB9IGVsc2UgewoJICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7CgkgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nCgkgICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDsKCSAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTsKCSAgfQoJICByZXR1cm4gcGFydGlhbDsKCX0KCglmdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHsKCSAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTsKCSAgaWYgKG9wdGlvbnMuaWRzKSB7CgkgICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoOwoJICB9CgoJICB2YXIgcGFydGlhbEJsb2NrID0gdW5kZWZpbmVkOwoJICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKCSAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47CgoJICAgIGlmIChwYXJ0aWFsQmxvY2sucGFydGlhbHMpIHsKCSAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIHBhcnRpYWxCbG9jay5wYXJ0aWFscyk7CgkgICAgfQoJICB9CgoJICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykgewoJICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7CgkgIH0KCgkgIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7CgkgIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CgkgICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7CgkgIH0KCX0KCglmdW5jdGlvbiBub29wKCkgewoJICByZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkgewoJICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHsKCSAgICBkYXRhID0gZGF0YSA/IF9iYXNlLmNyZWF0ZUZyYW1lKGRhdGEpIDoge307CgkgICAgZGF0YS5yb290ID0gY29udGV4dDsKCSAgfQoJICByZXR1cm4gZGF0YTsKCX0KCglmdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7CgkgIGlmIChmbi5kZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvcHMgPSB7fTsKCSAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpOwoJICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7CgkgIH0KCSAgcmV0dXJuIHByb2c7Cgl9CgovKioqLyB9LAovKiAyMCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCgkvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7LyogZ2xvYmFsIHdpbmRvdyAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdywKCSAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzOwoJICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykgewoJICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7CgkgICAgfQoJICAgIHJldHVybiBIYW5kbGViYXJzOwoJICB9OwoJfTsKCgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCS8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KCkpKSkKCi8qKiovIH0sCi8qIDIxICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCSd1c2Ugc3RyaWN0JzsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJdmFyIEFTVCA9IHsKCSAgLy8gUHVibGljIEFQSSB1c2VkIHRvIGV2YWx1YXRlIGRlcml2ZWQgYXR0cmlidXRlcyByZWdhcmRpbmcgQVNUIG5vZGVzCgkgIGhlbHBlcnM6IHsKCSAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CgkgICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAoJICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3IgaGFzaCBzZWdtZW50CgkgICAgaGVscGVyRXhwcmVzc2lvbjogZnVuY3Rpb24gaGVscGVyRXhwcmVzc2lvbihub2RlKSB7CgkgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbicgfHwgKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmICEhKG5vZGUucGFyYW1zICYmIG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpOwoJICAgIH0sCgoJICAgIHNjb3BlZElkOiBmdW5jdGlvbiBzY29wZWRJZChwYXRoKSB7CgkgICAgICByZXR1cm4gKC9eXC58dGhpc1xiLy50ZXN0KHBhdGgub3JpZ2luYWwpCgkgICAgICApOwoJICAgIH0sCgoJICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKCSAgICAvLyBgLi5gIG9yIGB0aGlzYC4KCSAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkgewoJICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDsKCSAgICB9CgkgIH0KCX07CgoJLy8gTXVzdCBiZSBleHBvcnRlZCBhcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBhcyB0aGUgamlzb24gbGV4ZXIKCS8vIG11c3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFTVDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjIgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IF9fd2VicGFja19yZXF1aXJlX18oMylbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5wYXJzZSA9IHBhcnNlOwoKCXZhciBfcGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CgoJdmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VyKTsKCgl2YXIgX3doaXRlc3BhY2VDb250cm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7CgoJdmFyIF93aGl0ZXNwYWNlQ29udHJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93aGl0ZXNwYWNlQ29udHJvbCk7CgoJdmFyIF9oZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7CgoJdmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGVscGVycyk7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddOwoKCXZhciB5eSA9IHt9OwoJX3V0aWxzLmV4dGVuZCh5eSwgSGVscGVycyk7CgoJZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHsKCSAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi4KCSAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykgewoJICAgIHJldHVybiBpbnB1dDsKCSAgfQoKCSAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5OwoKCSAgLy8gQWx0ZXJpbmcgdGhlIHNoYXJlZCBvYmplY3QgaGVyZSwgYnV0IHRoaXMgaXMgb2sgYXMgcGFyc2VyIGlzIGEgc3luYyBvcGVyYXRpb24KCSAgeXkubG9jSW5mbyA9IGZ1bmN0aW9uIChsb2NJbmZvKSB7CgkgICAgcmV0dXJuIG5ldyB5eS5Tb3VyY2VMb2NhdGlvbihvcHRpb25zICYmIG9wdGlvbnMuc3JjTmFtZSwgbG9jSW5mbyk7CgkgIH07CgoJICB2YXIgc3RyaXAgPSBuZXcgX3doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKG9wdGlvbnMpOwoJICByZXR1cm4gc3RyaXAuYWNjZXB0KF9wYXJzZXIyWydkZWZhdWx0J10ucGFyc2UoaW5wdXQpKTsKCX0KCi8qKiovIH0sCi8qIDIzICovCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKCS8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCgkidXNlIHN0cmljdCI7CgoJdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LAoJICAgICAgICB5eToge30sCgkgICAgICAgIHN5bWJvbHNfOiB7ICJlcnJvciI6IDIsICJyb290IjogMywgInByb2dyYW0iOiA0LCAiRU9GIjogNSwgInByb2dyYW1fcmVwZXRpdGlvbjAiOiA2LCAic3RhdGVtZW50IjogNywgIm11c3RhY2hlIjogOCwgImJsb2NrIjogOSwgInJhd0Jsb2NrIjogMTAsICJwYXJ0aWFsIjogMTEsICJwYXJ0aWFsQmxvY2siOiAxMiwgImNvbnRlbnQiOiAxMywgIkNPTU1FTlQiOiAxNCwgIkNPTlRFTlQiOiAxNSwgIm9wZW5SYXdCbG9jayI6IDE2LCAicmF3QmxvY2tfcmVwZXRpdGlvbl9wbHVzMCI6IDE3LCAiRU5EX1JBV19CTE9DSyI6IDE4LCAiT1BFTl9SQVdfQkxPQ0siOiAxOSwgImhlbHBlck5hbWUiOiAyMCwgIm9wZW5SYXdCbG9ja19yZXBldGl0aW9uMCI6IDIxLCAib3BlblJhd0Jsb2NrX29wdGlvbjAiOiAyMiwgIkNMT1NFX1JBV19CTE9DSyI6IDIzLCAib3BlbkJsb2NrIjogMjQsICJibG9ja19vcHRpb24wIjogMjUsICJjbG9zZUJsb2NrIjogMjYsICJvcGVuSW52ZXJzZSI6IDI3LCAiYmxvY2tfb3B0aW9uMSI6IDI4LCAiT1BFTl9CTE9DSyI6IDI5LCAib3BlbkJsb2NrX3JlcGV0aXRpb24wIjogMzAsICJvcGVuQmxvY2tfb3B0aW9uMCI6IDMxLCAib3BlbkJsb2NrX29wdGlvbjEiOiAzMiwgIkNMT1NFIjogMzMsICJPUEVOX0lOVkVSU0UiOiAzNCwgIm9wZW5JbnZlcnNlX3JlcGV0aXRpb24wIjogMzUsICJvcGVuSW52ZXJzZV9vcHRpb24wIjogMzYsICJvcGVuSW52ZXJzZV9vcHRpb24xIjogMzcsICJvcGVuSW52ZXJzZUNoYWluIjogMzgsICJPUEVOX0lOVkVSU0VfQ0hBSU4iOiAzOSwgIm9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjAiOiA0MCwgIm9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQxLCAib3BlbkludmVyc2VDaGFpbl9vcHRpb24xIjogNDIsICJpbnZlcnNlQW5kUHJvZ3JhbSI6IDQzLCAiSU5WRVJTRSI6IDQ0LCAiaW52ZXJzZUNoYWluIjogNDUsICJpbnZlcnNlQ2hhaW5fb3B0aW9uMCI6IDQ2LCAiT1BFTl9FTkRCTE9DSyI6IDQ3LCAiT1BFTiI6IDQ4LCAibXVzdGFjaGVfcmVwZXRpdGlvbjAiOiA0OSwgIm11c3RhY2hlX29wdGlvbjAiOiA1MCwgIk9QRU5fVU5FU0NBUEVEIjogNTEsICJtdXN0YWNoZV9yZXBldGl0aW9uMSI6IDUyLCAibXVzdGFjaGVfb3B0aW9uMSI6IDUzLCAiQ0xPU0VfVU5FU0NBUEVEIjogNTQsICJPUEVOX1BBUlRJQUwiOiA1NSwgInBhcnRpYWxOYW1lIjogNTYsICJwYXJ0aWFsX3JlcGV0aXRpb24wIjogNTcsICJwYXJ0aWFsX29wdGlvbjAiOiA1OCwgIm9wZW5QYXJ0aWFsQmxvY2siOiA1OSwgIk9QRU5fUEFSVElBTF9CTE9DSyI6IDYwLCAib3BlblBhcnRpYWxCbG9ja19yZXBldGl0aW9uMCI6IDYxLCAib3BlblBhcnRpYWxCbG9ja19vcHRpb24wIjogNjIsICJwYXJhbSI6IDYzLCAic2V4cHIiOiA2NCwgIk9QRU5fU0VYUFIiOiA2NSwgInNleHByX3JlcGV0aXRpb24wIjogNjYsICJzZXhwcl9vcHRpb24wIjogNjcsICJDTE9TRV9TRVhQUiI6IDY4LCAiaGFzaCI6IDY5LCAiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjogNzAsICJoYXNoU2VnbWVudCI6IDcxLCAiSUQiOiA3MiwgIkVRVUFMUyI6IDczLCAiYmxvY2tQYXJhbXMiOiA3NCwgIk9QRU5fQkxPQ0tfUEFSQU1TIjogNzUsICJibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwIjogNzYsICJDTE9TRV9CTE9DS19QQVJBTVMiOiA3NywgInBhdGgiOiA3OCwgImRhdGFOYW1lIjogNzksICJTVFJJTkciOiA4MCwgIk5VTUJFUiI6IDgxLCAiQk9PTEVBTiI6IDgyLCAiVU5ERUZJTkVEIjogODMsICJOVUxMIjogODQsICJEQVRBIjogODUsICJwYXRoU2VnbWVudHMiOiA4NiwgIlNFUCI6IDg3LCAiJGFjY2VwdCI6IDAsICIkZW5kIjogMSB9LAoJICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6ICJlcnJvciIsIDU6ICJFT0YiLCAxNDogIkNPTU1FTlQiLCAxNTogIkNPTlRFTlQiLCAxODogIkVORF9SQVdfQkxPQ0siLCAxOTogIk9QRU5fUkFXX0JMT0NLIiwgMjM6ICJDTE9TRV9SQVdfQkxPQ0siLCAyOTogIk9QRU5fQkxPQ0siLCAzMzogIkNMT1NFIiwgMzQ6ICJPUEVOX0lOVkVSU0UiLCAzOTogIk9QRU5fSU5WRVJTRV9DSEFJTiIsIDQ0OiAiSU5WRVJTRSIsIDQ3OiAiT1BFTl9FTkRCTE9DSyIsIDQ4OiAiT1BFTiIsIDUxOiAiT1BFTl9VTkVTQ0FQRUQiLCA1NDogIkNMT1NFX1VORVNDQVBFRCIsIDU1OiAiT1BFTl9QQVJUSUFMIiwgNjA6ICJPUEVOX1BBUlRJQUxfQkxPQ0siLCA2NTogIk9QRU5fU0VYUFIiLCA2ODogIkNMT1NFX1NFWFBSIiwgNzI6ICJJRCIsIDczOiAiRVFVQUxTIiwgNzU6ICJPUEVOX0JMT0NLX1BBUkFNUyIsIDc3OiAiQ0xPU0VfQkxPQ0tfUEFSQU1TIiwgODA6ICJTVFJJTkciLCA4MTogIk5VTUJFUiIsIDgyOiAiQk9PTEVBTiIsIDgzOiAiVU5ERUZJTkVEIiwgODQ6ICJOVUxMIiwgODU6ICJEQVRBIiwgODc6ICJTRVAiIH0sCgkgICAgICAgIHByb2R1Y3Rpb25zXzogWzAsIFszLCAyXSwgWzQsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMywgMV0sIFsxMCwgM10sIFsxNiwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjQsIDZdLCBbMjcsIDZdLCBbMzgsIDZdLCBbNDMsIDJdLCBbNDUsIDNdLCBbNDUsIDFdLCBbMjYsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzEyLCAzXSwgWzU5LCA1XSwgWzYzLCAxXSwgWzYzLCAxXSwgWzY0LCA1XSwgWzY5LCAxXSwgWzcxLCAzXSwgWzc0LCAzXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzIwLCAxXSwgWzU2LCAxXSwgWzU2LCAxXSwgWzc5LCAyXSwgWzc4LCAxXSwgWzg2LCAzXSwgWzg2LCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxNywgMV0sIFsxNywgMl0sIFsyMSwgMF0sIFsyMSwgMl0sIFsyMiwgMF0sIFsyMiwgMV0sIFsyNSwgMF0sIFsyNSwgMV0sIFsyOCwgMF0sIFsyOCwgMV0sIFszMCwgMF0sIFszMCwgMl0sIFszMSwgMF0sIFszMSwgMV0sIFszMiwgMF0sIFszMiwgMV0sIFszNSwgMF0sIFszNSwgMl0sIFszNiwgMF0sIFszNiwgMV0sIFszNywgMF0sIFszNywgMV0sIFs0MCwgMF0sIFs0MCwgMl0sIFs0MSwgMF0sIFs0MSwgMV0sIFs0MiwgMF0sIFs0MiwgMV0sIFs0NiwgMF0sIFs0NiwgMV0sIFs0OSwgMF0sIFs0OSwgMl0sIFs1MCwgMF0sIFs1MCwgMV0sIFs1MiwgMF0sIFs1MiwgMl0sIFs1MywgMF0sIFs1MywgMV0sIFs1NywgMF0sIFs1NywgMl0sIFs1OCwgMF0sIFs1OCwgMV0sIFs2MSwgMF0sIFs2MSwgMl0sIFs2MiwgMF0sIFs2MiwgMV0sIFs2NiwgMF0sIFs2NiwgMl0sIFs2NywgMF0sIFs2NywgMV0sIFs3MCwgMV0sIFs3MCwgMl0sIFs3NiwgMV0sIFs3NiwgMl1dLAoJICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwoJICAgICAgICAgICAgc3dpdGNoICh5eXN0YXRlKSB7CgkgICAgICAgICAgICAgICAgY2FzZSAxOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCRbJDAgLSAxXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUHJvZ3JhbSgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwXSwgJCRbJDBdKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKQoJICAgICAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gewoJICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NvbnRlbnRTdGF0ZW1lbnQnLAoJICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWw6ICQkWyQwXSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAkJFskMF0sCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IG9wZW46ICQkWyQwIC0gNV0sIHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTc6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSwKCSAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSB5eS5wcmVwYXJlUHJvZ3JhbShbaW52ZXJzZV0sICQkWyQwIC0gMV0ubG9jKTsKCSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTsKCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgc3RyaXA6ICQkWyQwIC0gMl0uc3RyaXAsIHByb2dyYW06IHByb2dyYW0sIGNoYWluOiB0cnVlIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyMzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JywKCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiAnJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksCgkgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkKCSAgICAgICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVQYXJ0aWFsQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjk6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJywKCSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICQkWyQwIC0gM10sCgkgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICQkWyQwIC0gMl0sCgkgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiAkJFskMCAtIDFdLAoJICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpCgkgICAgICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdIYXNoJywgcGFpcnM6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgdHlwZTogJ0hhc2hQYWlyJywga2V5OiB5eS5pZCgkJFskMCAtIDJdKSwgdmFsdWU6ICQkWyQwXSwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0sIG9yaWdpbmFsOiAkJFskMF0sIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWU6IE51bWJlcigkJFskMF0pLCBvcmlnaW5hbDogTnVtYmVyKCQkWyQwXSksIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM3OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlOiAkJFskMF0gPT09ICd0cnVlJywgb3JpZ2luYWw6ICQkWyQwXSA9PT0gJ3RydWUnLCBsb2M6IHl5LmxvY0luZm8odGhpcy5fJCkgfTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyB0eXBlOiAnVW5kZWZpbmVkTGl0ZXJhbCcsIG9yaWdpbmFsOiB1bmRlZmluZWQsIHZhbHVlOiB1bmRlZmluZWQsIGxvYzogeXkubG9jSW5mbyh0aGlzLl8kKSB9OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIG9yaWdpbmFsOiBudWxsLCB2YWx1ZTogbnVsbCwgbG9jOiB5eS5sb2NJbmZvKHRoaXMuXyQpIH07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDU6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQ3OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0ODoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDk6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDUwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA1MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNTg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDU5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA2NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNjU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDcwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3MToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNzg6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDc5OgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4MjoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODM6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDg2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA4NzoKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTA6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDkxOgoJICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5NDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgOTU6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk4OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA5OToKCSAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTAwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDE6CgkgICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfSwKCSAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0Nl0sIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDg6IFsyLCA0Nl0sIDUxOiBbMiwgNDZdLCA1NTogWzIsIDQ2XSwgNjA6IFsyLCA0Nl0gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogMTEsIDE0OiBbMSwgMTJdLCAxNTogWzEsIDIwXSwgMTY6IDE3LCAxOTogWzEsIDIzXSwgMjQ6IDE1LCAyNzogMTYsIDI5OiBbMSwgMjFdLCAzNDogWzEsIDIyXSwgMzk6IFsyLCAyXSwgNDQ6IFsyLCAyXSwgNDc6IFsyLCAyXSwgNDg6IFsxLCAxM10sIDUxOiBbMSwgMTRdLCA1NTogWzEsIDE4XSwgNTk6IDE5LCA2MDogWzEsIDI0XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0N10sIDE0OiBbMiwgNDddLCAxNTogWzIsIDQ3XSwgMTk6IFsyLCA0N10sIDI5OiBbMiwgNDddLCAzNDogWzIsIDQ3XSwgMzk6IFsyLCA0N10sIDQ0OiBbMiwgNDddLCA0NzogWzIsIDQ3XSwgNDg6IFsyLCA0N10sIDUxOiBbMiwgNDddLCA1NTogWzIsIDQ3XSwgNjA6IFsyLCA0N10gfSwgeyA1OiBbMiwgM10sIDE0OiBbMiwgM10sIDE1OiBbMiwgM10sIDE5OiBbMiwgM10sIDI5OiBbMiwgM10sIDM0OiBbMiwgM10sIDM5OiBbMiwgM10sIDQ0OiBbMiwgM10sIDQ3OiBbMiwgM10sIDQ4OiBbMiwgM10sIDUxOiBbMiwgM10sIDU1OiBbMiwgM10sIDYwOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE1OiBbMiwgNF0sIDE5OiBbMiwgNF0sIDI5OiBbMiwgNF0sIDM0OiBbMiwgNF0sIDM5OiBbMiwgNF0sIDQ0OiBbMiwgNF0sIDQ3OiBbMiwgNF0sIDQ4OiBbMiwgNF0sIDUxOiBbMiwgNF0sIDU1OiBbMiwgNF0sIDYwOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE1OiBbMiwgNV0sIDE5OiBbMiwgNV0sIDI5OiBbMiwgNV0sIDM0OiBbMiwgNV0sIDM5OiBbMiwgNV0sIDQ0OiBbMiwgNV0sIDQ3OiBbMiwgNV0sIDQ4OiBbMiwgNV0sIDUxOiBbMiwgNV0sIDU1OiBbMiwgNV0sIDYwOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE1OiBbMiwgNl0sIDE5OiBbMiwgNl0sIDI5OiBbMiwgNl0sIDM0OiBbMiwgNl0sIDM5OiBbMiwgNl0sIDQ0OiBbMiwgNl0sIDQ3OiBbMiwgNl0sIDQ4OiBbMiwgNl0sIDUxOiBbMiwgNl0sIDU1OiBbMiwgNl0sIDYwOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDE0OiBbMiwgN10sIDE1OiBbMiwgN10sIDE5OiBbMiwgN10sIDI5OiBbMiwgN10sIDM0OiBbMiwgN10sIDM5OiBbMiwgN10sIDQ0OiBbMiwgN10sIDQ3OiBbMiwgN10sIDQ4OiBbMiwgN10sIDUxOiBbMiwgN10sIDU1OiBbMiwgN10sIDYwOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE1OiBbMiwgOF0sIDE5OiBbMiwgOF0sIDI5OiBbMiwgOF0sIDM0OiBbMiwgOF0sIDM5OiBbMiwgOF0sIDQ0OiBbMiwgOF0sIDQ3OiBbMiwgOF0sIDQ4OiBbMiwgOF0sIDUxOiBbMiwgOF0sIDU1OiBbMiwgOF0sIDYwOiBbMiwgOF0gfSwgeyA1OiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE1OiBbMiwgOV0sIDE5OiBbMiwgOV0sIDI5OiBbMiwgOV0sIDM0OiBbMiwgOV0sIDM5OiBbMiwgOV0sIDQ0OiBbMiwgOV0sIDQ3OiBbMiwgOV0sIDQ4OiBbMiwgOV0sIDUxOiBbMiwgOV0sIDU1OiBbMiwgOV0sIDYwOiBbMiwgOV0gfSwgeyAyMDogMjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDM2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDM3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDM5OiBbMiwgNDZdLCA0NDogWzIsIDQ2XSwgNDc6IFsyLCA0Nl0sIDQ4OiBbMiwgNDZdLCA1MTogWzIsIDQ2XSwgNTU6IFsyLCA0Nl0sIDYwOiBbMiwgNDZdIH0sIHsgNDogMzgsIDY6IDMsIDE0OiBbMiwgNDZdLCAxNTogWzIsIDQ2XSwgMTk6IFsyLCA0Nl0sIDI5OiBbMiwgNDZdLCAzNDogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDEzOiA0MCwgMTU6IFsxLCAyMF0sIDE3OiAzOSB9LCB7IDIwOiA0MiwgNTY6IDQxLCA2NDogNDMsIDY1OiBbMSwgNDRdLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDQ1LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDU6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNTogWzIsIDEwXSwgMTg6IFsyLCAxMF0sIDE5OiBbMiwgMTBdLCAyOTogWzIsIDEwXSwgMzQ6IFsyLCAxMF0sIDM5OiBbMiwgMTBdLCA0NDogWzIsIDEwXSwgNDc6IFsyLCAxMF0sIDQ4OiBbMiwgMTBdLCA1MTogWzIsIDEwXSwgNTU6IFsyLCAxMF0sIDYwOiBbMiwgMTBdIH0sIHsgMjA6IDQ2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA0NywgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNDgsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDQyLCA1NjogNDksIDY0OiA0MywgNjU6IFsxLCA0NF0sIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsyLCA3OF0sIDQ5OiA1MCwgNjU6IFsyLCA3OF0sIDcyOiBbMiwgNzhdLCA4MDogWzIsIDc4XSwgODE6IFsyLCA3OF0sIDgyOiBbMiwgNzhdLCA4MzogWzIsIDc4XSwgODQ6IFsyLCA3OF0sIDg1OiBbMiwgNzhdIH0sIHsgMjM6IFsyLCAzM10sIDMzOiBbMiwgMzNdLCA1NDogWzIsIDMzXSwgNjU6IFsyLCAzM10sIDY4OiBbMiwgMzNdLCA3MjogWzIsIDMzXSwgNzU6IFsyLCAzM10sIDgwOiBbMiwgMzNdLCA4MTogWzIsIDMzXSwgODI6IFsyLCAzM10sIDgzOiBbMiwgMzNdLCA4NDogWzIsIDMzXSwgODU6IFsyLCAzM10gfSwgeyAyMzogWzIsIDM0XSwgMzM6IFsyLCAzNF0sIDU0OiBbMiwgMzRdLCA2NTogWzIsIDM0XSwgNjg6IFsyLCAzNF0sIDcyOiBbMiwgMzRdLCA3NTogWzIsIDM0XSwgODA6IFsyLCAzNF0sIDgxOiBbMiwgMzRdLCA4MjogWzIsIDM0XSwgODM6IFsyLCAzNF0sIDg0OiBbMiwgMzRdLCA4NTogWzIsIDM0XSB9LCB7IDIzOiBbMiwgMzVdLCAzMzogWzIsIDM1XSwgNTQ6IFsyLCAzNV0sIDY1OiBbMiwgMzVdLCA2ODogWzIsIDM1XSwgNzI6IFsyLCAzNV0sIDc1OiBbMiwgMzVdLCA4MDogWzIsIDM1XSwgODE6IFsyLCAzNV0sIDgyOiBbMiwgMzVdLCA4MzogWzIsIDM1XSwgODQ6IFsyLCAzNV0sIDg1OiBbMiwgMzVdIH0sIHsgMjM6IFsyLCAzNl0sIDMzOiBbMiwgMzZdLCA1NDogWzIsIDM2XSwgNjU6IFsyLCAzNl0sIDY4OiBbMiwgMzZdLCA3MjogWzIsIDM2XSwgNzU6IFsyLCAzNl0sIDgwOiBbMiwgMzZdLCA4MTogWzIsIDM2XSwgODI6IFsyLCAzNl0sIDgzOiBbMiwgMzZdLCA4NDogWzIsIDM2XSwgODU6IFsyLCAzNl0gfSwgeyAyMzogWzIsIDM3XSwgMzM6IFsyLCAzN10sIDU0OiBbMiwgMzddLCA2NTogWzIsIDM3XSwgNjg6IFsyLCAzN10sIDcyOiBbMiwgMzddLCA3NTogWzIsIDM3XSwgODA6IFsyLCAzN10sIDgxOiBbMiwgMzddLCA4MjogWzIsIDM3XSwgODM6IFsyLCAzN10sIDg0OiBbMiwgMzddLCA4NTogWzIsIDM3XSB9LCB7IDIzOiBbMiwgMzhdLCAzMzogWzIsIDM4XSwgNTQ6IFsyLCAzOF0sIDY1OiBbMiwgMzhdLCA2ODogWzIsIDM4XSwgNzI6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA4MDogWzIsIDM4XSwgODE6IFsyLCAzOF0sIDgyOiBbMiwgMzhdLCA4MzogWzIsIDM4XSwgODQ6IFsyLCAzOF0sIDg1OiBbMiwgMzhdIH0sIHsgMjM6IFsyLCAzOV0sIDMzOiBbMiwgMzldLCA1NDogWzIsIDM5XSwgNjU6IFsyLCAzOV0sIDY4OiBbMiwgMzldLCA3MjogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDgwOiBbMiwgMzldLCA4MTogWzIsIDM5XSwgODI6IFsyLCAzOV0sIDgzOiBbMiwgMzldLCA4NDogWzIsIDM5XSwgODU6IFsyLCAzOV0gfSwgeyAyMzogWzIsIDQzXSwgMzM6IFsyLCA0M10sIDU0OiBbMiwgNDNdLCA2NTogWzIsIDQzXSwgNjg6IFsyLCA0M10sIDcyOiBbMiwgNDNdLCA3NTogWzIsIDQzXSwgODA6IFsyLCA0M10sIDgxOiBbMiwgNDNdLCA4MjogWzIsIDQzXSwgODM6IFsyLCA0M10sIDg0OiBbMiwgNDNdLCA4NTogWzIsIDQzXSwgODc6IFsxLCA1MV0gfSwgeyA3MjogWzEsIDM1XSwgODY6IDUyIH0sIHsgMjM6IFsyLCA0NV0sIDMzOiBbMiwgNDVdLCA1NDogWzIsIDQ1XSwgNjU6IFsyLCA0NV0sIDY4OiBbMiwgNDVdLCA3MjogWzIsIDQ1XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgNTI6IDUzLCA1NDogWzIsIDgyXSwgNjU6IFsyLCA4Ml0sIDcyOiBbMiwgODJdLCA4MDogWzIsIDgyXSwgODE6IFsyLCA4Ml0sIDgyOiBbMiwgODJdLCA4MzogWzIsIDgyXSwgODQ6IFsyLCA4Ml0sIDg1OiBbMiwgODJdIH0sIHsgMjU6IDU0LCAzODogNTYsIDM5OiBbMSwgNThdLCA0MzogNTcsIDQ0OiBbMSwgNTldLCA0NTogNTUsIDQ3OiBbMiwgNTRdIH0sIHsgMjg6IDYwLCA0MzogNjEsIDQ0OiBbMSwgNTldLCA0NzogWzIsIDU2XSB9LCB7IDEzOiA2MywgMTU6IFsxLCAyMF0sIDE4OiBbMSwgNjJdIH0sIHsgMTU6IFsyLCA0OF0sIDE4OiBbMiwgNDhdIH0sIHsgMzM6IFsyLCA4Nl0sIDU3OiA2NCwgNjU6IFsyLCA4Nl0sIDcyOiBbMiwgODZdLCA4MDogWzIsIDg2XSwgODE6IFsyLCA4Nl0sIDgyOiBbMiwgODZdLCA4MzogWzIsIDg2XSwgODQ6IFsyLCA4Nl0sIDg1OiBbMiwgODZdIH0sIHsgMzM6IFsyLCA0MF0sIDY1OiBbMiwgNDBdLCA3MjogWzIsIDQwXSwgODA6IFsyLCA0MF0sIDgxOiBbMiwgNDBdLCA4MjogWzIsIDQwXSwgODM6IFsyLCA0MF0sIDg0OiBbMiwgNDBdLCA4NTogWzIsIDQwXSB9LCB7IDMzOiBbMiwgNDFdLCA2NTogWzIsIDQxXSwgNzI6IFsyLCA0MV0sIDgwOiBbMiwgNDFdLCA4MTogWzIsIDQxXSwgODI6IFsyLCA0MV0sIDgzOiBbMiwgNDFdLCA4NDogWzIsIDQxXSwgODU6IFsyLCA0MV0gfSwgeyAyMDogNjUsIDcyOiBbMSwgMzVdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjY6IDY2LCA0NzogWzEsIDY3XSB9LCB7IDMwOiA2OCwgMzM6IFsyLCA1OF0sIDY1OiBbMiwgNThdLCA3MjogWzIsIDU4XSwgNzU6IFsyLCA1OF0sIDgwOiBbMiwgNThdLCA4MTogWzIsIDU4XSwgODI6IFsyLCA1OF0sIDgzOiBbMiwgNThdLCA4NDogWzIsIDU4XSwgODU6IFsyLCA1OF0gfSwgeyAzMzogWzIsIDY0XSwgMzU6IDY5LCA2NTogWzIsIDY0XSwgNzI6IFsyLCA2NF0sIDc1OiBbMiwgNjRdLCA4MDogWzIsIDY0XSwgODE6IFsyLCA2NF0sIDgyOiBbMiwgNjRdLCA4MzogWzIsIDY0XSwgODQ6IFsyLCA2NF0sIDg1OiBbMiwgNjRdIH0sIHsgMjE6IDcwLCAyMzogWzIsIDUwXSwgNjU6IFsyLCA1MF0sIDcyOiBbMiwgNTBdLCA4MDogWzIsIDUwXSwgODE6IFsyLCA1MF0sIDgyOiBbMiwgNTBdLCA4MzogWzIsIDUwXSwgODQ6IFsyLCA1MF0sIDg1OiBbMiwgNTBdIH0sIHsgMzM6IFsyLCA5MF0sIDYxOiA3MSwgNjU6IFsyLCA5MF0sIDcyOiBbMiwgOTBdLCA4MDogWzIsIDkwXSwgODE6IFsyLCA5MF0sIDgyOiBbMiwgOTBdLCA4MzogWzIsIDkwXSwgODQ6IFsyLCA5MF0sIDg1OiBbMiwgOTBdIH0sIHsgMjA6IDc1LCAzMzogWzIsIDgwXSwgNTA6IDcyLCA2MzogNzMsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiA3NCwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgNzI6IFsxLCA4MF0gfSwgeyAyMzogWzIsIDQyXSwgMzM6IFsyLCA0Ml0sIDU0OiBbMiwgNDJdLCA2NTogWzIsIDQyXSwgNjg6IFsyLCA0Ml0sIDcyOiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgODA6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdLCA4MjogWzIsIDQyXSwgODM6IFsyLCA0Ml0sIDg0OiBbMiwgNDJdLCA4NTogWzIsIDQyXSwgODc6IFsxLCA1MV0gfSwgeyAyMDogNzUsIDUzOiA4MSwgNTQ6IFsyLCA4NF0sIDYzOiA4MiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDgzLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyNjogODQsIDQ3OiBbMSwgNjddIH0sIHsgNDc6IFsyLCA1NV0gfSwgeyA0OiA4NSwgNjogMywgMTQ6IFsyLCA0Nl0sIDE1OiBbMiwgNDZdLCAxOTogWzIsIDQ2XSwgMjk6IFsyLCA0Nl0sIDM0OiBbMiwgNDZdLCAzOTogWzIsIDQ2XSwgNDQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDQ3OiBbMiwgMjBdIH0sIHsgMjA6IDg2LCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDQ6IDg3LCA2OiAzLCAxNDogWzIsIDQ2XSwgMTU6IFsyLCA0Nl0sIDE5OiBbMiwgNDZdLCAyOTogWzIsIDQ2XSwgMzQ6IFsyLCA0Nl0sIDQ3OiBbMiwgNDZdLCA0ODogWzIsIDQ2XSwgNTE6IFsyLCA0Nl0sIDU1OiBbMiwgNDZdLCA2MDogWzIsIDQ2XSB9LCB7IDI2OiA4OCwgNDc6IFsxLCA2N10gfSwgeyA0NzogWzIsIDU3XSB9LCB7IDU6IFsyLCAxMV0sIDE0OiBbMiwgMTFdLCAxNTogWzIsIDExXSwgMTk6IFsyLCAxMV0sIDI5OiBbMiwgMTFdLCAzNDogWzIsIDExXSwgMzk6IFsyLCAxMV0sIDQ0OiBbMiwgMTFdLCA0NzogWzIsIDExXSwgNDg6IFsyLCAxMV0sIDUxOiBbMiwgMTFdLCA1NTogWzIsIDExXSwgNjA6IFsyLCAxMV0gfSwgeyAxNTogWzIsIDQ5XSwgMTg6IFsyLCA0OV0gfSwgeyAyMDogNzUsIDMzOiBbMiwgODhdLCA1ODogODksIDYzOiA5MCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDkxLCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA2NTogWzIsIDk0XSwgNjY6IDkyLCA2ODogWzIsIDk0XSwgNzI6IFsyLCA5NF0sIDgwOiBbMiwgOTRdLCA4MTogWzIsIDk0XSwgODI6IFsyLCA5NF0sIDgzOiBbMiwgOTRdLCA4NDogWzIsIDk0XSwgODU6IFsyLCA5NF0gfSwgeyA1OiBbMiwgMjVdLCAxNDogWzIsIDI1XSwgMTU6IFsyLCAyNV0sIDE5OiBbMiwgMjVdLCAyOTogWzIsIDI1XSwgMzQ6IFsyLCAyNV0sIDM5OiBbMiwgMjVdLCA0NDogWzIsIDI1XSwgNDc6IFsyLCAyNV0sIDQ4OiBbMiwgMjVdLCA1MTogWzIsIDI1XSwgNTU6IFsyLCAyNV0sIDYwOiBbMiwgMjVdIH0sIHsgMjA6IDkzLCA3MjogWzEsIDM1XSwgNzg6IDI2LCA3OTogMjcsIDgwOiBbMSwgMjhdLCA4MTogWzEsIDI5XSwgODI6IFsxLCAzMF0sIDgzOiBbMSwgMzFdLCA4NDogWzEsIDMyXSwgODU6IFsxLCAzNF0sIDg2OiAzMyB9LCB7IDIwOiA3NSwgMzE6IDk0LCAzMzogWzIsIDYwXSwgNjM6IDk1LCA2NDogNzYsIDY1OiBbMSwgNDRdLCA2OTogOTYsIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA2MF0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAyMDogNzUsIDMzOiBbMiwgNjZdLCAzNjogOTcsIDYzOiA5OCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDk5LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc1OiBbMiwgNjZdLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAyMjogMTAwLCAyMzogWzIsIDUyXSwgNjM6IDEwMSwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwMiwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMjA6IDc1LCAzMzogWzIsIDkyXSwgNjI6IDEwMywgNjM6IDEwNCwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNjk6IDEwNSwgNzA6IDc3LCA3MTogNzgsIDcyOiBbMSwgNzldLCA3ODogMjYsIDc5OiAyNywgODA6IFsxLCAyOF0sIDgxOiBbMSwgMjldLCA4MjogWzEsIDMwXSwgODM6IFsxLCAzMV0sIDg0OiBbMSwgMzJdLCA4NTogWzEsIDM0XSwgODY6IDMzIH0sIHsgMzM6IFsxLCAxMDZdIH0sIHsgMzM6IFsyLCA3OV0sIDY1OiBbMiwgNzldLCA3MjogWzIsIDc5XSwgODA6IFsyLCA3OV0sIDgxOiBbMiwgNzldLCA4MjogWzIsIDc5XSwgODM6IFsyLCA3OV0sIDg0OiBbMiwgNzldLCA4NTogWzIsIDc5XSB9LCB7IDMzOiBbMiwgODFdIH0sIHsgMjM6IFsyLCAyN10sIDMzOiBbMiwgMjddLCA1NDogWzIsIDI3XSwgNjU6IFsyLCAyN10sIDY4OiBbMiwgMjddLCA3MjogWzIsIDI3XSwgNzU6IFsyLCAyN10sIDgwOiBbMiwgMjddLCA4MTogWzIsIDI3XSwgODI6IFsyLCAyN10sIDgzOiBbMiwgMjddLCA4NDogWzIsIDI3XSwgODU6IFsyLCAyN10gfSwgeyAyMzogWzIsIDI4XSwgMzM6IFsyLCAyOF0sIDU0OiBbMiwgMjhdLCA2NTogWzIsIDI4XSwgNjg6IFsyLCAyOF0sIDcyOiBbMiwgMjhdLCA3NTogWzIsIDI4XSwgODA6IFsyLCAyOF0sIDgxOiBbMiwgMjhdLCA4MjogWzIsIDI4XSwgODM6IFsyLCAyOF0sIDg0OiBbMiwgMjhdLCA4NTogWzIsIDI4XSB9LCB7IDIzOiBbMiwgMzBdLCAzMzogWzIsIDMwXSwgNTQ6IFsyLCAzMF0sIDY4OiBbMiwgMzBdLCA3MTogMTA3LCA3MjogWzEsIDEwOF0sIDc1OiBbMiwgMzBdIH0sIHsgMjM6IFsyLCA5OF0sIDMzOiBbMiwgOThdLCA1NDogWzIsIDk4XSwgNjg6IFsyLCA5OF0sIDcyOiBbMiwgOThdLCA3NTogWzIsIDk4XSB9LCB7IDIzOiBbMiwgNDVdLCAzMzogWzIsIDQ1XSwgNTQ6IFsyLCA0NV0sIDY1OiBbMiwgNDVdLCA2ODogWzIsIDQ1XSwgNzI6IFsyLCA0NV0sIDczOiBbMSwgMTA5XSwgNzU6IFsyLCA0NV0sIDgwOiBbMiwgNDVdLCA4MTogWzIsIDQ1XSwgODI6IFsyLCA0NV0sIDgzOiBbMiwgNDVdLCA4NDogWzIsIDQ1XSwgODU6IFsyLCA0NV0sIDg3OiBbMiwgNDVdIH0sIHsgMjM6IFsyLCA0NF0sIDMzOiBbMiwgNDRdLCA1NDogWzIsIDQ0XSwgNjU6IFsyLCA0NF0sIDY4OiBbMiwgNDRdLCA3MjogWzIsIDQ0XSwgNzU6IFsyLCA0NF0sIDgwOiBbMiwgNDRdLCA4MTogWzIsIDQ0XSwgODI6IFsyLCA0NF0sIDgzOiBbMiwgNDRdLCA4NDogWzIsIDQ0XSwgODU6IFsyLCA0NF0sIDg3OiBbMiwgNDRdIH0sIHsgNTQ6IFsxLCAxMTBdIH0sIHsgNTQ6IFsyLCA4M10sIDY1OiBbMiwgODNdLCA3MjogWzIsIDgzXSwgODA6IFsyLCA4M10sIDgxOiBbMiwgODNdLCA4MjogWzIsIDgzXSwgODM6IFsyLCA4M10sIDg0OiBbMiwgODNdLCA4NTogWzIsIDgzXSB9LCB7IDU0OiBbMiwgODVdIH0sIHsgNTogWzIsIDEzXSwgMTQ6IFsyLCAxM10sIDE1OiBbMiwgMTNdLCAxOTogWzIsIDEzXSwgMjk6IFsyLCAxM10sIDM0OiBbMiwgMTNdLCAzOTogWzIsIDEzXSwgNDQ6IFsyLCAxM10sIDQ3OiBbMiwgMTNdLCA0ODogWzIsIDEzXSwgNTE6IFsyLCAxM10sIDU1OiBbMiwgMTNdLCA2MDogWzIsIDEzXSB9LCB7IDM4OiA1NiwgMzk6IFsxLCA1OF0sIDQzOiA1NywgNDQ6IFsxLCA1OV0sIDQ1OiAxMTIsIDQ2OiAxMTEsIDQ3OiBbMiwgNzZdIH0sIHsgMzM6IFsyLCA3MF0sIDQwOiAxMTMsIDY1OiBbMiwgNzBdLCA3MjogWzIsIDcwXSwgNzU6IFsyLCA3MF0sIDgwOiBbMiwgNzBdLCA4MTogWzIsIDcwXSwgODI6IFsyLCA3MF0sIDgzOiBbMiwgNzBdLCA4NDogWzIsIDcwXSwgODU6IFsyLCA3MF0gfSwgeyA0NzogWzIsIDE4XSB9LCB7IDU6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNTogWzIsIDE0XSwgMTk6IFsyLCAxNF0sIDI5OiBbMiwgMTRdLCAzNDogWzIsIDE0XSwgMzk6IFsyLCAxNF0sIDQ0OiBbMiwgMTRdLCA0NzogWzIsIDE0XSwgNDg6IFsyLCAxNF0sIDUxOiBbMiwgMTRdLCA1NTogWzIsIDE0XSwgNjA6IFsyLCAxNF0gfSwgeyAzMzogWzEsIDExNF0gfSwgeyAzMzogWzIsIDg3XSwgNjU6IFsyLCA4N10sIDcyOiBbMiwgODddLCA4MDogWzIsIDg3XSwgODE6IFsyLCA4N10sIDgyOiBbMiwgODddLCA4MzogWzIsIDg3XSwgODQ6IFsyLCA4N10sIDg1OiBbMiwgODddIH0sIHsgMzM6IFsyLCA4OV0gfSwgeyAyMDogNzUsIDYzOiAxMTYsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY3OiAxMTUsIDY4OiBbMiwgOTZdLCA2OTogMTE3LCA3MDogNzcsIDcxOiA3OCwgNzI6IFsxLCA3OV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyAzMzogWzEsIDExOF0gfSwgeyAzMjogMTE5LCAzMzogWzIsIDYyXSwgNzQ6IDEyMCwgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA1OV0sIDY1OiBbMiwgNTldLCA3MjogWzIsIDU5XSwgNzU6IFsyLCA1OV0sIDgwOiBbMiwgNTldLCA4MTogWzIsIDU5XSwgODI6IFsyLCA1OV0sIDgzOiBbMiwgNTldLCA4NDogWzIsIDU5XSwgODU6IFsyLCA1OV0gfSwgeyAzMzogWzIsIDYxXSwgNzU6IFsyLCA2MV0gfSwgeyAzMzogWzIsIDY4XSwgMzc6IDEyMiwgNzQ6IDEyMywgNzU6IFsxLCAxMjFdIH0sIHsgMzM6IFsyLCA2NV0sIDY1OiBbMiwgNjVdLCA3MjogWzIsIDY1XSwgNzU6IFsyLCA2NV0sIDgwOiBbMiwgNjVdLCA4MTogWzIsIDY1XSwgODI6IFsyLCA2NV0sIDgzOiBbMiwgNjVdLCA4NDogWzIsIDY1XSwgODU6IFsyLCA2NV0gfSwgeyAzMzogWzIsIDY3XSwgNzU6IFsyLCA2N10gfSwgeyAyMzogWzEsIDEyNF0gfSwgeyAyMzogWzIsIDUxXSwgNjU6IFsyLCA1MV0sIDcyOiBbMiwgNTFdLCA4MDogWzIsIDUxXSwgODE6IFsyLCA1MV0sIDgyOiBbMiwgNTFdLCA4MzogWzIsIDUxXSwgODQ6IFsyLCA1MV0sIDg1OiBbMiwgNTFdIH0sIHsgMjM6IFsyLCA1M10gfSwgeyAzMzogWzEsIDEyNV0gfSwgeyAzMzogWzIsIDkxXSwgNjU6IFsyLCA5MV0sIDcyOiBbMiwgOTFdLCA4MDogWzIsIDkxXSwgODE6IFsyLCA5MV0sIDgyOiBbMiwgOTFdLCA4MzogWzIsIDkxXSwgODQ6IFsyLCA5MV0sIDg1OiBbMiwgOTFdIH0sIHsgMzM6IFsyLCA5M10gfSwgeyA1OiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTU6IFsyLCAyMl0sIDE5OiBbMiwgMjJdLCAyOTogWzIsIDIyXSwgMzQ6IFsyLCAyMl0sIDM5OiBbMiwgMjJdLCA0NDogWzIsIDIyXSwgNDc6IFsyLCAyMl0sIDQ4OiBbMiwgMjJdLCA1MTogWzIsIDIyXSwgNTU6IFsyLCAyMl0sIDYwOiBbMiwgMjJdIH0sIHsgMjM6IFsyLCA5OV0sIDMzOiBbMiwgOTldLCA1NDogWzIsIDk5XSwgNjg6IFsyLCA5OV0sIDcyOiBbMiwgOTldLCA3NTogWzIsIDk5XSB9LCB7IDczOiBbMSwgMTA5XSB9LCB7IDIwOiA3NSwgNjM6IDEyNiwgNjQ6IDc2LCA2NTogWzEsIDQ0XSwgNzI6IFsxLCAzNV0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTU6IFsyLCAyM10sIDE5OiBbMiwgMjNdLCAyOTogWzIsIDIzXSwgMzQ6IFsyLCAyM10sIDM5OiBbMiwgMjNdLCA0NDogWzIsIDIzXSwgNDc6IFsyLCAyM10sIDQ4OiBbMiwgMjNdLCA1MTogWzIsIDIzXSwgNTU6IFsyLCAyM10sIDYwOiBbMiwgMjNdIH0sIHsgNDc6IFsyLCAxOV0gfSwgeyA0NzogWzIsIDc3XSB9LCB7IDIwOiA3NSwgMzM6IFsyLCA3Ml0sIDQxOiAxMjcsIDYzOiAxMjgsIDY0OiA3NiwgNjU6IFsxLCA0NF0sIDY5OiAxMjksIDcwOiA3NywgNzE6IDc4LCA3MjogWzEsIDc5XSwgNzU6IFsyLCA3Ml0sIDc4OiAyNiwgNzk6IDI3LCA4MDogWzEsIDI4XSwgODE6IFsxLCAyOV0sIDgyOiBbMSwgMzBdLCA4MzogWzEsIDMxXSwgODQ6IFsxLCAzMl0sIDg1OiBbMSwgMzRdLCA4NjogMzMgfSwgeyA1OiBbMiwgMjRdLCAxNDogWzIsIDI0XSwgMTU6IFsyLCAyNF0sIDE5OiBbMiwgMjRdLCAyOTogWzIsIDI0XSwgMzQ6IFsyLCAyNF0sIDM5OiBbMiwgMjRdLCA0NDogWzIsIDI0XSwgNDc6IFsyLCAyNF0sIDQ4OiBbMiwgMjRdLCA1MTogWzIsIDI0XSwgNTU6IFsyLCAyNF0sIDYwOiBbMiwgMjRdIH0sIHsgNjg6IFsxLCAxMzBdIH0sIHsgNjU6IFsyLCA5NV0sIDY4OiBbMiwgOTVdLCA3MjogWzIsIDk1XSwgODA6IFsyLCA5NV0sIDgxOiBbMiwgOTVdLCA4MjogWzIsIDk1XSwgODM6IFsyLCA5NV0sIDg0OiBbMiwgOTVdLCA4NTogWzIsIDk1XSB9LCB7IDY4OiBbMiwgOTddIH0sIHsgNTogWzIsIDIxXSwgMTQ6IFsyLCAyMV0sIDE1OiBbMiwgMjFdLCAxOTogWzIsIDIxXSwgMjk6IFsyLCAyMV0sIDM0OiBbMiwgMjFdLCAzOTogWzIsIDIxXSwgNDQ6IFsyLCAyMV0sIDQ3OiBbMiwgMjFdLCA0ODogWzIsIDIxXSwgNTE6IFsyLCAyMV0sIDU1OiBbMiwgMjFdLCA2MDogWzIsIDIxXSB9LCB7IDMzOiBbMSwgMTMxXSB9LCB7IDMzOiBbMiwgNjNdIH0sIHsgNzI6IFsxLCAxMzNdLCA3NjogMTMyIH0sIHsgMzM6IFsxLCAxMzRdIH0sIHsgMzM6IFsyLCA2OV0gfSwgeyAxNTogWzIsIDEyXSB9LCB7IDE0OiBbMiwgMjZdLCAxNTogWzIsIDI2XSwgMTk6IFsyLCAyNl0sIDI5OiBbMiwgMjZdLCAzNDogWzIsIDI2XSwgNDc6IFsyLCAyNl0sIDQ4OiBbMiwgMjZdLCA1MTogWzIsIDI2XSwgNTU6IFsyLCAyNl0sIDYwOiBbMiwgMjZdIH0sIHsgMjM6IFsyLCAzMV0sIDMzOiBbMiwgMzFdLCA1NDogWzIsIDMxXSwgNjg6IFsyLCAzMV0sIDcyOiBbMiwgMzFdLCA3NTogWzIsIDMxXSB9LCB7IDMzOiBbMiwgNzRdLCA0MjogMTM1LCA3NDogMTM2LCA3NTogWzEsIDEyMV0gfSwgeyAzMzogWzIsIDcxXSwgNjU6IFsyLCA3MV0sIDcyOiBbMiwgNzFdLCA3NTogWzIsIDcxXSwgODA6IFsyLCA3MV0sIDgxOiBbMiwgNzFdLCA4MjogWzIsIDcxXSwgODM6IFsyLCA3MV0sIDg0OiBbMiwgNzFdLCA4NTogWzIsIDcxXSB9LCB7IDMzOiBbMiwgNzNdLCA3NTogWzIsIDczXSB9LCB7IDIzOiBbMiwgMjldLCAzMzogWzIsIDI5XSwgNTQ6IFsyLCAyOV0sIDY1OiBbMiwgMjldLCA2ODogWzIsIDI5XSwgNzI6IFsyLCAyOV0sIDc1OiBbMiwgMjldLCA4MDogWzIsIDI5XSwgODE6IFsyLCAyOV0sIDgyOiBbMiwgMjldLCA4MzogWzIsIDI5XSwgODQ6IFsyLCAyOV0sIDg1OiBbMiwgMjldIH0sIHsgMTQ6IFsyLCAxNV0sIDE1OiBbMiwgMTVdLCAxOTogWzIsIDE1XSwgMjk6IFsyLCAxNV0sIDM0OiBbMiwgMTVdLCAzOTogWzIsIDE1XSwgNDQ6IFsyLCAxNV0sIDQ3OiBbMiwgMTVdLCA0ODogWzIsIDE1XSwgNTE6IFsyLCAxNV0sIDU1OiBbMiwgMTVdLCA2MDogWzIsIDE1XSB9LCB7IDcyOiBbMSwgMTM4XSwgNzc6IFsxLCAxMzddIH0sIHsgNzI6IFsyLCAxMDBdLCA3NzogWzIsIDEwMF0gfSwgeyAxNDogWzIsIDE2XSwgMTU6IFsyLCAxNl0sIDE5OiBbMiwgMTZdLCAyOTogWzIsIDE2XSwgMzQ6IFsyLCAxNl0sIDQ0OiBbMiwgMTZdLCA0NzogWzIsIDE2XSwgNDg6IFsyLCAxNl0sIDUxOiBbMiwgMTZdLCA1NTogWzIsIDE2XSwgNjA6IFsyLCAxNl0gfSwgeyAzMzogWzEsIDEzOV0gfSwgeyAzMzogWzIsIDc1XSB9LCB7IDMzOiBbMiwgMzJdIH0sIHsgNzI6IFsyLCAxMDFdLCA3NzogWzIsIDEwMV0gfSwgeyAxNDogWzIsIDE3XSwgMTU6IFsyLCAxN10sIDE5OiBbMiwgMTddLCAyOTogWzIsIDE3XSwgMzQ6IFsyLCAxN10sIDM5OiBbMiwgMTddLCA0NDogWzIsIDE3XSwgNDc6IFsyLCAxN10sIDQ4OiBbMiwgMTddLCA1MTogWzIsIDE3XSwgNTU6IFsyLCAxN10sIDYwOiBbMiwgMTddIH1dLAoJICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDU1OiBbMiwgNTVdLCA1NzogWzIsIDIwXSwgNjE6IFsyLCA1N10sIDc0OiBbMiwgODFdLCA4MzogWzIsIDg1XSwgODc6IFsyLCAxOF0sIDkxOiBbMiwgODldLCAxMDI6IFsyLCA1M10sIDEwNTogWzIsIDkzXSwgMTExOiBbMiwgMTldLCAxMTI6IFsyLCA3N10sIDExNzogWzIsIDk3XSwgMTIwOiBbMiwgNjNdLCAxMjM6IFsyLCA2OV0sIDEyNDogWzIsIDEyXSwgMTM2OiBbMiwgNzVdLCAxMzc6IFsyLCAzMl0gfSwKCSAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpOwoJICAgICAgICB9LAoJICAgICAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKCSAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcywKCSAgICAgICAgICAgICAgICBzdGFjayA9IFswXSwKCSAgICAgICAgICAgICAgICB2c3RhY2sgPSBbbnVsbF0sCgkgICAgICAgICAgICAgICAgbHN0YWNrID0gW10sCgkgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnRhYmxlLAoJICAgICAgICAgICAgICAgIHl5dGV4dCA9ICIiLAoJICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCwKCSAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLAoJICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLAoJICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsCgkgICAgICAgICAgICAgICAgRU9GID0gMTsKCSAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwoJICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CgkgICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKCSAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307CgkgICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKCSAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKCSAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKCSAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSAiZnVuY3Rpb24iKSB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7CgkgICAgICAgICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CgkgICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CgkgICAgICAgICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwoJICAgICAgICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZ1bmN0aW9uIGxleCgpIHsKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW47CgkgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHN5bWJvbCwKCSAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCwKCSAgICAgICAgICAgICAgICBzdGF0ZSwKCSAgICAgICAgICAgICAgICBhY3Rpb24sCgkgICAgICAgICAgICAgICAgYSwKCSAgICAgICAgICAgICAgICByLAoJICAgICAgICAgICAgICAgIHl5dmFsID0ge30sCgkgICAgICAgICAgICAgICAgcCwKCSAgICAgICAgICAgICAgICBsZW4sCgkgICAgICAgICAgICAgICAgbmV3U3RhdGUsCgkgICAgICAgICAgICAgICAgZXhwZWN0ZWQ7CgkgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewoJICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CgkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwoJICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwgIWFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgZXJyU3RyID0gIiI7CgkgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewoJICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5FeHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxID8gImVuZCBvZiBpbnB1dCIgOiAiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IoZXJyU3RyLCB7IHRleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZCB9KTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1ib2wpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgewoJICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgoJICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CgkgICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9OwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAyKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMF0pOwoJICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CgkgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCgkgICAgdmFyIGxleGVyID0gKGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGxleGVyID0geyBFT0Y6IDEsCgkgICAgICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHNldElucHV0OiBmdW5jdGlvbiBzZXRJbnB1dChpbnB1dCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vID0gdGhpcy55eWxlbmcgPSAwOwoJICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdOwoJICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKzsKCSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOwoJICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CgkgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwoJICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKCSAgICAgICAgICAgICAgICBpZiAobGluZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKCgkgICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gY2g7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7CgkgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKCSAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwoKCSAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CgkgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3RoIC0gbGVuIC0gMSk7CgkgICAgICAgICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CgkgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwoJICAgICAgICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGggLSAxKTsKCSAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSAxKTsKCgkgICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTsKCSAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlOwoKCSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKCSAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KCSAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBtb3JlOiBmdW5jdGlvbiBtb3JlKCkgewoJICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIGxlc3MobikgewoJICAgICAgICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgcGFzdElucHV0OiBmdW5jdGlvbiBwYXN0SW5wdXQoKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhc3QgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGggLSB0aGlzLm1hdGNoLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLicgOiAnJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDsKCSAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkgewoJICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nIDogJycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7CgkgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKCSAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYyArICJeIjsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewoJICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwoKCSAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzOwoJICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkgewoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9ICcnOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpOwoJICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOwoJICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwoJICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CgkgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOwoJICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAoJICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSwKCSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKCSAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjtlbHNlIHJldHVybjsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CgkgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgKyAodGhpcy55eWxpbmVubyArIDEpICsgJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm8gfSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIGxleDogZnVuY3Rpb24gbGV4KCkgewoJICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CgkgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9LAoJICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwoJICAgICAgICAgICAgfSwKCSAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewoJICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlczsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTsKCSAgICAgICAgICAgIH0sCgkgICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgewoJICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTsKCSAgICAgICAgICAgIH0gfTsKCSAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9OwoJICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUCgkgICAgICAgIC8qKi8pIHsKCgkgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7CgkgICAgICAgICAgICB9CgoJICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDsKCSAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykgewoJICAgICAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSAiXFxcXCIpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpOwoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oIm11Iik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQpIHJldHVybiAxNTsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTtyZXR1cm4gMTU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNpbmcgYHRoaXMudG9wU3RhdGUoKWAgYmVsb3csIGJ1dCBpdCBjdXJyZW50bHkKCSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2Vjb25kIHRvcCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB0b3AuIE9wZW5lZCBhbgoJICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSBhYm91dCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vemFhY2gvamlzb24vaXNzdWVzLzI5MQoJICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdID09PSAncmF3JykgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDUsIHl5Xy55eWxlbmcgLSA5KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRU5EX1JBV19CTE9DSyc7CgkgICAgICAgICAgICAgICAgICAgIH0KCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDY6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY4OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDk6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMDoKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCdyYXcnKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIzOwoKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxMToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU1OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDEyOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjA7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE1OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE2OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDQ0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDE3OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzQ7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMTg6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAxOToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIwOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjE6CgkgICAgICAgICAgICAgICAgICAgIHRoaXMudW5wdXQoeXlfLnl5dGV4dCk7CgkgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTsKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbignY29tJyk7CgoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDIyOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKCgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjM6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDczOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI1OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzI7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMjY6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAyNzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg3OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI4OgoJICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZQoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDI5OgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDU0OwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMwOgoJICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMzOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMxOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwiL2csICciJyk7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFwnL2csICInIik7cmV0dXJuIDgwOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDMzOgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzQ6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzNToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM2OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gODM7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgMzc6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NDsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAzODoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDM5OgoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgNDA6CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiA3NzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MToKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcyOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlIDQyOgoJICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5yZXBsYWNlKC9cXChbXFxcXV0pL2csICckMScpO3JldHVybiA3MjsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0MzoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJTlZBTElEJzsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSA0NDoKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9OwoJICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywgL14oPzpbXlx4MDBdKykvLCAvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fFxcXHtce3xcXFxcXHtce3wkKSkpLywgL14oPzpce1x7XHtceyg/PVteXC9dKSkvLCAvXig/Olx7XHtce1x7XC9bXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz1bPX1cc1wvLl0pXH1cfVx9XH0pLywgL14oPzpbXlx4MDBdKj8oPz0oXHtce1x7XHspKSkvLCAvXig/Oltcc1xTXSo/LS0ofik/XH1cfSkvLCAvXig/OlwoKS8sIC9eKD86XCkpLywgL14oPzpce1x7XHtceykvLCAvXig/Olx9XH1cfVx9KS8sIC9eKD86XHtceyh+KT8+KS8sIC9eKD86XHtceyh+KT8jPikvLCAvXig/Olx7XHsofik/I1wqPykvLCAvXig/Olx7XHsofik/XC8pLywgL14oPzpce1x7KH4pP1xeXHMqKH4pP1x9XH0pLywgL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLCAvXig/Olx7XHsofik/XF4pLywgL14oPzpce1x7KH4pP1xzKmVsc2VcYikvLCAvXig/Olx7XHsofik/XHspLywgL14oPzpce1x7KH4pPyYpLywgL14oPzpce1x7KH4pPyEtLSkvLCAvXig/Olx7XHsofik/IVtcc1xTXSo/XH1cfSkvLCAvXig/Olx7XHsofik/XCo/KS8sIC9eKD86PSkvLCAvXig/OlwuXC4pLywgL14oPzpcLig/PShbPX59XHNcLy4pfF0pKSkvLCAvXig/OltcLy5dKS8sIC9eKD86XHMrKS8sIC9eKD86XH0ofik/XH1cfSkvLCAvXig/Oih+KT9cfVx9KS8sIC9eKD86IihcXFsiXXxbXiJdKSoiKS8sIC9eKD86JyhcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XHMpXSkpKS8sIC9eKD86ZmFsc2UoPz0oW359XHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XHMpXSkpKS8sIC9eKD86LT9bMC05XSsoPzpcLlswLTldKyk/KD89KFt+fVxzKV0pKSkvLCAvXig/OmFzXHMrXHwpLywgL14oPzpcfCkvLCAvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKXxdKSkpKS8sIC9eKD86XFsoXFxcXXxbXlxdXSkqXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTsKCSAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgIm11IjogeyAicnVsZXMiOiBbNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJlbXUiOiB7ICJydWxlcyI6IFsyXSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJjb20iOiB7ICJydWxlcyI6IFs2XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJyYXciOiB7ICJydWxlcyI6IFszLCA0LCA1XSwgImluY2x1c2l2ZSI6IGZhbHNlIH0sICJJTklUSUFMIjogeyAicnVsZXMiOiBbMCwgMSwgNDRdLCAiaW5jbHVzaXZlIjogdHJ1ZSB9IH07CgkgICAgICAgIHJldHVybiBsZXhlcjsKCSAgICB9KSgpOwoJICAgIHBhcnNlci5sZXhlciA9IGxleGVyOwoJICAgIGZ1bmN0aW9uIFBhcnNlcigpIHsKCSAgICAgICAgdGhpcy55eSA9IHt9OwoJICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7CgkgICAgcmV0dXJuIG5ldyBQYXJzZXIoKTsKCX0pKCk7ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IGhhbmRsZWJhcnM7CgovKioqLyB9LAovKiAyNCAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCgl2YXIgX3Zpc2l0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKCgl2YXIgX3Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlzaXRvcik7CgoJZnVuY3Rpb24gV2hpdGVzcGFjZUNvbnRyb2woKSB7CgkgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgoJICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJfQoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlID0gbmV3IF92aXNpdG9yMlsnZGVmYXVsdCddKCk7CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkgewoJICB2YXIgZG9TdGFuZGFsb25lID0gIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lOwoKCSAgdmFyIGlzUm9vdCA9ICF0aGlzLmlzUm9vdFNlZW47CgkgIHRoaXMuaXNSb290U2VlbiA9IHRydWU7CgoJICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTsKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSwKCSAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTsKCgkgICAgaWYgKCFzdHJpcCkgewoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgICB2YXIgX2lzUHJldldoaXRlc3BhY2UgPSBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksCgkgICAgICAgIF9pc05leHRXaGl0ZXNwYWNlID0gaXNOZXh0V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLAoJICAgICAgICBvcGVuU3RhbmRhbG9uZSA9IHN0cmlwLm9wZW5TdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlLAoJICAgICAgICBjbG9zZVN0YW5kYWxvbmUgPSBzdHJpcC5jbG9zZVN0YW5kYWxvbmUgJiYgX2lzTmV4dFdoaXRlc3BhY2UsCgkgICAgICAgIGlubGluZVN0YW5kYWxvbmUgPSBzdHJpcC5pbmxpbmVTdGFuZGFsb25lICYmIF9pc1ByZXZXaGl0ZXNwYWNlICYmIF9pc05leHRXaGl0ZXNwYWNlOwoKCSAgICBpZiAoc3RyaXAuY2xvc2UpIHsKCSAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTsKCSAgICB9CgkgICAgaWYgKHN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpOwoJICAgIH0KCgkgICAgaWYgKGRvU3RhbmRhbG9uZSAmJiBpbmxpbmVTdGFuZGFsb25lKSB7CgkgICAgICBvbWl0UmlnaHQoYm9keSwgaSk7CgoJICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7CgkgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzCgkgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50JykgewoJICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmUKCSAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcdF0rJCkvLmV4ZWMoYm9keVtpIC0gMV0ub3JpZ2luYWwpWzFdOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoJICAgIGlmIChkb1N0YW5kYWxvbmUgJiYgb3BlblN0YW5kYWxvbmUpIHsKCSAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7CgoJICAgICAgLy8gU3RyaXAgb3V0IHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkKCSAgICAgIG9taXRMZWZ0KGJvZHksIGkpOwoJICAgIH0KCSAgICBpZiAoZG9TdGFuZGFsb25lICYmIGNsb3NlU3RhbmRhbG9uZSkgewoJICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGUKCSAgICAgIG9taXRSaWdodChib2R5LCBpKTsKCgkgICAgICBvbWl0TGVmdCgoY3VycmVudC5pbnZlcnNlIHx8IGN1cnJlbnQucHJvZ3JhbSkuYm9keSk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gcHJvZ3JhbTsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLkRlY29yYXRvckJsb2NrID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykgewoJICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTsKCSAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7CgoJICAvLyBGaW5kIHRoZSBpbnZlcnNlIHByb2dyYW0gdGhhdCBpcyBpbnZvbGVkIHdpdGggd2hpdGVzcGFjZSBzdHJpcHBpbmcuCgkgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSB8fCBibG9jay5pbnZlcnNlLAoJICAgICAgaW52ZXJzZSA9IGJsb2NrLnByb2dyYW0gJiYgYmxvY2suaW52ZXJzZSwKCSAgICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UsCgkgICAgICBsYXN0SW52ZXJzZSA9IGludmVyc2U7CgoJICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHsKCSAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTsKCgkgICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uCgkgICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHsKCSAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07CgkgICAgfQoJICB9CgoJICB2YXIgc3RyaXAgPSB7CgkgICAgb3BlbjogYmxvY2sub3BlblN0cmlwLm9wZW4sCgkgICAgY2xvc2U6IGJsb2NrLmNsb3NlU3RyaXAuY2xvc2UsCgoJICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZQoJICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZQoJICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksCgkgICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSkKCSAgfTsKCgkgIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHsKCSAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgaWYgKGludmVyc2UpIHsKCSAgICB2YXIgaW52ZXJzZVN0cmlwID0gYmxvY2suaW52ZXJzZVN0cmlwOwoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHsKCSAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7CgkgICAgfQoKCSAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7CgkgICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpOwoJICAgIH0KCSAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgICB9CgoJICAgIC8vIEZpbmQgc3RhbmRhbG9uZSBlbHNlIHN0YXRtZW50cwoJICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUgJiYgaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7CgkgICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpOwoJICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTsKCSAgICB9CgkgIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7CgkgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTsKCSAgfQoKCSAgcmV0dXJuIHN0cmlwOwoJfTsKCglXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuRGVjb3JhdG9yID0gV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7CgkgIHJldHVybiBtdXN0YWNoZS5zdHJpcDsKCX07CgoJV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7CgkgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307CgkgIHJldHVybiB7CgkgICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSwKCSAgICBvcGVuOiBzdHJpcC5vcGVuLAoJICAgIGNsb3NlOiBzdHJpcC5jbG9zZQoJICB9OwoJfTsKCglmdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IGJvZHkubGVuZ3RoOwoJICB9CgoJICAvLyBOb2RlcyB0aGF0IGVuZCB3aXRoIG5ld2xpbmVzIGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgKGJ1dCBhcmUgc3BlY2lhbAoJICAvLyBjYXNlZCBmb3Igc3RyaXAgb3BlcmF0aW9ucykKCSAgdmFyIHByZXYgPSBib2R5W2kgLSAxXSwKCSAgICAgIHNpYmxpbmcgPSBib2R5W2kgLSAyXTsKCSAgaWYgKCFwcmV2KSB7CgkgICAgcmV0dXJuIGlzUm9vdDsKCSAgfQoKCSAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7CgkgICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXHI/XG5ccyo/JC8gOiAvKF58XHI/XG4pXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpOwoJICB9Cgl9CglmdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkgewoJICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7CgkgICAgaSA9IC0xOwoJICB9CgoJICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLAoJICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdOwoJICBpZiAoIW5leHQpIHsKCSAgICByZXR1cm4gaXNSb290OwoJICB9CgoJICBpZiAobmV4dC50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHsKCSAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9eXHMqP1xyP1xuLyA6IC9eXHMqPyhccj9cbnwkKS8pLnRlc3QobmV4dC5vcmlnaW5hbCk7CgkgIH0KCX0KCgkvLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLgoJLy8KCS8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlCgkvLyBjb250ZW50IGlzIG1ldC4KCWZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTsKCSAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHsKCSAgICByZXR1cm47CgkgIH0KCgkgIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7CgkgIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxzKy8gOiAvXlsgXHRdKlxyP1xuPy8sICcnKTsKCSAgY3VycmVudC5yaWdodFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7Cgl9CgoJLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuCgkvLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLgoJLy8KCS8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC4KCS8vCgkvLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZQoJLy8gY29udGVudCBpcyBtZXQuCglmdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkgewoJICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdOwoJICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7CgkgICAgcmV0dXJuOwoJICB9CgoJICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLgoJICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlOwoJICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xzKyQvIDogL1sgXHRdKyQvLCAnJyk7CgkgIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7CgkgIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjUgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gVmlzaXRvcigpIHsKCSAgdGhpcy5wYXJlbnRzID0gW107Cgl9CgoJVmlzaXRvci5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBWaXNpdG9yLAoJICBtdXRhdGluZzogZmFsc2UsCgoJICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgoJICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7CgkgICAgaWYgKHRoaXMubXV0YXRpbmcpIHsKCSAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazogVGhpcyBtYXkgaGF2ZSBhIGZldyBmYWxzZSBwb3NpdGl2ZXMgZm9yIHR5cGUgZm9yIHRoZSBoZWxwZXIKCSAgICAgIC8vIG1ldGhvZHMgYnV0IHdpbGwgZ2VuZXJhbGx5IGRvIHRoZSByaWdodCB0aGluZyB3aXRob3V0IGEgbG90IG9mIG92ZXJoZWFkLgoJICAgICAgaWYgKHZhbHVlICYmICFWaXNpdG9yLnByb3RvdHlwZVt2YWx1ZS50eXBlXSkgewoJICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBub2RlIHR5cGUgIicgKyB2YWx1ZS50eXBlICsgJyIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpOwoJICAgICAgfQoJICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlOwoJICAgIH0KCSAgfSwKCgkgIC8vIFBlcmZvcm1zIGFuIGFjY2VwdCBvcGVyYXRpb24gd2l0aCBhZGRlZCBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlCgkgIC8vIHJlcXVpcmVkIGtleXMgYXJlIG5vdCByZW1vdmVkLgoJICBhY2NlcHRSZXF1aXJlZDogZnVuY3Rpb24gYWNjZXB0UmVxdWlyZWQobm9kZSwgbmFtZSkgewoJICAgIHRoaXMuYWNjZXB0S2V5KG5vZGUsIG5hbWUpOwoKCSAgICBpZiAoIW5vZGVbbmFtZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkCgkgIC8vIGZvciBjaGlsZCBlbGVtZW50cy4KCSAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCSAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTsKCgkgICAgICBpZiAoIWFycmF5W2ldKSB7CgkgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKCSAgICAgICAgaS0tOwoJICAgICAgICBsLS07CgkgICAgICB9CgkgICAgfQoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7CgkgICAgaWYgKCFvYmplY3QpIHsKCSAgICAgIHJldHVybjsKCSAgICB9CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tvYmplY3QudHlwZV0pIHsKCSAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmtub3duIHR5cGU6ICcgKyBvYmplY3QudHlwZSwgb2JqZWN0KTsKCSAgICB9CgoJICAgIGlmICh0aGlzLmN1cnJlbnQpIHsKCSAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7CgkgICAgfQoJICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDsKCgkgICAgdmFyIHJldCA9IHRoaXNbb2JqZWN0LnR5cGVdKG9iamVjdCk7CgoJICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpOwoKCSAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7CgkgICAgICByZXR1cm4gcmV0OwoJICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkgewoJICAgICAgcmV0dXJuIG9iamVjdDsKCSAgICB9CgkgIH0sCgoJICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB0aGlzLmFjY2VwdEFycmF5KHByb2dyYW0uYm9keSk7CgkgIH0sCgoJICBNdXN0YWNoZVN0YXRlbWVudDogdmlzaXRTdWJFeHByZXNzaW9uLAoJICBEZWNvcmF0b3I6IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIEJsb2NrU3RhdGVtZW50OiB2aXNpdEJsb2NrLAoJICBEZWNvcmF0b3JCbG9jazogdmlzaXRCbG9jaywKCgkgIFBhcnRpYWxTdGF0ZW1lbnQ6IHZpc2l0UGFydGlhbCwKCSAgUGFydGlhbEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQocGFydGlhbCkgewoJICAgIHZpc2l0UGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwpOwoKCSAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAncHJvZ3JhbScpOwoJICB9LAoKCSAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIC8qIGNvbnRlbnQgKi97fSwKCSAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIC8qIGNvbW1lbnQgKi97fSwKCgkgIFN1YkV4cHJlc3Npb246IHZpc2l0U3ViRXhwcmVzc2lvbiwKCgkgIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIC8qIHBhdGggKi97fSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSAvKiBzdHJpbmcgKi97fSwKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIC8qIG51bWJlciAqL3t9LAoJICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSAvKiBib29sICove30sCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSAvKiBsaXRlcmFsICove30sCgkgIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIC8qIGxpdGVyYWwgKi97fSwKCgkgIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkgewoJICAgIHRoaXMuYWNjZXB0QXJyYXkoaGFzaC5wYWlycyk7CgkgIH0sCgkgIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihwYWlyKSB7CgkgICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYWlyLCAndmFsdWUnKTsKCSAgfQoJfTsKCglmdW5jdGlvbiB2aXNpdFN1YkV4cHJlc3Npb24obXVzdGFjaGUpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChtdXN0YWNoZSwgJ3BhdGgnKTsKCSAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpOwoJICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTsKCX0KCWZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2spIHsKCSAgdmlzaXRTdWJFeHByZXNzaW9uLmNhbGwodGhpcywgYmxvY2spOwoKCSAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7CgkgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpOwoJfQoJZnVuY3Rpb24gdmlzaXRQYXJ0aWFsKHBhcnRpYWwpIHsKCSAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpOwoJICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTsKCSAgdGhpcy5hY2NlcHRLZXkocGFydGlhbCwgJ2hhc2gnKTsKCX0KCglleHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yOwoJbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107CgovKioqLyB9LAovKiAyNiAqLwovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCgkndXNlIHN0cmljdCc7CgoJdmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpWydkZWZhdWx0J107CgoJZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKCWV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjsKCWV4cG9ydHMuaWQgPSBpZDsKCWV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7CglleHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDsKCWV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDsKCWV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlOwoJZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7CglleHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jazsKCWV4cG9ydHMucHJlcGFyZVByb2dyYW0gPSBwcmVwYXJlUHJvZ3JhbTsKCWV4cG9ydHMucHJlcGFyZVBhcnRpYWxCbG9jayA9IHByZXBhcmVQYXJ0aWFsQmxvY2s7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJZnVuY3Rpb24gdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSkgewoJICBjbG9zZSA9IGNsb3NlLnBhdGggPyBjbG9zZS5wYXRoLm9yaWdpbmFsIDogY2xvc2U7CgoJICBpZiAob3Blbi5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkgewoJICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3Blbi5wYXRoLmxvYyB9OwoKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuLnBhdGgub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLCBlcnJvck5vZGUpOwoJICB9Cgl9CgoJZnVuY3Rpb24gU291cmNlTG9jYXRpb24oc291cmNlLCBsb2NJbmZvKSB7CgkgIHRoaXMuc291cmNlID0gc291cmNlOwoJICB0aGlzLnN0YXJ0ID0gewoJICAgIGxpbmU6IGxvY0luZm8uZmlyc3RfbGluZSwKCSAgICBjb2x1bW46IGxvY0luZm8uZmlyc3RfY29sdW1uCgkgIH07CgkgIHRoaXMuZW5kID0gewoJICAgIGxpbmU6IGxvY0luZm8ubGFzdF9saW5lLAoJICAgIGNvbHVtbjogbG9jSW5mby5sYXN0X2NvbHVtbgoJICB9OwoJfQoKCWZ1bmN0aW9uIGlkKHRva2VuKSB7CgkgIGlmICgvXlxbLipcXSQvLnRlc3QodG9rZW4pKSB7CgkgICAgcmV0dXJuIHRva2VuLnN1YnN0cigxLCB0b2tlbi5sZW5ndGggLSAyKTsKCSAgfSBlbHNlIHsKCSAgICByZXR1cm4gdG9rZW47CgkgIH0KCX0KCglmdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7CgkgIHJldHVybiB7CgkgICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JywKCSAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnficKCSAgfTsKCX0KCglmdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkgewoJICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXHtce34/XCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1x9XH0kLywgJycpOwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2MpIHsKCSAgbG9jID0gdGhpcy5sb2NJbmZvKGxvYyk7CgoJICB2YXIgb3JpZ2luYWwgPSBkYXRhID8gJ0AnIDogJycsCgkgICAgICBkaWcgPSBbXSwKCSAgICAgIGRlcHRoID0gMCwKCSAgICAgIGRlcHRoU3RyaW5nID0gJyc7CgoJICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCwKCgkgICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycywKCSAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddCgkgICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7CgkgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0OwoKCSAgICBpZiAoIWlzTGl0ZXJhbCAmJiAocGFydCA9PT0gJy4uJyB8fCBwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJ3RoaXMnKSkgewoJICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7CgkgICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHBhdGg6ICcgKyBvcmlnaW5hbCwgeyBsb2M6IGxvYyB9KTsKCSAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykgewoJICAgICAgICBkZXB0aCsrOwoJICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJzsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZGlnLnB1c2gocGFydCk7CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsCgkgICAgZGF0YTogZGF0YSwKCSAgICBkZXB0aDogZGVwdGgsCgkgICAgcGFydHM6IGRpZywKCSAgICBvcmlnaW5hbDogb3JpZ2luYWwsCgkgICAgbG9jOiBsb2MKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewoJICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKCSAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSwKCSAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnOwoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuKTsKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiBkZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6ICdNdXN0YWNoZVN0YXRlbWVudCcsCgkgICAgcGF0aDogcGF0aCwKCSAgICBwYXJhbXM6IHBhcmFtcywKCSAgICBoYXNoOiBoYXNoLAoJICAgIGVzY2FwZWQ6IGVzY2FwZWQsCgkgICAgc3RyaXA6IHN0cmlwLAoJICAgIGxvYzogdGhpcy5sb2NJbmZvKGxvY0luZm8pCgkgIH07Cgl9CgoJZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudHMsIGNsb3NlLCBsb2NJbmZvKSB7CgkgIHZhbGlkYXRlQ2xvc2Uob3BlblJhd0Jsb2NrLCBjbG9zZSk7CgoJICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pOwoJICB2YXIgcHJvZ3JhbSA9IHsKCSAgICB0eXBlOiAnUHJvZ3JhbScsCgkgICAgYm9keTogY29udGVudHMsCgkgICAgc3RyaXA6IHt9LAoJICAgIGxvYzogbG9jSW5mbwoJICB9OwoKCSAgcmV0dXJuIHsKCSAgICB0eXBlOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5SYXdCbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlblJhd0Jsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuUmF3QmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDoge30sCgkgICAgaW52ZXJzZVN0cmlwOiB7fSwKCSAgICBjbG9zZVN0cmlwOiB7fSwKCSAgICBsb2M6IGxvY0luZm8KCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7CgkgIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoKSB7CgkgICAgdmFsaWRhdGVDbG9zZShvcGVuQmxvY2ssIGNsb3NlKTsKCSAgfQoKCSAgdmFyIGRlY29yYXRvciA9IC9cKi8udGVzdChvcGVuQmxvY2sub3Blbik7CgoJICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zOwoKCSAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsCgkgICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7CgoJICBpZiAoaW52ZXJzZUFuZFByb2dyYW0pIHsKCSAgICBpZiAoZGVjb3JhdG9yKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5leHBlY3RlZCBpbnZlcnNlIGJsb2NrIG9uIGRlY29yYXRvcicsIGludmVyc2VBbmRQcm9ncmFtKTsKCSAgICB9CgoJICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikgewoJICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDsKCSAgICB9CgoJICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwOwoJICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtOwoJICB9CgoJICBpZiAoaW52ZXJ0ZWQpIHsKCSAgICBpbnZlcnRlZCA9IGludmVyc2U7CgkgICAgaW52ZXJzZSA9IHByb2dyYW07CgkgICAgcHJvZ3JhbSA9IGludmVydGVkOwoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6IGRlY29yYXRvciA/ICdEZWNvcmF0b3JCbG9jaycgOiAnQmxvY2tTdGF0ZW1lbnQnLAoJICAgIHBhdGg6IG9wZW5CbG9jay5wYXRoLAoJICAgIHBhcmFtczogb3BlbkJsb2NrLnBhcmFtcywKCSAgICBoYXNoOiBvcGVuQmxvY2suaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIGludmVyc2U6IGludmVyc2UsCgkgICAgb3BlblN0cmlwOiBvcGVuQmxvY2suc3RyaXAsCgkgICAgaW52ZXJzZVN0cmlwOiBpbnZlcnNlU3RyaXAsCgkgICAgY2xvc2VTdHJpcDogY2xvc2UgJiYgY2xvc2Uuc3RyaXAsCgkgICAgbG9jOiB0aGlzLmxvY0luZm8obG9jSW5mbykKCSAgfTsKCX0KCglmdW5jdGlvbiBwcmVwYXJlUHJvZ3JhbShzdGF0ZW1lbnRzLCBsb2MpIHsKCSAgaWYgKCFsb2MgJiYgc3RhdGVtZW50cy5sZW5ndGgpIHsKCSAgICB2YXIgZmlyc3RMb2MgPSBzdGF0ZW1lbnRzWzBdLmxvYywKCSAgICAgICAgbGFzdExvYyA9IHN0YXRlbWVudHNbc3RhdGVtZW50cy5sZW5ndGggLSAxXS5sb2M7CgoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCgkgICAgaWYgKGZpcnN0TG9jICYmIGxhc3RMb2MpIHsKCSAgICAgIGxvYyA9IHsKCSAgICAgICAgc291cmNlOiBmaXJzdExvYy5zb3VyY2UsCgkgICAgICAgIHN0YXJ0OiB7CgkgICAgICAgICAgbGluZTogZmlyc3RMb2Muc3RhcnQubGluZSwKCSAgICAgICAgICBjb2x1bW46IGZpcnN0TG9jLnN0YXJ0LmNvbHVtbgoJICAgICAgICB9LAoJICAgICAgICBlbmQ6IHsKCSAgICAgICAgICBsaW5lOiBsYXN0TG9jLmVuZC5saW5lLAoJICAgICAgICAgIGNvbHVtbjogbGFzdExvYy5lbmQuY29sdW1uCgkgICAgICAgIH0KCSAgICAgIH07CgkgICAgfQoJICB9CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQcm9ncmFtJywKCSAgICBib2R5OiBzdGF0ZW1lbnRzLAoJICAgIHN0cmlwOiB7fSwKCSAgICBsb2M6IGxvYwoJICB9OwoJfQoKCWZ1bmN0aW9uIHByZXBhcmVQYXJ0aWFsQmxvY2sob3BlbiwgcHJvZ3JhbSwgY2xvc2UsIGxvY0luZm8pIHsKCSAgdmFsaWRhdGVDbG9zZShvcGVuLCBjbG9zZSk7CgoJICByZXR1cm4gewoJICAgIHR5cGU6ICdQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQnLAoJICAgIG5hbWU6IG9wZW4ucGF0aCwKCSAgICBwYXJhbXM6IG9wZW4ucGFyYW1zLAoJICAgIGhhc2g6IG9wZW4uaGFzaCwKCSAgICBwcm9ncmFtOiBwcm9ncmFtLAoJICAgIG9wZW5TdHJpcDogb3Blbi5zdHJpcCwKCSAgICBjbG9zZVN0cmlwOiBjbG9zZSAmJiBjbG9zZS5zdHJpcCwKCSAgICBsb2M6IHRoaXMubG9jSW5mbyhsb2NJbmZvKQoJICB9OwoJfQoKLyoqKi8gfSwKLyogMjcgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqLwoKCSd1c2Ugc3RyaWN0JzsKCgl2YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSlbJ2RlZmF1bHQnXTsKCglleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwoJZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyOwoJZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTsKCWV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7CgoJdmFyIF9leGNlcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKCXZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIF9hc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTsKCgl2YXIgX2FzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3QpOwoKCXZhciBzbGljZSA9IFtdLnNsaWNlOwoKCWZ1bmN0aW9uIENvbXBpbGVyKCkge30KCgkvLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYQoJLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2gKCS8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAoJLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuCgoJQ29tcGlsZXIucHJvdG90eXBlID0gewoJICBjb21waWxlcjogQ29tcGlsZXIsCgoJICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewoJICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwoJICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CgkgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAoJICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTsKCSAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZAoJICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuCgkgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHsKCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRydWU7CgkgIH0sCgoJICBndWlkOiAwLAoKCSAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7CgkgICAgdGhpcy5zb3VyY2VOb2RlID0gW107CgkgICAgdGhpcy5vcGNvZGVzID0gW107CgkgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwoJICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkczsKCgkgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9IG9wdGlvbnMuYmxvY2tQYXJhbXMgfHwgW107CgoJICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHMKCSAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7CgkgICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7CgkgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCgkgICAgICAnYmxvY2tIZWxwZXJNaXNzaW5nJzogdHJ1ZSwKCSAgICAgICdlYWNoJzogdHJ1ZSwKCSAgICAgICdpZic6IHRydWUsCgkgICAgICAndW5sZXNzJzogdHJ1ZSwKCSAgICAgICd3aXRoJzogdHJ1ZSwKCSAgICAgICdsb2cnOiB0cnVlLAoJICAgICAgJ2xvb2t1cCc6IHRydWUKCSAgICB9OwoJICAgIGlmIChrbm93bkhlbHBlcnMpIHsKCSAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykgewoJICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwoJICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7CgkgICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwoJICB9LAoKCSAgY29tcGlsZVByb2dyYW06IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKHByb2dyYW0pIHsKCSAgICB2YXIgY2hpbGRDb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCksCgkgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcAoJICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLAoJICAgICAgICBndWlkID0gdGhpcy5ndWlkKys7CgoJICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDsKCgkgICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDsKCSAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7CgoJICAgIHJldHVybiBndWlkOwoJICB9LAoKCSAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkgewoJICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBTYW5pdHkgY29kZSAqLwoJICAgIGlmICghdGhpc1tub2RlLnR5cGVdKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTsKCSAgICB9CgoJICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpOwoJICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7CgkgICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7CgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkgewoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpOwoKCSAgICB2YXIgYm9keSA9IHByb2dyYW0uYm9keSwKCSAgICAgICAgYm9keUxlbmd0aCA9IGJvZHkubGVuZ3RoOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLmFjY2VwdChib2R5W2ldKTsKCSAgICB9CgoJICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpOwoKCSAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDsKCgkgICAgcmV0dXJuIHRoaXM7CgkgIH0sCgoJICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTsKCgkgICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLAoJICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKCgkgICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTsKCSAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwoKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7CgoJICAgIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7CgoJICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwoJICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCgkgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwoJICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTsKCSAgICB9CgoJICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgfSwKCgkgIERlY29yYXRvckJsb2NrOiBmdW5jdGlvbiBEZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpIHsKCSAgICB2YXIgcHJvZ3JhbSA9IGRlY29yYXRvci5wcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0oZGVjb3JhdG9yLnByb2dyYW0pOwoJICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGRlY29yYXRvciwgcHJvZ3JhbSwgdW5kZWZpbmVkKSwKCSAgICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoOwoKCSAgICB0aGlzLnVzZURlY29yYXRvcnMgPSB0cnVlOwoJICAgIHRoaXMub3Bjb2RlKCdyZWdpc3RlckRlY29yYXRvcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwpOwoJICB9LAoKCSAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7CgkgICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTsKCgkgICAgdmFyIHByb2dyYW0gPSBwYXJ0aWFsLnByb2dyYW07CgkgICAgaWYgKHByb2dyYW0pIHsKCSAgICAgIHByb2dyYW0gPSB0aGlzLmNvbXBpbGVQcm9ncmFtKHBhcnRpYWwucHJvZ3JhbSk7CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gcGFydGlhbC5wYXJhbXM7CgkgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiAnICsgcGFyYW1zLmxlbmd0aCwgcGFydGlhbCk7CgkgICAgfSBlbHNlIGlmICghcGFyYW1zLmxlbmd0aCkgewoJICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0KSB7CgkgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICd1bmRlZmluZWQnKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTsKCSAgICAgIH0KCSAgICB9CgoJICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwubmFtZS5vcmlnaW5hbCwKCSAgICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJzsKCSAgICBpZiAoaXNEeW5hbWljKSB7CgkgICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpOwoJICAgIH0KCgkgICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCBwcm9ncmFtLCB1bmRlZmluZWQsIHRydWUpOwoKCSAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7CgkgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkgewoJICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpOwoJICAgICAgaW5kZW50ID0gJyc7CgkgICAgfQoKCSAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7CgkgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwoJICB9LAoJICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxCbG9ja1N0YXRlbWVudChwYXJ0aWFsQmxvY2spIHsKCSAgICB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbEJsb2NrKTsKCSAgfSwKCgkgIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkgewoJICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7CgoJICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKCSAgICB9CgkgIH0sCgkgIERlY29yYXRvcjogZnVuY3Rpb24gRGVjb3JhdG9yKGRlY29yYXRvcikgewoJICAgIHRoaXMuRGVjb3JhdG9yQmxvY2soZGVjb3JhdG9yKTsKCSAgfSwKCgkgIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoY29udGVudCkgewoJICAgIGlmIChjb250ZW50LnZhbHVlKSB7CgkgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGNvbnRlbnQudmFsdWUpOwoJICAgIH0KCSAgfSwKCgkgIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSwKCgkgIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHsKCSAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTsKCSAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CgoJICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgewoJICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykgewoJICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwoJICAgIH0KCSAgfSwKCSAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uIGFtYmlndW91c1NleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhdGggPSBzZXhwci5wYXRoLAoJICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXSwKCSAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7CgoJICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwoJICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwoKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgoJICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTsKCSAgfSwKCgkgIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikgewoJICAgIHZhciBwYXRoID0gc2V4cHIucGF0aDsKCSAgICBwYXRoLnN0cmljdCA9IHRydWU7CgkgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpOwoJICB9LAoKCSAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uIGhlbHBlclNleHByKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CgkgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpLAoJICAgICAgICBwYXRoID0gc2V4cHIucGF0aCwKCSAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF07CgoJICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTsKCSAgICB9IGVsc2UgewoJICAgICAgcGF0aC5zdHJpY3QgPSB0cnVlOwoJICAgICAgcGF0aC5mYWxzeSA9IHRydWU7CgoJICAgICAgdGhpcy5hY2NlcHQocGF0aCk7CgkgICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTsKCSAgICB9CgkgIH0sCgoJICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24ocGF0aCkgewoJICAgIHRoaXMuYWRkRGVwdGgocGF0aC5kZXB0aCk7CgkgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTsKCgkgICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLAoJICAgICAgICBzY29wZWQgPSBfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksCgkgICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7CgoJICAgIGlmIChibG9ja1BhcmFtSWQpIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTsKCSAgICB9IGVsc2UgaWYgKCFuYW1lKSB7CgkgICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWAKCSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpOwoJICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7CgkgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7CgkgICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMsIHBhdGguc3RyaWN0KTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHBhdGguc3RyaWN0LCBzY29wZWQpOwoJICAgIH0KCSAgfSwKCgkgIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpOwoJICB9LAoKCSAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpOwoJICB9LAoKCSAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKGJvb2wpIHsKCSAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLnZhbHVlKTsKCSAgfSwKCgkgIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpOwoJICB9LAoKCSAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkgewoJICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7CgkgIH0sCgoJICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHsKCSAgICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLAoJICAgICAgICBpID0gMCwKCSAgICAgICAgbCA9IHBhaXJzLmxlbmd0aDsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CgoJICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CgkgICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7CgkgICAgfQoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpOwoJICAgIH0KCSAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpOwoJICB9LAoKCSAgLy8gSEVMUEVSUwoJICBvcGNvZGU6IGZ1bmN0aW9uIG9wY29kZShuYW1lKSB7CgkgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbG9jOiB0aGlzLnNvdXJjZU5vZGVbMF0ubG9jIH0pOwoJICB9LAoKCSAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7CgkgICAgaWYgKCFkZXB0aCkgewoJICAgICAgcmV0dXJuOwoJICAgIH0KCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlOwoJICB9LAoKCSAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24gY2xhc3NpZnlTZXhwcihzZXhwcikgewoJICAgIHZhciBpc1NpbXBsZSA9IF9hc3QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTsKCgkgICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7CgoJICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOgoJICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQoJICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX2FzdDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpOwoKCSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKCSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgoJICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KCSAgICB2YXIgaXNFbGlnaWJsZSA9ICFpc0Jsb2NrUGFyYW0gJiYgKGlzSGVscGVyIHx8IGlzU2ltcGxlKTsKCgkgICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vdwoJICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy4KCSAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKCSAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLAoJICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHsKCSAgICAgICAgaXNIZWxwZXIgPSB0cnVlOwoJICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKCSAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKGlzSGVscGVyKSB7CgkgICAgICByZXR1cm4gJ2hlbHBlcic7CgkgICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7CgkgICAgICByZXR1cm4gJ2FtYmlndW91cyc7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiAnc2ltcGxlJzsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykgewoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTsKCSAgICB9CgkgIH0sCgoJICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHsKCSAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJzsKCgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBpZiAodmFsdWUucmVwbGFjZSkgewoJICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXC4/XC5cLykqL2csICcnKS5yZXBsYWNlKC9cLy9nLCAnLicpOwoJICAgICAgfQoKCSAgICAgIGlmICh2YWwuZGVwdGgpIHsKCSAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwoJICAgICAgfQoJICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7CgkgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTsKCgkgICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KCSAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLgoJICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgICAgfQoJICAgIH0gZWxzZSB7CgkgICAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgICB2YXIgYmxvY2tQYXJhbUluZGV4ID0gdW5kZWZpbmVkOwoJICAgICAgICBpZiAodmFsLnBhcnRzICYmICFfYXN0MlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQodmFsKSAmJiAhdmFsLmRlcHRoKSB7CgkgICAgICAgICAgYmxvY2tQYXJhbUluZGV4ID0gdGhpcy5ibG9ja1BhcmFtSW5kZXgodmFsLnBhcnRzWzBdKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoYmxvY2tQYXJhbUluZGV4KSB7CgkgICAgICAgICAgdmFyIGJsb2NrUGFyYW1DaGlsZCA9IHZhbC5wYXJ0cy5zbGljZSgxKS5qb2luKCcuJyk7CgkgICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsICdCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUluZGV4LCBibG9ja1BhcmFtQ2hpbGQpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHZhbHVlID0gdmFsLm9yaWdpbmFsIHx8IHZhbHVlOwoJICAgICAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7CgkgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL150aGlzKD86XC58JCkvLCAnJykucmVwbGFjZSgvXlwuXC8vLCAnJykucmVwbGFjZSgvXlwuJC8sICcnKTsKCSAgICAgICAgICB9CgoJICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICB0aGlzLmFjY2VwdCh2YWwpOwoJICAgIH0KCSAgfSwKCgkgIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7CgkgICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtczsKCSAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKCgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CgkgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CgoJICAgIGlmIChzZXhwci5oYXNoKSB7CgkgICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7CgkgICAgfQoKCSAgICByZXR1cm4gcGFyYW1zOwoJICB9LAoKCSAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbiBibG9ja1BhcmFtSW5kZXgobmFtZSkgewoJICAgIGZvciAodmFyIGRlcHRoID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDsgZGVwdGggPCBsZW47IGRlcHRoKyspIHsKCSAgICAgIHZhciBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sCgkgICAgICAgICAgcGFyYW0gPSBibG9ja1BhcmFtcyAmJiBfdXRpbHMuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7CgkgICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkgewoJICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07CgkgICAgICB9CgkgICAgfQoJICB9Cgl9OwoKCWZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikgewoJICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykgewoJICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpOwoJICB9CgoJICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLAoJICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwoJICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTsKCX0KCglmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKCSAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9OwoKCSAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHsKCSAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTsKCSAgfQoKCSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7CgkgICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTsKCSAgfQoJICBpZiAob3B0aW9ucy5jb21wYXQpIHsKCSAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7CgkgIH0KCgkgIHZhciBjb21waWxlZCA9IHVuZGVmaW5lZDsKCgkgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKCSAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSwKCSAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLAoJICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CgkgICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOwoJICB9CgoJICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCgkgIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTsKCSAgfQoJICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykgewoJICAgIGlmICghY29tcGlsZWQpIHsKCSAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7CgkgICAgfQoJICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTsKCSAgfTsKCSAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7CgkgICAgaWYgKCFjb21waWxlZCkgewoJICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKCSAgICB9CgkgICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTsKCSAgfTsKCSAgcmV0dXJuIHJldDsKCX0KCglmdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikgewoJICBpZiAoYSA9PT0gYikgewoJICAgIHJldHVybiB0cnVlOwoJICB9CgoJICBpZiAoX3V0aWxzLmlzQXJyYXkoYSkgJiYgX3V0aWxzLmlzQXJyYXkoYikgJiYgYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7CgkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICBpZiAoIWFyZ0VxdWFscyhhW2ldLCBiW2ldKSkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICB9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJICB9Cgl9CgoJZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikgewoJICBpZiAoIXNleHByLnBhdGgucGFydHMpIHsKCSAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7CgkgICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3QKCSAgICAvLyBvZiB0aGUgc3lzdGVtLgoJICAgIHNleHByLnBhdGggPSB7CgkgICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLAoJICAgICAgZGF0YTogZmFsc2UsCgkgICAgICBkZXB0aDogMCwKCSAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwKCSAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsCgkgICAgICBsb2M6IGxpdGVyYWwubG9jCgkgICAgfTsKCSAgfQoJfQoKLyoqKi8gfSwKLyogMjggKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJJ3VzZSBzdHJpY3QnOwoKCXZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVsnZGVmYXVsdCddOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF9iYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKCgl2YXIgX2V4Y2VwdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CgoJdmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTsKCgl2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKCgl2YXIgX2NvZGVHZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTsKCgl2YXIgX2NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29kZUdlbik7CgoJZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewoJICB0aGlzLnZhbHVlID0gdmFsdWU7Cgl9CgoJZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge30KCglKYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gewoJICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCgkgIC8vIGFsdGVybmF0aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGljcwoJICBuYW1lTG9va3VwOiBmdW5jdGlvbiBuYW1lTG9va3VwKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewoJICAgIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKCSAgICAgIHJldHVybiBbcGFyZW50LCAnLicsIG5hbWVdOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gW3BhcmVudCwgJ1snLCBKU09OLnN0cmluZ2lmeShuYW1lKSwgJ10nXTsKCSAgICB9CgkgIH0sCgkgIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkgewoJICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ2NvbnRhaW5lci5sb29rdXAnKSwgJyhkZXB0aHMsICInLCBuYW1lLCAnIiknXTsKCSAgfSwKCgkgIGNvbXBpbGVySW5mbzogZnVuY3Rpb24gY29tcGlsZXJJbmZvKCkgewoJICAgIHZhciByZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OLAoJICAgICAgICB2ZXJzaW9ucyA9IF9iYXNlLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwoJICAgIHJldHVybiBbcmV2aXNpb24sIHZlcnNpb25zXTsKCSAgfSwKCgkgIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkgewoJICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuCgkgICAgaWYgKCFfdXRpbHMuaXNBcnJheShzb3VyY2UpKSB7CgkgICAgICBzb3VyY2UgPSBbc291cmNlXTsKCSAgICB9CgkgICAgc291cmNlID0gdGhpcy5zb3VyY2Uud3JhcChzb3VyY2UsIGxvY2F0aW9uKTsKCgkgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107CgkgICAgfSBlbHNlIGlmIChleHBsaWNpdCkgewoJICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlcgoJICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlcgoJICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCgkgICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddOwoJICAgIH0gZWxzZSB7CgkgICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlOwoJICAgICAgcmV0dXJuIHNvdXJjZTsKCSAgICB9CgkgIH0sCgoJICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkgewoJICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7CgkgIH0sCgkgIC8vIEVORCBQVUJMSUMgQVBJCgoJICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewoJICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gdGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtczsKCSAgICB0aGlzLnRyYWNrSWRzID0gdGhpcy5vcHRpb25zLnRyYWNrSWRzOwoJICAgIHRoaXMucHJlY29tcGlsZSA9ICFhc09iamVjdDsKCgkgICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lOwoJICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKCSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKCSAgICAgIGRlY29yYXRvcnM6IFtdLAoJICAgICAgcHJvZ3JhbXM6IFtdLAoJICAgICAgZW52aXJvbm1lbnRzOiBbXQoJICAgIH07CgoJICAgIHRoaXMucHJlYW1ibGUoKTsKCgkgICAgdGhpcy5zdGFja1Nsb3QgPSAwOwoJICAgIHRoaXMuc3RhY2tWYXJzID0gW107CgkgICAgdGhpcy5hbGlhc2VzID0ge307CgkgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CgkgICAgdGhpcy5oYXNoZXMgPSBbXTsKCSAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107CgoJICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTsKCgkgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBlbnZpcm9ubWVudC51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVjb3JhdG9ycyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0OwoJICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zOwoKCSAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsCgkgICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCwKCSAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsCgkgICAgICAgIGkgPSB1bmRlZmluZWQsCgkgICAgICAgIGwgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAoaSA9IDAsIGwgPSBvcGNvZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKCgkgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jOwoJICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jOwoJICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7CgkgICAgfQoKCSAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuCgkgICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7CgkgICAgdGhpcy5wdXNoU291cmNlKCcnKTsKCgkgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKCSAgICB9CgoJICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmlzRW1wdHkoKSkgewoJICAgICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTsKCgkgICAgICB0aGlzLmRlY29yYXRvcnMucHJlcGVuZCgndmFyIGRlY29yYXRvcnMgPSBjb250YWluZXIuZGVjb3JhdG9ycztcbicpOwoJICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ3JldHVybiBmbjsnKTsKCgkgICAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzID0gRnVuY3Rpb24uYXBwbHkodGhpcywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCAnZGVwdGgwJywgJ2RhdGEnLCAnYmxvY2tQYXJhbXMnLCAnZGVwdGhzJywgdGhpcy5kZWNvcmF0b3JzLm1lcmdlKCldKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMuZGVjb3JhdG9ycy5wcmVwZW5kKCdmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGgwLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4nKTsKCSAgICAgICAgdGhpcy5kZWNvcmF0b3JzLnB1c2goJ31cbicpOwoJICAgICAgICB0aGlzLmRlY29yYXRvcnMgPSB0aGlzLmRlY29yYXRvcnMubWVyZ2UoKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5kZWNvcmF0b3JzID0gdW5kZWZpbmVkOwoJICAgIH0KCgkgICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwoJICAgIGlmICghdGhpcy5pc0NoaWxkKSB7CgkgICAgICB2YXIgcmV0ID0gewoJICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSwKCSAgICAgICAgbWFpbjogZm4KCSAgICAgIH07CgoJICAgICAgaWYgKHRoaXMuZGVjb3JhdG9ycykgewoJICAgICAgICByZXQubWFpbl9kID0gdGhpcy5kZWNvcmF0b3JzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZQoJICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICB9CgoJICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0OwoJICAgICAgdmFyIHByb2dyYW1zID0gX2NvbnRleHQucHJvZ3JhbXM7CgkgICAgICB2YXIgZGVjb3JhdG9ycyA9IF9jb250ZXh0LmRlY29yYXRvcnM7CgoJICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHsKCSAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTsKCSAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXSkgewoJICAgICAgICAgICAgcmV0W2kgKyAnX2QnXSA9IGRlY29yYXRvcnNbaV07CgkgICAgICAgICAgICByZXQudXNlRGVjb3JhdG9ycyA9IHRydWU7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgewoJICAgICAgICByZXQudXNlUGFydGlhbCA9IHRydWU7CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsKCSAgICAgICAgcmV0LnVzZURhdGEgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICAgIHJldC51c2VEZXB0aHMgPSB0cnVlOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHsKCSAgICAgICAgcmV0LnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCSAgICAgIH0KCSAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICAgIHJldC5jb21wYXQgPSB0cnVlOwoJICAgICAgfQoKCSAgICAgIGlmICghYXNPYmplY3QpIHsKCSAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTsKCgkgICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTsKCSAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7CgoJICAgICAgICBpZiAob3B0aW9ucy5zcmNOYW1lKSB7CgkgICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7IGZpbGU6IG9wdGlvbnMuZGVzdE5hbWUgfSk7CgkgICAgICAgICAgcmV0Lm1hcCA9IHJldC5tYXAgJiYgcmV0Lm1hcC50b1N0cmluZygpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXQuY29tcGlsZXJPcHRpb25zID0gdGhpcy5vcHRpb25zOwoJICAgICAgfQoKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiBmbjsKCSAgICB9CgkgIH0sCgoJICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7CgkgICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGUKCSAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAoJICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwoJICAgIHRoaXMuc291cmNlID0gbmV3IF9jb2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTsKCSAgICB0aGlzLmRlY29yYXRvcnMgPSBuZXcgX2NvZGVHZW4yWydkZWZhdWx0J10odGhpcy5vcHRpb25zLnNyY05hbWUpOwoJICB9LAoKCSAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHsKCSAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7CgoJICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7CgkgICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7CgkgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpOwoJICAgIH0KCgkgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCgkgICAgLy8KCSAgICAvLyBXaGVuIHVzaW5nIHRydWUgU291cmNlTm9kZXMsIHRoaXMgd2lsbCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGFsaWFzCgkgICAgLy8gYXMgdGhlIHNvdXJjZSBub2RlcyBhcmUgcmV1c2VkIGluIHNpdHUuIEZvciB0aGUgbm9uLXNvdXJjZSBub2RlIGNvbXBpbGF0aW9uIG1vZGUsCgkgICAgLy8gYWxpYXNlcyB3aWxsIG5vdCBiZSB1c2VkLCBidXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgYmVpbmcgcnVuIG9uIHRoZSBjbGllbnQgYW5kCgkgICAgLy8gd2UgYXJlbid0IGNvbmNlcm4gYWJvdXQgbWluaW1pemluZyB0aGUgdGVtcGxhdGUgc2l6ZS4KCSAgICB2YXIgYWxpYXNDb3VudCA9IDA7CgkgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5hbGlhc2VzKSB7CgkgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGd1YXJkLWZvci1pbgoJICAgICAgdmFyIG5vZGUgPSB0aGlzLmFsaWFzZXNbYWxpYXNdOwoKCSAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHsKCSAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzOwoJICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcGFyYW1zID0gWydjb250YWluZXInLCAnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddOwoKCSAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpOwoJICAgIH0KCgkgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKCSAgICB2YXIgc291cmNlID0gdGhpcy5tZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpOwoKCSAgICBpZiAoYXNPYmplY3QpIHsKCSAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7CgoJICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xuICAnLCBzb3VyY2UsICd9J10pOwoJICAgIH0KCSAgfSwKCSAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uIG1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucykgewoJICAgIHZhciBpc1NpbXBsZSA9IHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUsCgkgICAgICAgIGFwcGVuZE9ubHkgPSAhdGhpcy5mb3JjZUJ1ZmZlciwKCSAgICAgICAgYXBwZW5kRmlyc3QgPSB1bmRlZmluZWQsCgkgICAgICAgIHNvdXJjZVNlZW4gPSB1bmRlZmluZWQsCgkgICAgICAgIGJ1ZmZlclN0YXJ0ID0gdW5kZWZpbmVkLAoJICAgICAgICBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgdGhpcy5zb3VyY2UuZWFjaChmdW5jdGlvbiAobGluZSkgewoJICAgICAgaWYgKGxpbmUuYXBwZW5kVG9CdWZmZXIpIHsKCSAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7CgkgICAgICAgICAgbGluZS5wcmVwZW5kKCcgICsgJyk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBsaW5lOwoJICAgICAgICB9CgkgICAgICAgIGJ1ZmZlckVuZCA9IGxpbmU7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgICBpZiAoIXNvdXJjZVNlZW4pIHsKCSAgICAgICAgICAgIGFwcGVuZEZpcnN0ID0gdHJ1ZTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgnYnVmZmVyICs9ICcpOwoJICAgICAgICAgIH0KCSAgICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICAgICAgYnVmZmVyU3RhcnQgPSBidWZmZXJFbmQgPSB1bmRlZmluZWQ7CgkgICAgICAgIH0KCgkgICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlOwoJICAgICAgICBpZiAoIWlzU2ltcGxlKSB7CgkgICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSk7CgoJICAgIGlmIChhcHBlbmRPbmx5KSB7CgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7CgkgICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiAiIjsnKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTsKCgkgICAgICBpZiAoYnVmZmVyU3RhcnQpIHsKCSAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpOwoJICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpOwoJICAgICAgfQoJICAgIH0KCgkgICAgaWYgKHZhckRlY2xhcmF0aW9ucykgewoJICAgICAgdGhpcy5zb3VyY2UucHJlcGVuZCgndmFyICcgKyB2YXJEZWNsYXJhdGlvbnMuc3Vic3RyaW5nKDIpICsgKGFwcGVuZEZpcnN0ID8gJycgOiAnO1xuJykpOwoJICAgIH0KCgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7CgkgIH0sCgoJICAvLyBbYmxvY2tWYWx1ZV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tIZWxwZXJNaXNzaW5nCgkgIC8vCgkgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQoJICAvLyBge3sjdGhpcy5mb299fS4uLnt7L3RoaXMuZm9vfX1gLCByZXNvbHZlIHRoZSB2YWx1ZSBvZiBgZm9vYCwgYW5kCgkgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQoJICAvLyBpbnZva2luZyBibG9ja0hlbHBlck1pc3NpbmcuCgkgIGJsb2NrVmFsdWU6IGZ1bmN0aW9uIGJsb2NrVmFsdWUobmFtZSkgewoJICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSwKCSAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldOwoJICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIDAsIHBhcmFtcyk7CgoJICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZQoJICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKCSAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQoJICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIGxhc3RIZWxwZXI6IHZhbHVlCgkgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uIGFtYmlndW91c0Jsb2NrVmFsdWUoKSB7CgkgICAgLy8gV2UncmUgYmVpbmcgYSBiaXQgY2hlZWt5IGFuZCByZXVzaW5nIHRoZSBvcHRpb25zIHZhbHVlIGZyb20gdGhlIHByaW9yIGV4ZWMKCSAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksCgkgICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTsKCSAgICB0aGlzLnNldHVwSGVscGVyQXJncygnJywgMCwgcGFyYW1zLCB0cnVlKTsKCgkgICAgdGhpcy5mbHVzaElubGluZSgpOwoKCSAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKCSAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwoKCSAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoIScsIHRoaXMubGFzdEhlbHBlciwgJykgeyAnLCBjdXJyZW50LCAnID0gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpLCAnfSddKTsKCSAgfSwKCgkgIC8vIFthcHBlbmRDb250ZW50XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKCSAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7CgkgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKCSAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247CgkgICAgfQoKCSAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDsKCSAgfSwKCgkgIC8vIFthcHBlbmRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8KCSAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KCSAgLy8KCSAgLy8gSWYgYHZhbHVlYCBpcyB0cnV0aHksIG9yIDAsIGl0IGlzIGNvZXJjZWQgaW50byBhIHN0cmluZyBhbmQgYXBwZW5kZWQKCSAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCgkgIGFwcGVuZDogZnVuY3Rpb24gYXBwZW5kKCkgewoJICAgIGlmICh0aGlzLmlzSW5saW5lKCkpIHsKCSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uIChjdXJyZW50KSB7CgkgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgY3VycmVudCwgJyA6ICIiJ107CgkgICAgICB9KTsKCgkgICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnBvcFN0YWNrKCkpKTsKCSAgICB9IGVsc2UgewoJICAgICAgdmFyIGxvY2FsID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCcsIGxvY2FsLCAnICE9IG51bGwpIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFsnZWxzZSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIiwgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIC8vIFthcHBlbmRFc2NhcGVkXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCgkgIC8vCgkgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgoJICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkgewoJICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24nKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcpJ10pKTsKCSAgfSwKCgkgIC8vIFtnZXRDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KCSAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aAoJICAvLwoJICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAoJICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7CgkgICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoOwoJICB9LAoKCSAgLy8gW3B1c2hDb250ZXh0XQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KCSAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkgewoJICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTsKCSAgfSwKCgkgIC8vIFtsb29rdXBPbkNvbnRleHRdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KCSAgLy8KCSAgLy8gTG9va3MgdXAgdGhlIHZhbHVlIG9mIGBuYW1lYCBvbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwdXNoZXMKCSAgLy8gaXQgb250byB0aGUgc3RhY2suCgkgIGxvb2t1cE9uQ29udGV4dDogZnVuY3Rpb24gbG9va3VwT25Db250ZXh0KHBhcnRzLCBmYWxzeSwgc3RyaWN0LCBzY29wZWQpIHsKCSAgICB2YXIgaSA9IDA7CgoJICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHsKCSAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0CgkgICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZQoJICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB9CgoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgaSwgZmFsc3ksIHN0cmljdCk7CgkgIH0sCgoJICAvLyBbbG9va3VwQmxvY2tQYXJhbV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uCgkgIC8vCgkgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzCgkgIC8vIGl0IG9udG8gdGhlIHN0YWNrLgoJICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHsKCSAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTsKCgkgICAgdGhpcy5wdXNoKFsnYmxvY2tQYXJhbXNbJywgYmxvY2tQYXJhbUlkWzBdLCAnXVsnLCBibG9ja1BhcmFtSWRbMV0sICddJ10pOwoJICAgIHRoaXMucmVzb2x2ZVBhdGgoJ2NvbnRleHQnLCBwYXJ0cywgMSk7CgkgIH0sCgoJICAvLyBbbG9va3VwRGF0YV0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCgkgIC8vCgkgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCgkgIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzLCBzdHJpY3QpIHsKCSAgICBpZiAoIWRlcHRoKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKCSAgICB9IGVsc2UgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdjb250YWluZXIuZGF0YShkYXRhLCAnICsgZGVwdGggKyAnKScpOwoJICAgIH0KCgkgICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlLCBzdHJpY3QpOwoJICB9LAoKCSAgcmVzb2x2ZVBhdGg6IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHR5cGUsIHBhcnRzLCBpLCBmYWxzeSwgc3RyaWN0KSB7CgkgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQKCgkgICAgdmFyIF90aGlzID0gdGhpczsKCgkgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHsKCSAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCAmJiBzdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7CgkgICAgICByZXR1cm47CgkgICAgfQoKCSAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoOwoJICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHsKCSAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpOwoJICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKQoJICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuCgkgICAgICAgIGlmICghZmFsc3kpIHsKCSAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmcKCSAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTsKCSAgICAgICAgfQoJICAgICAgfSk7CgkgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqLwoJICAgIH0KCSAgfSwKCgkgIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQoJICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGEKCSAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7CgkgICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgnY29udGFpbmVyLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7CgkgIH0sCgoJICAvLyBbcHVzaFN0cmluZ1BhcmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBzdHJpbmcsIGN1cnJlbnRDb250ZXh0LCAuLi4KCSAgLy8KCSAgLy8gVGhpcyBvcGNvZGUgaXMgZGVzaWduZWQgZm9yIHVzZSBpbiBzdHJpbmcgbW9kZSwgd2hpY2gKCSAgLy8gcHJvdmlkZXMgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHBhcmFtZXRlciBhbG9uZyB3aXRoIGl0cwoJICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCgkgIHB1c2hTdHJpbmdQYXJhbTogZnVuY3Rpb24gcHVzaFN0cmluZ1BhcmFtKHN0cmluZywgdHlwZSkgewoJICAgIHRoaXMucHVzaENvbnRleHQoKTsKCSAgICB0aGlzLnB1c2hTdHJpbmcodHlwZSk7CgoJICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAoJICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLgoJICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHsKCSAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewoJICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkgewoJICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHMKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0cwoJICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKCSAgICB9CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7CgkgIH0sCgkgIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHsKCSAgICBpZiAodGhpcy5oYXNoKSB7CgkgICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CgkgICAgfQoJICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTsKCSAgfSwKCSAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHsKCSAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKCSAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5pZHMpKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guY29udGV4dHMpKTsKCSAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC50eXBlcykpOwoJICAgIH0KCgkgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpOwoJICB9LAoKCSAgLy8gW3B1c2hTdHJpbmddCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrCgkgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7CgkgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwoJICB9LAoKCSAgLy8gW3B1c2hMaXRlcmFsXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCgkgIC8vCgkgIC8vIFB1c2hlcyBhIHZhbHVlIG9udG8gdGhlIHN0YWNrLiBUaGlzIG9wZXJhdGlvbiBwcmV2ZW50cwoJICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCgkgIC8vIGl0LgoJICBwdXNoTGl0ZXJhbDogZnVuY3Rpb24gcHVzaExpdGVyYWwodmFsdWUpIHsKCSAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwoJICB9LAoKCSAgLy8gW3B1c2hQcm9ncmFtXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KCSAgLy8KCSAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwoJICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlCgkgIC8vIGV4cHJlc3Npb24uCgkgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7CgkgICAgaWYgKGd1aWQgIT0gbnVsbCkgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpOwoJICAgIH0gZWxzZSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CgkgICAgfQoJICB9LAoKCSAgLy8gW3JlZ2lzdGVyRGVjb3JhdG9yXQoJICAvLwoJICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgoJICAvLwoJICAvLyBQb3BzIG9mZiB0aGUgZGVjb3JhdG9yJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgZGVjb3JhdG9yLAoJICAvLyBhbmQgaW5zZXJ0cyB0aGUgZGVjb3JhdG9yIGludG8gdGhlIGRlY29yYXRvcnMgbGlzdC4KCSAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb3JhdG9yKHBhcmFtU2l6ZSwgbmFtZSkgewoJICAgIHZhciBmb3VuZERlY29yYXRvciA9IHRoaXMubmFtZUxvb2t1cCgnZGVjb3JhdG9ycycsIG5hbWUsICdkZWNvcmF0b3InKSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSk7CgoJICAgIHRoaXMuZGVjb3JhdG9ycy5wdXNoKFsnZm4gPSAnLCB0aGlzLmRlY29yYXRvcnMuZnVuY3Rpb25DYWxsKGZvdW5kRGVjb3JhdG9yLCAnJywgWydmbicsICdwcm9wcycsICdjb250YWluZXInLCBvcHRpb25zXSksICcgfHwgZm47J10pOwoJICB9LAoKCSAgLy8gW2ludm9rZUhlbHBlcl0KCSAgLy8KCSAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KCSAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KCSAgLy8KCSAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlciwKCSAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgoJICAvLwoJICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC4KCSAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkgewoJICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSwKCSAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJzsKCgkgICAgdmFyIGxvb2t1cCA9IFsnKCddLmNvbmNhdChzaW1wbGUsIG5vbkhlbHBlcik7CgkgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7CgkgICAgICBsb29rdXAucHVzaCgnIHx8ICcsIHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmhlbHBlck1pc3NpbmcnKSk7CgkgICAgfQoJICAgIGxvb2t1cC5wdXNoKCcpJyk7CgoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7CgkgIH0sCgoJICAvLyBbaW52b2tlS25vd25IZWxwZXJdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAoJICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuCgkgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwoJICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCgkgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2UgYHt7Zm9vfX1gCgkgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAoJICAvLyBpcyBhIGhlbHBlciBvciBhIHBhdGguCgkgIC8vCgkgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAoJICAvLyBhbmQgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyB0aGUgYGtub3duSGVscGVyc2AgYW5kCgkgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRpbWUuCgkgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24gaW52b2tlQW1iaWd1b3VzKG5hbWUsIGhlbHBlckNhbGwpIHsKCSAgICB0aGlzLnVzZVJlZ2lzdGVyKCdoZWxwZXInKTsKCgkgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgdGhpcy5lbXB0eUhhc2goKTsKCSAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKCgkgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CgoJICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddOwoJICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkgewoJICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnOwoJICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTsKCSAgICB9CgoJICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnImZ1bmN0aW9uIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pOwoJICB9LAoKCSAgLy8gW2ludm9rZVBhcnRpYWxdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLgoJICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgoJICAvLwoJICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LAoJICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KCSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkgewoJICAgIHZhciBwYXJhbXMgPSBbXSwKCSAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zKTsKCgkgICAgaWYgKGlzRHluYW1pYykgewoJICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7CgkgICAgfQoKCSAgICBpZiAoaW5kZW50KSB7CgkgICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7CgkgICAgfQoJICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJzsKCSAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJzsKCSAgICBvcHRpb25zLmRlY29yYXRvcnMgPSAnY29udGFpbmVyLmRlY29yYXRvcnMnOwoKCSAgICBpZiAoIWlzRHluYW1pYykgewoJICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpOwoJICAgIH0gZWxzZSB7CgkgICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTsKCSAgICB9CgoJICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7CgkgICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnOwoJICAgIH0KCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoKCSAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdjb250YWluZXIuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTsKCSAgfSwKCgkgIC8vIFthc3NpZ25Ub0hhc2hdCgkgIC8vCgkgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLgoJICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uCgkgIC8vCgkgIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2gKCSAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7CgkgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAoJICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLAoJICAgICAgICB0eXBlID0gdW5kZWZpbmVkLAoJICAgICAgICBpZCA9IHVuZGVmaW5lZDsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIGlkID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCSAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHsKCSAgICAgIHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7CgkgICAgICBjb250ZXh0ID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7CgkgICAgaWYgKGNvbnRleHQpIHsKCSAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7CgkgICAgfQoJICAgIGlmICh0eXBlKSB7CgkgICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlOwoJICAgIH0KCSAgICBpZiAoaWQpIHsKCSAgICAgIGhhc2guaWRzW2tleV0gPSBpZDsKCSAgICB9CgkgICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlOwoJICB9LAoKCSAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHsKCSAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7CgkgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKCSAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykgewoJICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7CgkgICAgfSBlbHNlIHsKCSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpOwoJICAgIH0KCSAgfSwKCgkgIC8vIEhFTFBFUlMKCgkgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCgoJICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykgewoJICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLAoJICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCwKCSAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7CgoJICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwoJICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXAKCgkgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKCgkgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewoJICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgoJICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7CgkgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CgkgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKCSAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7CgkgICAgICAgIHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2luZGV4XSA9IGNvbXBpbGVyLmRlY29yYXRvcnM7CgkgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNvbXBpbGVyLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY29tcGlsZXIudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwoJICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CgoJICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRoczsKCSAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTsKCSAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7CgkgICAgICAgIHJldHVybiBpOwoJICAgICAgfQoJICAgIH0KCSAgfSwKCgkgIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7CgkgICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKCSAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107CgoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IHRoaXMudXNlRGVwdGhzKSB7CgkgICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZURlcHRocykgewoJICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdkZXB0aHMnKTsKCSAgICB9CgoJICAgIHJldHVybiAnY29udGFpbmVyLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJzsKCSAgfSwKCgkgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbiB1c2VSZWdpc3RlcihuYW1lKSB7CgkgICAgaWYgKCF0aGlzLnJlZ2lzdGVyc1tuYW1lXSkgewoJICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwoJICAgICAgdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKG5hbWUpOwoJICAgIH0KCSAgfSwKCgkgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikgewoJICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkgewoJICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7CgkgICAgfQoKCSAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7CgkgICAgcmV0dXJuIGV4cHI7CgkgIH0sCgoJICBwdXNoU3RhY2tMaXRlcmFsOiBmdW5jdGlvbiBwdXNoU3RhY2tMaXRlcmFsKGl0ZW0pIHsKCSAgICB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwoJICB9LAoKCSAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHsKCSAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgewoJICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTsKCSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7CgkgICAgfQoKCSAgICBpZiAoc291cmNlKSB7CgkgICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7CgkgICAgfQoJICB9LAoKCSAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbiByZXBsYWNlU3RhY2soY2FsbGJhY2spIHsKCSAgICB2YXIgcHJlZml4ID0gWycoJ10sCgkgICAgICAgIHN0YWNrID0gdW5kZWZpbmVkLAoJICAgICAgICBjcmVhdGVkU3RhY2sgPSB1bmRlZmluZWQsCgkgICAgICAgIHVzZWRMaXRlcmFsID0gdW5kZWZpbmVkOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwoJICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7CgkgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTsKCSAgICB9CgoJICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCcKCSAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKCgkgICAgaWYgKHRvcCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKCSAgICAgIHN0YWNrID0gW3RvcC52YWx1ZV07CgkgICAgICBwcmVmaXggPSBbJygnLCBzdGFja107CgkgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgc3RhY2sgbmFtZSBmb3IgdXNlIGJ5IHRoZSBpbmxpbmUKCSAgICAgIGNyZWF0ZWRTdGFjayA9IHRydWU7CgkgICAgICB2YXIgX25hbWUgPSB0aGlzLmluY3JTdGFjaygpOwoKCSAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddOwoJICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CgkgICAgfQoKCSAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spOwoKCSAgICBpZiAoIXVzZWRMaXRlcmFsKSB7CgkgICAgICB0aGlzLnBvcFN0YWNrKCk7CgkgICAgfQoJICAgIGlmIChjcmVhdGVkU3RhY2spIHsKCSAgICAgIHRoaXMuc3RhY2tTbG90LS07CgkgICAgfQoJICAgIHRoaXMucHVzaChwcmVmaXguY29uY2F0KGl0ZW0sICcpJykpOwoJICB9LAoKCSAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7CgkgICAgdGhpcy5zdGFja1Nsb3QrKzsKCSAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsKCSAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTsKCSAgICB9CgkgICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7CgkgIH0sCgkgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkgewoJICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7CgkgIH0sCgkgIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHsKCSAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrOwoJICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKCSAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldOwoJICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCgkgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7CgkgICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTsKCSAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTsKCSAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7CgkgICAgICB9CgkgICAgfQoJICB9LAoJICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7CgkgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwoJICB9LAoKCSAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHsKCSAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLAoJICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7CgoJICAgIGlmICghd3JhcHBlZCAmJiBpdGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkgewoJICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CgkgICAgfSBlbHNlIHsKCSAgICAgIGlmICghaW5saW5lKSB7CgkgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgkgICAgICAgIGlmICghdGhpcy5zdGFja1Nsb3QpIHsKCSAgICAgICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBzdGFjayBwb3AnKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGl0ZW07CgkgICAgfQoJICB9LAoKCSAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkgewoJICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaywKCSAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKCSAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHsKCSAgICAgIHJldHVybiBpdGVtLnZhbHVlOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gaXRlbTsKCSAgICB9CgkgIH0sCgoJICBjb250ZXh0TmFtZTogZnVuY3Rpb24gY29udGV4dE5hbWUoY29udGV4dCkgewoJICAgIGlmICh0aGlzLnVzZURlcHRocyAmJiBjb250ZXh0KSB7CgkgICAgICByZXR1cm4gJ2RlcHRoc1snICsgY29udGV4dCArICddJzsKCSAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuICdkZXB0aCcgKyBjb250ZXh0OwoJICAgIH0KCSAgfSwKCgkgIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikgewoJICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTsKCSAgfSwKCgkgIGFsaWFzYWJsZTogZnVuY3Rpb24gYWxpYXNhYmxlKG5hbWUpIHsKCSAgICB2YXIgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdOwoJICAgIGlmIChyZXQpIHsKCSAgICAgIHJldC5yZWZlcmVuY2VDb3VudCsrOwoJICAgICAgcmV0dXJuIHJldDsKCSAgICB9CgoJICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7CgkgICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7CgkgICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTsKCgkgICAgcmV0dXJuIHJldDsKCSAgfSwKCgkgIHNldHVwSGVscGVyOiBmdW5jdGlvbiBzZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIGJsb2NrSGVscGVyKSB7CgkgICAgdmFyIHBhcmFtcyA9IFtdLAoJICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgcGFyYW1TaXplLCBwYXJhbXMsIGJsb2NrSGVscGVyKTsKCSAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyksCgkgICAgICAgIGNhbGxDb250ZXh0ID0gdGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKSArICcgIT0gbnVsbCA/ICcgKyB0aGlzLmNvbnRleHROYW1lKDApICsgJyA6IHt9Jyk7CgoJICAgIHJldHVybiB7CgkgICAgICBwYXJhbXM6IHBhcmFtcywKCSAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsCgkgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKCSAgICAgIGNhbGxQYXJhbXM6IFtjYWxsQ29udGV4dF0uY29uY2F0KHBhcmFtcykKCSAgICB9OwoJICB9LAoKCSAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHsKCSAgICB2YXIgb3B0aW9ucyA9IHt9LAoJICAgICAgICBjb250ZXh0cyA9IFtdLAoJICAgICAgICB0eXBlcyA9IFtdLAoJICAgICAgICBpZHMgPSBbXSwKCSAgICAgICAgb2JqZWN0QXJncyA9ICFwYXJhbXMsCgkgICAgICAgIHBhcmFtID0gdW5kZWZpbmVkOwoKCSAgICBpZiAob2JqZWN0QXJncykgewoJICAgICAgcGFyYW1zID0gW107CgkgICAgfQoKCSAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpOwoJICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTsKCgkgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICB9CgkgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpOwoJICAgIH0KCgkgICAgdmFyIGludmVyc2UgPSB0aGlzLnBvcFN0YWNrKCksCgkgICAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7CgoJICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwoJICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWAKCSAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CgkgICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAnY29udGFpbmVyLm5vb3AnOwoJICAgIH0KCgkgICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcikKCSAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHZhciBpID0gcGFyYW1TaXplOwoJICAgIHdoaWxlIChpLS0pIHsKCSAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgcGFyYW1zW2ldID0gcGFyYW07CgoJICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHsKCSAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7CgkgICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpOwoJICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTsKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChvYmplY3RBcmdzKSB7CgkgICAgICBvcHRpb25zLmFyZ3MgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHBhcmFtcyk7CgkgICAgfQoKCSAgICBpZiAodGhpcy50cmFja0lkcykgewoJICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7CgkgICAgfQoJICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykgewoJICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpOwoJICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpOwoJICAgIH0KCgkgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7CgkgICAgICBvcHRpb25zLmRhdGEgPSAnZGF0YSc7CgkgICAgfQoJICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7CgkgICAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gJ2Jsb2NrUGFyYW1zJzsKCSAgICB9CgkgICAgcmV0dXJuIG9wdGlvbnM7CgkgIH0sCgoJICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3RlcikgewoJICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zKTsKCSAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpOwoJICAgIGlmICh1c2VSZWdpc3RlcikgewoJICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpOwoJICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKCSAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107CgkgICAgfSBlbHNlIGlmIChwYXJhbXMpIHsKCSAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOwoJICAgICAgcmV0dXJuICcnOwoJICAgIH0gZWxzZSB7CgkgICAgICByZXR1cm4gb3B0aW9uczsKCSAgICB9CgkgIH0KCX07CgoJKGZ1bmN0aW9uICgpIHsKCSAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7CgoJICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwoKCSAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXNlcnZlZFdvcmRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwoJICB9Cgl9KSgpOwoKCUphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CgkgIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTsKCX07CgoJZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7CgkgIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksCgkgICAgICBpID0gMCwKCSAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCSAgaWYgKHJlcXVpcmVUZXJtaW5hbCkgewoJICAgIGxlbi0tOwoJICB9CgoJICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgc3RhY2sgPSBjb21waWxlci5uYW1lTG9va3VwKHN0YWNrLCBwYXJ0c1tpXSwgdHlwZSk7CgkgIH0KCgkgIGlmIChyZXF1aXJlVGVybWluYWwpIHsKCSAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgnY29udGFpbmVyLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddOwoJICB9IGVsc2UgewoJICAgIHJldHVybiBzdGFjazsKCSAgfQoJfQoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IEphdmFTY3JpcHRDb21waWxlcjsKCW1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOwoKLyoqKi8gfSwKLyogMjkgKi8KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoJLyogZ2xvYmFsIGRlZmluZSAqLwoJJ3VzZSBzdHJpY3QnOwoKCWV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CgoJdmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CgoJdmFyIFNvdXJjZU5vZGUgPSB1bmRlZmluZWQ7CgoJdHJ5IHsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgaWYgKGZhbHNlKSB7CgkgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGluIEFNRCBlbnZpcm9ubWVudHMuIEZvciB0aGVzZSBlbnZpcm9ubWVudHMsIHdlIGFzdXNtZSB0aGF0CgkgICAgLy8gdGhleSBhcmUgcnVubmluZyBvbiB0aGUgYnJvd3NlciBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkuCgkgICAgdmFyIFNvdXJjZU1hcCA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKTsKCSAgICBTb3VyY2VOb2RlID0gU291cmNlTWFwLlNvdXJjZU5vZGU7CgkgIH0KCX0gY2F0Y2ggKGVycikge30KCS8qIE5PUCAqLwoKCS8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi8KCWlmICghU291cmNlTm9kZSkgewoJICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7CgkgICAgdGhpcy5zcmMgPSAnJzsKCSAgICBpZiAoY2h1bmtzKSB7CgkgICAgICB0aGlzLmFkZChjaHVua3MpOwoJICAgIH0KCSAgfTsKCSAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KCSAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7CgkgICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7CgkgICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY2h1bmtzKSkgewoJICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7CgkgICAgICB9CgkgICAgICB0aGlzLnNyYyArPSBjaHVua3M7CgkgICAgfSwKCSAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykgewoJICAgICAgaWYgKF91dGlscy5pc0FycmF5KGNodW5rcykpIHsKCSAgICAgICAgY2h1bmtzID0gY2h1bmtzLmpvaW4oJycpOwoJICAgICAgfQoJICAgICAgdGhpcy5zcmMgPSBjaHVua3MgKyB0aGlzLnNyYzsKCSAgICB9LAoJICAgIHRvU3RyaW5nV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24gdG9TdHJpbmdXaXRoU291cmNlTWFwKCkgewoJICAgICAgcmV0dXJuIHsgY29kZTogdGhpcy50b1N0cmluZygpIH07CgkgICAgfSwKCSAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CgkgICAgICByZXR1cm4gdGhpcy5zcmM7CgkgICAgfQoJICB9OwoJfQoKCWZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7CgkgIGlmIChfdXRpbHMuaXNBcnJheShjaHVuaykpIHsKCSAgICB2YXIgcmV0ID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykgewoJICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTsKCSAgICB9CgkgICAgcmV0dXJuIHJldDsKCSAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7CgkgICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uCgkgICAgcmV0dXJuIGNodW5rICsgJyc7CgkgIH0KCSAgcmV0dXJuIGNodW5rOwoJfQoKCWZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkgewoJICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOwoJICB0aGlzLnNvdXJjZSA9IFtdOwoJfQoKCUNvZGVHZW4ucHJvdG90eXBlID0gewoJICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkgewoJICAgIHJldHVybiAhdGhpcy5zb3VyY2UubGVuZ3RoOwoJICB9LAoJICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKHNvdXJjZSwgbG9jKSB7CgkgICAgdGhpcy5zb3VyY2UudW5zaGlmdCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTsKCSAgfSwKCSAgcHVzaDogZnVuY3Rpb24gcHVzaChzb3VyY2UsIGxvYykgewoJICAgIHRoaXMuc291cmNlLnB1c2godGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7CgkgIH0sCgoJICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7CgkgICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTsKCSAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHsKCSAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcbiddKTsKCSAgICB9KTsKCSAgICByZXR1cm4gc291cmNlOwoJICB9LAoKCSAgZWFjaDogZnVuY3Rpb24gZWFjaChpdGVyKSB7CgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICBpdGVyKHRoaXMuc291cmNlW2ldKTsKCSAgICB9CgkgIH0sCgoJICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7CgkgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH07CgkgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpOwoJICB9LAoJICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7CgkgICAgdmFyIGxvYyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07CgoJICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHsKCSAgICAgIHJldHVybiBjaHVuazsKCSAgICB9CgoJICAgIGNodW5rID0gY2FzdENodW5rKGNodW5rLCB0aGlzLCBsb2MpOwoKCSAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspOwoJICB9LAoKCSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykgewoJICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7CgkgICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pOwoJICB9LAoKCSAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7CgkgICAgcmV0dXJuICciJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC8iL2csICdcXCInKS5yZXBsYWNlKC9cbi9nLCAnXFxuJykucmVwbGFjZSgvXHIvZywgJ1xccicpLnJlcGxhY2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAoJICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKCSAgfSwKCgkgIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7CgkgICAgdmFyIHBhaXJzID0gW107CgoJICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKCSAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpOwoJICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfQoKCSAgICB2YXIgcmV0ID0gdGhpcy5nZW5lcmF0ZUxpc3QocGFpcnMpOwoJICAgIHJldC5wcmVwZW5kKCd7Jyk7CgkgICAgcmV0LmFkZCgnfScpOwoJICAgIHJldHVybiByZXQ7CgkgIH0sCgoJICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZW1wdHkoKTsKCgkgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgIGlmIChpKSB7CgkgICAgICAgIHJldC5hZGQoJywnKTsKCSAgICAgIH0KCgkgICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzKSk7CgkgICAgfQoKCSAgICByZXR1cm4gcmV0OwoJICB9LAoKCSAgZ2VuZXJhdGVBcnJheTogZnVuY3Rpb24gZ2VuZXJhdGVBcnJheShlbnRyaWVzKSB7CgkgICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMpOwoJICAgIHJldC5wcmVwZW5kKCdbJyk7CgkgICAgcmV0LmFkZCgnXScpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9OwoKCWV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvZGVHZW47Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKCi8qKiovIH0KLyoqKioqKi8gXSkKfSk7Cjs=</File> | |
| 55 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.js" Permission="644" Encode="Base64">LyohCiAqIENoaWxpIC0gdGhlIGpRdWVyeSBwbHVnaW4gZm9yIGhpZ2hsaWdodGluZyBjb2RlCiAqIGh0dHA6Ly9ub3Rlc2xvZy5jb20vY2hpbGkvCiAqIAogKiBDb3B5cmlnaHQgMjAxMCBBbmRyZWEgRXJjb2xpbm8KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vTGljZW5zZQogKiAKICogVkVSU0lPTjogTkVYVCAtIDIwMTUxMjA0IDExMDYKICovCgooZnVuY3Rpb24oICQgKSAKewogICAgCiAgICAkLmV4dGVuZCh7CiAgICAJY2hpbGk6IHsKICAgIAkJb3B0aW9uczogeyAgCiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiB7CiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGg6ICA0LCAgICAvL3NwYWNlcwogICAgICAgICAgICAgICAgICAgIG5vMXN0TGluZTogdHJ1ZSAgLy9pZiBlbXB0eQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9tYXRpYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogICJjb2RlIiwKICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICB9LAogICAgCSAgICAgICAgZHluYW1pYzogewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBvcmlnaW46ICAgICcnICAgIC8vdXNlZCBsaWtlOiByZWNpcGVGb2xkZXIgKyByZWNpcGVOYW1lICsgJy5qcycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnM6ICF0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGJveDogewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogWyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDozMDAwOyBvdmVyZmxvdzpzY3JvbGw7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aDoxNmVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OjllbTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjoxcHggc29saWQgZ3JheTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGRpbmc6MWVtOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsiCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVkgLSBNYXRoLnJvdW5kKCBoZWlnaHQgLyAyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAgZnVuY3Rpb24ocGFnZVgsIHBhZ2VZLCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFnZVggLyotIE1hdGgucm91bmQoIHdpZHRoIC8gMiApKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIAl9CiAgICAJfQogICAgfSk7CiAgICAKICAgICAgICAKCSQoZnVuY3Rpb24oKSAKICAgIHsKCSAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKCcuY2hpbGktbG4tb2ZmIHtsaXN0LXN0eWxlLXR5cGU6IG5vbmU7fScpOwoJICAgICQuZXh0ZW5kKCQuY2hpbGksICQuY2hpbGkub3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuY2hpbGkuYXV0b21hdGljLmFjdGl2ZSkgCiAgICAgICAgewogICAgICAgICAgICAkKCQuY2hpbGkuYXV0b21hdGljLnNlbGVjdG9yLCAkLmNoaWxpLmF1dG9tYXRpYy5jb250ZXh0KS5jaGlsaSgpOwogICAgICAgIH0KICAgIH0pOwoJCgkgICAgCiAgICAkLmV4dGVuZCgkLmNoaWxpLCB7CiAgICAgICAgdmVyc2lvbjogIm5leHQiLCAvLyBkZXZlbG9wbWVudCBzdGFydGVkIG9uIDIwMTAtMDEtMDYKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBwaWVjZSBvZiBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgICAgKi8KICAgICAgICBjb2RlTGFuZ3VhZ2U6IGZ1bmN0aW9uKCBkb21fZWxlbWVudCApIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAkKGRvbV9lbGVtZW50KS5hdHRyKCdjbGFzcycpOwogICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXMubWF0Y2goL1xiY2hpbGktbGFuZy0oXHcrKS8pOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVycyBkYXRhIGZvciB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQKICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBBcnJheQogICAgICAgICAqLwogICAgICAgIGNvZGVMaW5lTnVtYmVyczogZnVuY3Rpb24oIGRvbV9lbGVtZW50ICkgewogICAgICAgICAgICB2YXIgY2xhc3NlcyA9ICQoZG9tX2VsZW1lbnQpLmF0dHIoJ2NsYXNzJyk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY2xhc3Nlcy5tYXRjaCgvXGJjaGlsaS1sbi0oXGQrKS0oW1x3XVtcd1wtXSopfFxiY2hpbGktbG4tKFxkKykvKTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICEgbWF0Y2hlcyAKICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgOiBtYXRjaGVzWzNdIAogICAgICAgICAgICAgICAgICAgID8gWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzNdLCAnJyBdIAogICAgICAgICAgICAgICAgICAgIDogWyBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdLCBtYXRjaGVzWzJdIF07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlcyBvZiBhbnkgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICogKFVzZWQgZm9yIGRldmVsb3BpbmcgQ2hpbGkpCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAgICAgKiAKICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICAgICAqLwogICAgICAgIHJldmVhbENoYXJzOiBmdW5jdGlvbiAoIHRleHQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBpVG9wPXRleHQubGVuZ3RoOyBpPGlUb3A7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFtpXSArICcgPC0gJyArIHRleHQuY2hhckNvZGVBdChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gQ1NTIGNvZGUgYXMgYSBuZXcgc3R5bGUgZWxlbWVudCBvZiBoZWFkCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvZGUKICAgICAgICAgKi8KICAgICAgICBsb2FkU3R5bGVzaGVldElubGluZTogZnVuY3Rpb24gKCBzb3VyY2VDb2RlICkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYgKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB2YXIgc3R5bGVfZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHlsZSIgKTsgCiAgICAgICAgICAgICAgICBzdHlsZV9lbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOyAKICAgICAgICAgICAgICAgIGlmICggc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0ICkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVfZWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzb3VyY2VDb2RlOyAvLyBJRQogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBzb3VyY2VDb2RlICk7IAogICAgICAgICAgICAgICAgICAgIHN0eWxlX2VsZW1lbnQuYXBwZW5kQ2hpbGQoIHQgKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF07CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKCBzdHlsZV9lbGVtZW50ICk7IAogICAgICAgICAgICB9IAogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgcXVldWU6IHt9LAogICAgICAgIAogICAgICAgIHJlY2lwZXM6IHt9LAogICAgICAgIAogICAgICAgIGZpbHRlcnM6IHsKICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAogICAgCiAgICAvKioKICAgICAqIEhpZ2hsaWdodHMgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIGFjY29yZGluZ2x5IHRvIHRoZSBnaXZlbiBvcHRpb25zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgKi8KICAgICQuZm4uY2hpbGkgPSBmdW5jdGlvbiggb3B0aW9ucyApIAogICAgewogICAgICAgIHZhciBnbG9iYWxzID0gJC5leHRlbmQoe30sICQuY2hpbGkpOwogICAgICAgICQuY2hpbGkgPSAkLmV4dGVuZCggdHJ1ZSwgJC5jaGlsaSwgb3B0aW9ucyB8fCB7fSApOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIAogICAgICAgIHsKICAgICAgICAgICAgYXNrRGlzaCggdGhpcyApOwogICAgICAgIH0pOwogICAgICAgICQuY2hpbGkgPSBnbG9iYWxzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGUgcGF0aCBmcm9tIHRoZSBnaXZlbiByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlY2lwZVBhdGgoIHJlY2lwZU5hbWUgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJC5jaGlsaS5keW5hbWljLm9yaWdpbiArICdqcXVlcnkuY2hpbGkucmVjaXBlcy4nICsgcmVjaXBlTmFtZSArICcuanMnOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVjaXBlIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlUGF0aAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGVOYW1lKCByZWNpcGVQYXRoICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlY2lwZVBhdGgubWF0Y2goL1xianF1ZXJ5XC5jaGlsaVwucmVjaXBlc1wuKFtcdy1dKylcLmpzJC9pKTsKICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hlc1sxXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIERldGVjdHMgdGhlIHJlY2lwZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgYW5kIAogICAgICogbWFrZXMgaXQgaGFwcGVuLCBmb3Igc3RhdGljIGFuZCBkeW5hbWljIHNldHVwcwogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFza0Rpc2goIGRvbV9lbGVtZW50ICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSAkLmNoaWxpLmNvZGVMYW5ndWFnZSggZG9tX2VsZW1lbnQgKTsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBhdGggPSBnZXRSZWNpcGVQYXRoKCByZWNpcGVOYW1lICk7CiAgICAgICAgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICYmICEgJC5jaGlsaS5yZWNpcGVzWyByZWNpcGVOYW1lIF0gKSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIGR5bmFtaWMgc2V0dXBzIGNvbWUgaGVyZQogICAgICAgICAgICBpZiAoICEgJC5jaGlsaS5xdWV1ZVsgcGF0aCBdICkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRvd25sb2FkUmVjaXBlKHBhdGgsIG1ha2VEaXNoLCBbcGF0aF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQuY2hpbGkucXVldWVbIHBhdGggXS5wdXNoKCBkb21fZWxlbWVudCApOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgLy8gc3RhdGljIHNldHVwcyBjb21lIGhlcmUKICAgICAgICAgICAgJChkb21fZWxlbWVudCkudHJpZ2dlciggJ2NoaWxpLmJlZm9yZV9jb2xvcmluZycsIFtyZWNpcGVOYW1lXSApOwogICAgICAgICAgICBtYWtlRGlzaC5hcHBseSggZG9tX2VsZW1lbnQsIFtwYXRoXSApOwogICAgICAgICAgICAkKGRvbV9lbGVtZW50KS50cmlnZ2VyKCAnY2hpbGkuYWZ0ZXJfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogSGlnaGxpZ2h0cyB0aGUgY3VycmVudCBET00gZWxlbWVudCB1c2luZyB0aGUgcmVjaXBlIGlkZW50aWZpZWQgYnkgdGhlCiAgICAgKiBnaXZlbiByZWNpcGVQYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VEaXNoKCByZWNpcGVQYXRoICkgCiAgICB7CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKHJlY2lwZVBhdGgpOwogICAgICAgIHZhciByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICBpZiAoISByZWNpcGUpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGluZ3JlZGllbnRzID0gJCggdGhpcyApLnRleHQoKTsKICAgICAgICBpZiAoISBpbmdyZWRpZW50cykgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbmdyZWRpZW50cyA9IGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoaW5ncmVkaWVudHMpOwogICAgICAgIHJlcGxhY2VFbGVtZW50LmFwcGx5KHsKICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMsIAogICAgICAgICAgICBzdWJqZWN0OiAgaW5ncmVkaWVudHMsIAogICAgICAgICAgICBtb2R1bGU6ICAgcmVjaXBlTmFtZSwgCiAgICAgICAgICAgIGNvbnRleHQ6ICB7fQogICAgICAgIH0pOwogICAgICAgIGZpeFRleHRTZWxlY3Rpb24odGhpcyk7CiAgICAgICAgY2hlY2tMaW5lTnVtYmVycyh0aGlzKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBzb3VyY2UgY29kZSBpbiB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgCiAgICAgKiB2ZXJzaW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KCkKICAgIHsKICAgICAgICBmaWx0ZXJzUHJlcGFyZSh0aGlzKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBhcHBseU1vZHVsZSggdGhpcy5zdWJqZWN0LCB0aGlzLm1vZHVsZSwgdGhpcy5jb250ZXh0ICk7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaWx0ZXJzUHJvY2Vzcyh0aGlzLCByZXBsYWNlbWVudCk7CiAgICAgICAgCiAgICAgICAgcmVwbGFjZW1lbnQgPSBmaXhXaGl0ZVNwYWNlQmVmb3JlV3JpdGluZyggcmVwbGFjZW1lbnQgKTsKICAgICAgICAKICAgICAgICB2YXIgZG9tX2VsZW1lbnQgPSAkKCB0aGlzLnNlbGVjdG9yIClbMF07CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gcmVwbGFjZW1lbnQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2YgCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWVzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gcmVxdWVzdGVkQWN0aW9uKCByZWNpcGVOYW1lLCBibG9ja05hbWUsIHN0ZXBOYW1lICkgCiAgICB7CiAgICAgICAgaWYgKCAnJyAhPSBzdGVwTmFtZSApICAgcmV0dXJuICdhcHBseVN0ZXAnOwogICAgICAgIGlmICggJycgIT0gYmxvY2tOYW1lICkgIHJldHVybiAnYXBwbHlCbG9jayc7CiAgICAgICAgaWYgKCAnJyAhPSByZWNpcGVOYW1lICkgcmV0dXJuICdhcHBseVJlY2lwZSc7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gY29udGV4dAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RBY3Rpb24oIG1vZHVsZSwgY29udGV4dCApCiAgICB7CiAgICAgICAgaWYgKCEgbW9kdWxlKSAgIHJldHVybjsKICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdeKD8hKD86LyR8LisvJHwuKy8vJHwuKy8vLikpKFteL10qKSg/Oi8oW14vXSopKD86LyhbXi9dKykpPyk/JCcpOwogICAgICAgIHZhciBtYXRjaGVzID0gKG1vZHVsZSB8fCAnJykubWF0Y2gocmUpOwogICAgICAgIGlmICghIG1hdGNoZXMpICByZXR1cm47IC8vIEV4cGVjdGVkIHJlY2lwZVsvYmxvY2tbL3N0ZXBdXSBtb2R1bGUgZm9ybWF0CiAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBtYXRjaGVzWzFdIHx8ICcnOwogICAgICAgIHZhciBibG9ja05hbWUgID0gbWF0Y2hlc1syXSB8fCAnJzsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IG1hdGNoZXNbM10gfHwgJyc7CiAgICAgICAgdmFyIGFjdGlvbiA9IHJlcXVlc3RlZEFjdGlvbiggcmVjaXBlTmFtZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApOwogICAgICAgIHZhciByZWNpcGUgPSBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKTsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICAgIGFjdGlvbjogICAgIGFjdGlvbgogICAgICAgICAgICAsIHJlY2lwZU5hbWU6IHJlY2lwZU5hbWUgCiAgICAgICAgICAgICwgYmxvY2tOYW1lOiAgYmxvY2tOYW1lCiAgICAgICAgICAgICwgc3RlcE5hbWU6ICAgc3RlcE5hbWUKICAgICAgICAgICAgLCByZWNpcGU6ICAgICByZWNpcGUKICAgICAgICAgICAgLCBtb2R1bGU6ICAgICBtb2R1bGUKICAgICAgICAgICAgLCBjb250ZXh0OiAgICBjb250ZXh0CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCByZWNpcGUgd2l0aCB0aGUgZ2l2ZW4gcmVjaXBlTmFtZSBpZiByZWNpcGVOYW1lIGlzIAogICAgICogbm90IGVtcHR5LCBlbHNlIHRoZSByZWNpcGUgZnJvbSBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGVOYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIE9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBnZXRSZWNpcGUoIHJlY2lwZU5hbWUsIGNvbnRleHQgKSAKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gbnVsbDsKICAgICAgICBpZiAoICcnID09IHJlY2lwZU5hbWUgKQogICAgICAgIHsKICAgICAgICAgICAgcmVjaXBlID0gY29udGV4dC5yZWNpcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICByZWNpcGUgPSAkLmNoaWxpLnJlY2lwZXNbIHJlY2lwZU5hbWUgXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY2lwZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBEb3dubG9hZHMgYSByZWNpcGUgYnkgbWVhbnMgb2YgYW4gYWpheCBjYWxsIGFuZCwgb24gc3VjY2VzcywgYXBwbGllcyAKICAgICAqIHRoZSBjYkZ1bmN0aW9uIGNhbGxiYWNrLCBwYXNzaW5nIGl0IGFsbCBjYkRhdGEgYXJyYXkgZWxlbWVudHMgYXMgCiAgICAgKiBhcmd1bWVudHMsIHRvIGFueSBlbGVtZW50IHdhaXRpbmcgZm9yIGJlaW5nIGhpZ2hsaWdodGVkIG9uIHRoZSBxdWV1ZSAKICAgICAqIG9mIHRoZSByZWNpcGUgaWRlbnRpZmllZCBieSBwYXRoCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGgKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiRnVuY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl9IGNiRGF0YQogICAgICovCiAgICBmdW5jdGlvbiBkb3dubG9hZFJlY2lwZSggcGF0aCwgY2JGdW5jdGlvbiwgY2JEYXRhICkKICAgIHsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0gPSBbXTsKICAgICAgICAkLmdldFNjcmlwdCggcGF0aCwgZnVuY3Rpb24oIHJlY2lwZUxvYWRlZCApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlY2lwZU5hbWUgPSBnZXRSZWNpcGVOYW1lKCBwYXRoICk7CiAgICAgICAgICAgIHZhciBxID0gJC5jaGlsaS5xdWV1ZVsgcGF0aCBdOwogICAgICAgICAgICBmb3IoIHZhciBpID0gMCwgaVRvcCA9IHEubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVsID0gcVsgaSBdOwogICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlbC5zZWxlY3RvcikgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsLnNlbGVjdG9yKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZWwpLnRyaWdnZXIoICdjaGlsaS5iZWZvcmVfY29sb3JpbmcnLCBbcmVjaXBlTmFtZV0gKTsKICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24uYXBwbHkocVsgaSBdLCBjYkRhdGEpOwogICAgICAgICAgICAgICAgJChlbCkudHJpZ2dlciggJ2NoaWxpLmFmdGVyX2NvbG9yaW5nJywgW3JlY2lwZU5hbWVdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCByZWNpcGUgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlSZWNpcGUoIHN1YmplY3QsIGRldGVjdGVkICkKICAgIHsKICAgICAgICB2YXIgcmVjaXBlID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZGV0ZWN0ZWQgYmxvY2sgdG8gdGhlIGdpdmVuCiAgICAgKiBzdWJqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0ZWN0ZWQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlCbG9jayggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciBibG9ja05hbWUgPSBkZXRlY3RlZC5ibG9ja05hbWU7CiAgICAgICAgdmFyIHJlY2lwZSAgICA9IGRldGVjdGVkLnJlY2lwZTsKICAgICAgICBpZiAoISAoYmxvY2tOYW1lIGluIHJlY2lwZSkpIAogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gY29vayhzdWJqZWN0LCByZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBkZXRlY3RlZCBzdGVwIHRvIHRoZSBnaXZlbgogICAgICogc3ViamVjdAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGRldGVjdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3RlcCggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZWNpcGVOYW1lID0gZGV0ZWN0ZWQucmVjaXBlTmFtZTsKICAgICAgICB2YXIgYmxvY2tOYW1lICA9IGRldGVjdGVkLmJsb2NrTmFtZTsKICAgICAgICB2YXIgc3RlcE5hbWUgICA9IGRldGVjdGVkLnN0ZXBOYW1lOwogICAgICAgIHZhciByZWNpcGUgICAgID0gZGV0ZWN0ZWQucmVjaXBlOwogICAgICAgIHZhciBjb250ZXh0ICAgID0gZGV0ZWN0ZWQuY29udGV4dDsKICAgICAgICBpZiAoJycgPT0gYmxvY2tOYW1lKSAKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrTmFtZSA9IGNvbnRleHQuYmxvY2tOYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZmFsc2UKICAgICAgICAgICAgfHwgISAoYmxvY2tOYW1lIGluIHJlY2lwZSkKICAgICAgICAgICAgfHwgISAoc3RlcE5hbWUgIGluIHJlY2lwZVtibG9ja05hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IGNvb2soc3ViamVjdCwgcmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUFjdGlvbiggc3ViamVjdCwgZGV0ZWN0ZWQgKQogICAgewogICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICB2YXIgYWN0aW9uID0gZGV0ZWN0ZWQuYWN0aW9uOwogICAgICAgIHN3aXRjaCAoYWN0aW9uKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnYXBwbHlSZWNpcGUnOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXBwbHlSZWNpcGUoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXBwbHlCbG9jayc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseUJsb2NrKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FwcGx5U3RlcCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcHBseVN0ZXAoc3ViamVjdCwgZGV0ZWN0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGRldGVjdGVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4KICAgICAqIHN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRlY3RlZAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseURlZmVycmVkKCBzdWJqZWN0LCBkZXRlY3RlZCApCiAgICB7CiAgICAgICAgLy8gZHluYW1pYyBzZXR1cHMgY29tZSBoZXJlIHRvbwogICAgICAgIHZhciBwYXRoID0gZ2V0UmVjaXBlUGF0aChkZXRlY3RlZC5yZWNpcGVOYW1lKTsKICAgICAgICBpZiAoISAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0pIAogICAgICAgIHsKICAgICAgICAgICAgZG93bmxvYWRSZWNpcGUocGF0aCwgcmVwbGFjZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgY3VlID0gJ2NoaWxpXycgKyB1bmlxdWUoKTsKICAgICAgICAkLmNoaWxpLnF1ZXVlWyBwYXRoIF0ucHVzaCggewogICAgICAgICAgICBzZWxlY3RvcjogJyMnICsgY3VlLCAKICAgICAgICAgICAgc3ViamVjdDogIHN1YmplY3QsIAogICAgICAgICAgICBtb2R1bGU6ICAgZGV0ZWN0ZWQubW9kdWxlLCAKICAgICAgICAgICAgY29udGV4dDogIGRldGVjdGVkLmNvbnRleHQKICAgICAgICB9ICk7CiAgICAgICAgcmVzdWx0ID0gJzxzcGFuIGlkPSInICsgY3VlICsgJyI+JyArIHJlc3VsdCArICc8L3NwYW4+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGdpdmVuIHN1YmplY3QgCiAgICAgKiBpbnRvIHRoZSBnaXZlbiBjb250ZXh0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBjb250ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgIHZhciBkZXRlY3RlZCA9IGRldGVjdEFjdGlvbihtb2R1bGUsIGNvbnRleHQpOwogICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZXRlY3RlZC5yZWNpcGUpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseUFjdGlvbihzdWJqZWN0LCBkZXRlY3RlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAkLmNoaWxpLmR5bmFtaWMuYWN0aXZlICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBhcHBseURlZmVycmVkKHN1YmplY3QsIGRldGVjdGVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyhzdWJqZWN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlci4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbm90IHVuZGVmaW5lZCB0aGUgCiAgICAgKiByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgaW5zaWRlIHRleHQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBJbnRlZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZSggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSAobmV3IERhdGUoKSkudmFsdWVPZigpOwogICAgICAgIHdoaWxlKCB0ZXh0ICYmIHRleHQuaW5kZXhPZiggcmVzdWx0ICkgPiAtMSApOwogICAgICAgIHsgCiAgICAgICAgICAgIHJlc3VsdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIHN0ZXBzIG9mIHRoZSBnaXZlbiBibG9ja05hbWUgb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZUJsb2NrKCByZWNpcGUsIGJsb2NrTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwcyA9IFtdOwogICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgZm9yKCB2YXIgc3RlcE5hbWUgaW4gYmxvY2sgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHByZXBhcmVTdGVwKCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKTsKICAgICAgICAgICAgc3RlcHMucHVzaCggcHJlcGFyZWQgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0ZXBzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIChhcwogICAgICogYSBzdHJpbmcpCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZQogICAgICogCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgZnVuY3Rpb24gbnVtYmVyT2ZTdWJtYXRjaGVzKCByZSApCiAgICB7CiAgICAgICAgdmFyIHN1Ym1hdGNoZXMgPSByZQogICAgICAgICAgICAucmVwbGFjZSggL1xcLi9nLCAiJSIgKSAgICAgLy8gZGlzYWJsZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXIKICAgICAgICAgICAgLnJlcGxhY2UoIC9cWy4qP1xdL2csICIlIiApIC8vIGRpc2FibGUgYW55IGNoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAubWF0Y2goIC9cKCg/IVw/KS9nICkgICAgICAgLy8gbWF0Y2ggYW55IG9wZW4gcGFyZW50aGVzaXMsIG5vdCBmb2xsb3dlZCBieSBhID8KICAgICAgICA7CiAgICAgICAgdmFyIHJlc3VsdCA9IChzdWJtYXRjaGVzIHx8IFtdKS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RlcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBzdGVwTmFtZSBvZiB0aGUgZ2l2ZW4gYmxvY2tOYW1lIAogICAgICogb2YgdGhlIGdpdmVuIHJlY2lwZQogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVjaXBlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmxvY2tOYW1lCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RlcE5hbWUKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gcHJlcGFyZVN0ZXAoIHJlY2lwZSwgYmxvY2tOYW1lLCBzdGVwTmFtZSApIAogICAgewogICAgICAgIHZhciBzdGVwID0gcmVjaXBlWyBibG9ja05hbWUgXVsgc3RlcE5hbWUgXTsKICAgICAgICB2YXIgZXhwID0gKCB0eXBlb2Ygc3RlcC5fbWF0Y2ggPT0gInN0cmluZyIgKSAKICAgICAgICAgICAgPyBzdGVwLl9tYXRjaCAKICAgICAgICAgICAgOiBzdGVwLl9tYXRjaC5zb3VyY2U7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc3RlcC5fcmVwbGFjZSAKICAgICAgICAgICAgPyBzdGVwLl9yZXBsYWNlIAogICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iJDAiPiQkPC9zcGFuPic7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgcmVjaXBlOiAgICAgIHJlY2lwZSwKICAgICAgICAgICAgYmxvY2tOYW1lOiAgIGJsb2NrTmFtZSwKICAgICAgICAgICAgc3RlcE5hbWU6ICAgIHN0ZXBOYW1lLAogICAgICAgICAgICBleHA6ICAgICAgICAgJygnICsgZXhwICsgJyknLCAvLyBuZXcgZXhwIHdpbGwgaGF2ZSAxIG1vcmUgc3VibWF0Y2gKICAgICAgICAgICAgbGVuZ3RoOiAgICAgIG51bWJlck9mU3VibWF0Y2hlcyggZXhwICkgKyAxLAogICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RlcHMsIHdpdGggYmFjayByZWZlcmVuY2VzIGluIHRoZSByZWd1bGFyIAogICAgICogZXhwcmVzc2lvbiBvZiBlYWNoIHN0ZXAgcmVudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBiYWNrIAogICAgICogcmVmZXJlbmNlcyBmb3VuZCBpbiBhbnkgcHJldmlvdXMgc3RlcAogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0ZXBzCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICkKICAgIHsKICAgICAgICB2YXIgcHJldkxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGV4cHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykgewogICAgICAgICAgICB2YXIgZXhwID0gc3RlcHNbIGkgXS5leHA7CiAgICAgICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKCAvXFxcXHxcXChcZCspL2csIAogICAgICAgICAgICAgICAgZnVuY3Rpb24oIG0sIGFOdW0gKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWFOdW0gPyBtIDogIlxcIiArICggcHJldkxlbmd0aCArIDEgKyBwYXJzZUludCggYU51bSwgMTAgKSApOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZXhwcy5wdXNoKCBleHAgKTsKICAgICAgICAgICAgcHJldkxlbmd0aCArPSBzdGVwc1sgaSBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBidWlsdCBmcm9tIGFsbCB0aGUgZ2l2ZW4gc3RlcHMKICAgICAqIAogICAgICogQHBhcmFtIHtBcnJheX0gc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBSZWdFeHAKICAgICAqLwogICAgZnVuY3Rpb24ga25vd0hvdyggc3RlcHMsIGZsYWdzICkgCiAgICB7CiAgICAgICAgdmFyIHByb2xvZyA9ICcoKD86XFxzfFxcUykqPyknOwogICAgICAgIHZhciBlcGlsb2cgPSAnKCg/Olxcc3xcXFMpKyknOwogICAgICAgIHZhciBleHBzID0gYWRqdXN0QmFja1JlZmVyZW5jZXMoIHN0ZXBzICk7CiAgICAgICAgdmFyIHNvdXJjZSA9ICcoPzonICsgZXhwcy5qb2luKCAnfCcgKSArICcpJzsKICAgICAgICBzb3VyY2UgPSBwcm9sb2cgKyBzb3VyY2UgKyAnfCcgKyBlcGlsb2c7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIHNvdXJjZSwgZmxhZ3MgKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiByZXBsYWNlbWVudCwgYWZ0ZXIgYWRkaW5nIHRoZSBnaXZlbiBwcmVmaXggdG8gYWxsIAogICAgICogY2xhc3NlcyBvZiBhbGwgU1BBTnMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeAogICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcGxhY2VtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByZWZpeCggcHJlZml4LCByZXBsYWNlbWVudCApIAogICAgewogICAgICAgIHZhciBsb29rRm9yID0gLyg8c3BhblxzK2NsYXNzXHMqPVxzKihbIiddKSkoKD86KD8hX18pXHcpK1wyXHMqPikvaWc7CiAgICAgICAgdmFyIHJlcGxhY2VXaXRoID0gJyQxJyArIHByZWZpeCArICdfXyQzJzsKICAgICAgICB2YXIgYXV4ID0gcmVwbGFjZW1lbnQucmVwbGFjZSggbG9va0ZvciwgcmVwbGFjZVdpdGggKTsKICAgICAgICByZXR1cm4gYXV4OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0ZXAgaW4gdGhlIGdpdmVuIHN0ZXBzIGFuZCBpdHMgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4KICAgICAqIGFsbE1hdGNoZXMKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHN0ZXBzICAgICAgIHRoZSBzdGVwcyBvZiBhIHJlY2lwZQogICAgICogQHBhcmFtIHtBcnJheX0gIGFsbE1hdGNoZXMgIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBPYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlU3RlcE1hdGNoZXMoIHN0ZXBzLCBhbGxNYXRjaGVzICkKICAgIHsKICAgICAgICB2YXIgbWF0Y2hlc0luZGV4ID0gMjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlUb3A7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdGVwID0gc3RlcHNbIGkgXTsKICAgICAgICAgICAgdmFyIHN0ZXBNYXRjaGVzID0gYWxsTWF0Y2hlc1sgbWF0Y2hlc0luZGV4IF07CiAgICAgICAgICAgIGlmIChzdGVwTWF0Y2hlcykgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoZXNJbmRleCArPSBzdGVwLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZXMgID0gYWxsTWF0Y2hlcy5zbGljZShtYXRjaGVzSW5kZXgsIG1hdGNoZXNJbmRleCArIHN0ZXAubGVuZ3RoKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5kZXggKTsKICAgICAgICBtYXRjaGVzLnB1c2goIGFsbE1hdGNoZXMuaW5wdXQgKTsKICAgICAgICByZXR1cm4ge3N0ZXA6IHN0ZXAsIG1hdGNoZXM6IG1hdGNoZXN9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogZnVuY3Rpb24gaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZnVuY3Rpb25SZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKSAKICAgIHsKICAgICAgICB2YXIgdGhhdCA9IAogICAgICAgIHsgCiAgICAgICAgICAgIHg6IGZ1bmN0aW9uKCBzdWJqZWN0LCBtb2R1bGUgKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseU1vZHVsZSggc3ViamVjdCwgbW9kdWxlLCBzdGVwTWF0Y2hlcy5zdGVwICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudC5hcHBseSh0aGF0LCBzdGVwTWF0Y2hlcy5tYXRjaGVzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgIAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50IGZvciB0aGUgZ2l2ZW4gc3RlcE1hdGNoZXMsIGJhc2VkIG9uIHRoZQogICAgICogdGVtcGxhdGUgaW4gc3RlcE1hdGNoZXMuc3RlcC5yZXBsYWNlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RlcE1hdGNoZXMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVSZXBsYWNlbWVudCggc3RlcE1hdGNoZXMgKQogICAgewogICAgICAgIHZhciByZSA9IC8oXFxcJCl8KD86XCRcJCl8KD86XCQoXGQrKSkvZzsKICAgICAgICB2YXIgc3Vic3RpdHV0aW9uID0gZnVuY3Rpb24oIG0sIGVzY2FwZWQsIEsgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgaWYgKCBlc2NhcGVkICkgICAgICAgIC8qIFwkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiJCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoICFLICkgICAgICAgIC8qICQkICovIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBzdGVwTWF0Y2hlcy5tYXRjaGVzWyAwIF0gKTsgLy9zdGVwTWF0Y2hlcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBLID09ICIwIiApICAvKiAkMCAqLyAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RlcE1hdGNoZXMuc3RlcC5zdGVwTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJEsgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlSHRtbFNwZWNpYWxDaGFycyggc3RlcE1hdGNoZXMubWF0Y2hlc1sgSyBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBzdGVwTWF0Y2hlcy5zdGVwLnJlcGxhY2VtZW50LnJlcGxhY2UocmUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXBsYWNlbWVudCBmb3IgYW55IG1hdGNoIGZvdW5kLiBUaGlzIGlzIGEgY2FsbGJhY2sgCiAgICAgKiBmdW5jdGlvbiBwYXNzZWQgdG8gU3RyaW5nLnJlcGxhY2UoKQogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBjaGVmKCBzdGVwcywgcmVwbGFjZUFyZ3MgKSAKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgdmFyIGFueU1hdGNoID0gcmVwbGFjZUFyZ3NbIDAgXTsKICAgICAgICBpZiAoISBhbnlNYXRjaCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAKICAgICAgICB2YXIgZXBpbG9nID0gcmVwbGFjZUFyZ3NbIHJlcGxhY2VBcmdzLmxlbmd0aCAtIDEgXTsKICAgICAgICBpZiAoZXBpbG9nKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoIGVwaWxvZyApOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcE1hdGNoZXMgPSBsb2NhdGVTdGVwTWF0Y2hlcyggc3RlcHMsIHJlcGxhY2VBcmdzICk7CiAgICAgICAgcmVzdWx0ID0gJC5pc0Z1bmN0aW9uKHN0ZXBNYXRjaGVzLnN0ZXAucmVwbGFjZW1lbnQpCiAgICAgICAgICAgID8gZnVuY3Rpb25SZXBsYWNlbWVudChzdGVwTWF0Y2hlcykKICAgICAgICAgICAgOiB0ZW1wbGF0ZVJlcGxhY2VtZW50KHN0ZXBNYXRjaGVzKQogICAgICAgIDsKICAgICAgICB2YXIgcHJvbG9nID0gcmVwbGFjZUFyZ3NbIDEgXTsKICAgICAgICBwcm9sb2cgPSBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBwcm9sb2cgKTsKICAgICAgICByZXN1bHQgPSBhZGRQcmVmaXgoIHN0ZXBNYXRjaGVzLnN0ZXAucmVjaXBlLl9uYW1lLCByZXN1bHQgKTsKICAgICAgICByZXN1bHQgPSBwcm9sb2cgKyByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdWJqZWN0LCBhZnRlciByZXBsYWNpbmcgYWxsIHRoZSBtYXRjaGVzIG9mIHRoZQogICAgICogZ2l2ZW4gc3RlcHMsIG9mIHRoZSBnaXZlbiByZWNpcGUKICAgICAqICAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVjaXBlCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgc3RlcHMKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlTdGVwcyggc3ViamVjdCwgcmVjaXBlLCBzdGVwcyApCiAgICB7CiAgICAgICAgdmFyIGZsYWdzID0gcmVjaXBlLl9jYXNlIAogICAgICAgICAgICA/ICJnIiAKICAgICAgICAgICAgOiAiZ2kiOwogICAgICAgIHZhciBleHByID0ga25vd0hvdyggc3RlcHMsIGZsYWdzICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBtYXRjaGVzOwogICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IGV4cHIuZXhlYyhzdWJqZWN0KSkgIT0gbnVsbCAmJiBtYXRjaGVzWzBdICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGVmKHN0ZXBzLCBtYXRjaGVzKTsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGluZ3JlZGllbnRzLCBhZnRlciBhcHBseWluZyB0aGUgZ2l2ZW4gc3RlTmFtZSBvZgogICAgICogdGhlIGdpdmVuIGJsb2NrTmFtZSBvZiB0aGUgZ2l2ZW4gcmVjaXBlIHRvIGl0CiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmdyZWRpZW50cwogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IGJsb2NrTmFtZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ZXBOYW1lCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvb2soIGluZ3JlZGllbnRzLCByZWNpcGUsIGJsb2NrTmFtZSwgc3RlcE5hbWUgKSAKICAgIHsKICAgICAgICBpZiAoc3RlcE5hbWUpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0ZXAgID0gcHJlcGFyZVN0ZXAocmVjaXBlLCBibG9ja05hbWUsIHN0ZXBOYW1lKTsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gW3N0ZXBdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoISBibG9ja05hbWUpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja05hbWUgPSAnX21haW4nOwogICAgICAgICAgICAgICAgY2hlY2tTcGljZXMoIHJlY2lwZSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghIGJsb2NrTmFtZSBpbiByZWNpcGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCBpbmdyZWRpZW50cyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHByZXBhcmVCbG9jayhyZWNpcGUsIGJsb2NrTmFtZSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBhcHBseVN0ZXBzKGluZ3JlZGllbnRzLCByZWNpcGUsIHN0ZXBzKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYSBDU1MgY2xhc3MgZGVmaW5pdGlvbiB3aXRoIHRoZSBnaXZlbiBjbGFzc05hbWUgYW5kIHRoZSBnaXZlbgogICAgICogY2xhc3NTdHlsZQogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1N0eWxlCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0NsYXNzRGVmaW5pdGlvbiggY2xhc3NOYW1lLCBjbGFzc1N0eWxlICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJycKICAgICAgICAgICAgKyAnLicgKyBjbGFzc05hbWUgKyAnXG4nCiAgICAgICAgICAgICsgJ3tcbicgCiAgICAgICAgICAgICsgJ1x0JyArIGNsYXNzU3R5bGUgKyAnXG4nCiAgICAgICAgICAgICsgJ31cbicKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBzaGVldCBvZiB0aGUgZ2l2ZW4gcmVjaXBlCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3R5bGVzaGVldCggcmVjaXBlICkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IHJlY2lwZS5fbmFtZTsKICAgICAgICB2YXIgY29udGVudCA9IFsnLyogQ2hpbGkgLS0gJyArIG5hbWUgKyAnICovJ107CiAgICAgICAgZm9yICh2YXIgYmxvY2tOYW1lIGluIHJlY2lwZSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGJsb2NrTmFtZS5zZWFyY2goIC9eXyg/IW1haW5cYikvICkgPj0gMCApIAogICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIF9iYXIgYnV0IG5vdCBfbWFpbiBub3IgZm9vCiAgICAgICAgICAgIHZhciBibG9jayA9IHJlY2lwZVsgYmxvY2tOYW1lIF07CiAgICAgICAgICAgIGZvciAodmFyIHN0ZXBOYW1lIGluIGJsb2NrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSBibG9ja1sgc3RlcE5hbWUgXTsKICAgICAgICAgICAgICAgIGlmICghICdfc3R5bGUnIGluIHN0ZXApIAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlX2RlZiA9IHN0ZXBbICdfc3R5bGUnIF07CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBzdHlsZV9kZWYgPT0gJ3N0cmluZycgKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb1N0eWxlID0ge307CiAgICAgICAgICAgICAgICAgICAgb1N0eWxlWyBzdGVwTmFtZSBdID0gc3R5bGVfZGVmOwogICAgICAgICAgICAgICAgICAgIHN0eWxlX2RlZiA9IG9TdHlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGNsYXNzTmFtZSBpbiBzdHlsZV9kZWYpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGVwQ2xhc3MgPSBuYW1lICsgJ19fJyArIGNsYXNzTmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcFN0eWxlID0gc3R5bGVfZGVmWyBjbGFzc05hbWUgXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gY3NzQ2xhc3NEZWZpbml0aW9uKCBzdGVwQ2xhc3MsIHN0ZXBTdHlsZSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSBjb250ZW50LmpvaW4oJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGdlbmVyYXRlcyBhbmQgbG9hZHMgdGhlIHN0eWxlIHNoZWV0IG9mIHRoZSBnaXZlbiByZWNpcGUgCiAgICAgKiBpbnRvIHRoZSBjdXJyZW50IHBhZ2UKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1NwaWNlcyggcmVjaXBlICkgCiAgICB7CiAgICAgICAgdmFyIG5hbWUgPSByZWNpcGUuX25hbWU7CiAgICAgICAgaWYgKCAhICQuY2hpbGkucXVldWVbIG5hbWUgXSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVzaGVldChyZWNpcGUpOwogICAgICAgICAgICAkLmNoaWxpLmxvYWRTdHlsZXNoZWV0SW5saW5lKHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkLmNoaWxpLnF1ZXVlWyBuYW1lIF0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdGluZyBwYWRkZWQgdG8gaXRzZWxmIHRoZSBnaXZlbiB0aW1lcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZXMKICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0KCBzdHJpbmcsIHRpbWVzICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCAmLCA8LCBhbmQgPiByZXBsYWNlZCBieSB0aGVpciBIVE1MCiAgICAgKiBlbnRpdGllcwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mL2csICImYW1wOyIgKQogICAgICAgICAgICAucmVwbGFjZSggLzwvZywgIiZsdDsiICkKICAgICAgICAgICAgLnJlcGxhY2UoIC8+L2csICImZ3Q7IiApCiAgICAgICAgOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgJiwgPCwgYW5kID4gcmVwbGFjZWQgdG8gdGhlaXIgSFRNTAogICAgICogZW50aXRpZXMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoIC8mYW1wOy9nLCAiJiIgKQogICAgICAgICAgICAucmVwbGFjZSggLyZsdDsvZywgICI8IiApCiAgICAgICAgICAgIC5yZXBsYWNlKCAvJmd0Oy9nLCAgIj4iICkKICAgICAgICA7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gc3ViamVjdCBhbmQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIGFsb25nIAogICAgICogdGhlIGdpdmVuIGFyZ3MsIGZvciBlYWNoIHBpZWNlIG9mIHRleHQgb3IgaHRtbCB0YWcgaXQgZmluZHMKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjYW4oIHN1YmplY3QsIGNhbGxiYWNrLCBhcmdzICkKICAgIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgZXhwciA9IC8oW1x3XFddKj8pKD86KDxcdytbXj5dKlwvPil8KDxcdytbXj5dKj4pfCg8XC9cdytbXj5dKj4pKXwoW1x3XFddKykvaWc7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihhbGwsIHByb2xvZywgdGFnX2VtcHR5LCB0YWdfb3BlbiwgdGFnX2Nsb3NlLCBlcGlsb2cpIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlYWxPZmZzZXQgPSBtYXRjaGVzLmluZGV4OwogICAgICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgICAgIGlmIChlcGlsb2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCd0ZXh0JywgIGVwaWxvZywgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0b2tlbiwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuTWFrZSgndGV4dCcsICBwcm9sb2csIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodG9rZW4sIGFyZ3MpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZWFsT2Zmc2V0ICs9IHByb2xvZy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAodGFnX2VtcHR5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdlbXB0eScsIHRhZ19lbXB0eSwgcmVhbE9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHRhZ19vcGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5NYWtlKCdvcGVuJywgdGFnX29wZW4sIHJlYWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZih0YWdfY2xvc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbk1ha2UoJ2Nsb3NlJywgdGFnX2Nsb3NlLCByZWFsT2Zmc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRva2VuLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIG1hdGNoZXM7CiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gZXhwci5leGVjKHN1YmplY3QpKSAhPSBudWxsICYmIG1hdGNoZXNbMF0gIT0gJycpCiAgICAgICAgewogICAgICAgICAgICBmdW5jLmFwcGx5KHt9LCBtYXRjaGVzKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgc3BhY2VzIHJlcGxhY2VkIGJ5IHRoZSB3cml0aW5nU3BhY2UgCiAgICAgKiBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gZXNjYXBlU3BhY2VzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdTcGFjZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nU3BhY2U7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQucmVwbGFjZSgvIC9nLCB3cml0aW5nU3BhY2UpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgd2l0aCBhbGwgdGFicyByZXBsYWNlZCBieSB0aGUgd3JpdGluZ1RhYiAKICAgICAqIHN0cmluZwogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVUYWJzKCB0ZXh0ICkgCiAgICB7CiAgICAgICAgdmFyIHdyaXRpbmdUYWIgPSAkLmNoaWxpLndoaXRlU3BhY2Uud3JpdGluZ1RhYjsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cdC9nLCB3cml0aW5nVGFiKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQsIHdpdGggYWxsICdcbicgcmVwbGFjZWQgYnkgdGhlIGJyb3dzZXIgbmV3IAogICAgICogbGluZSBzdHJpbmcKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbGluZUZlZWRzVG9OZXdMaW5lcyggdGV4dCApIAogICAgewogICAgICAgIHZhciB3cml0aW5nTmV3TGluZSA9ICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZTsKICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCB3cml0aW5nTmV3TGluZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB0ZXh0LCB3aXRoIGFsbCB0aGUgYnJvd3NlciBuZXcgbGluZSBzdHJpbmdzIAogICAgICogcmVwbGFjZWQgYnkgJ1xuJyAKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gbmV3TGluZXNUb0xpbmVGZWVkcyggdGV4dCApIAogICAgewogICAgICAgIHZhciByZXN1bHQgPSB0ZXh0OwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mbmJzcDs8QlI+L2lnLCAnXG4nKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXHJcbj8vZywgJ1xuJyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHdoaXRlIHNwYWNlIGNvbnN0YW50cyBpbnRvICQuY2hpbGkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqLwogICAgZnVuY3Rpb24gc2V0V2hpdGVTcGFjZUNvbnN0YW50cyggaHRtbCApCiAgICB7CiAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdTcGFjZSA9ICcmIzE2MDsnOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nVGFiID0gcmVwZWF0KCcmIzE2MDsnLCAkLmNoaWxpLndoaXRlU3BhY2UudGFiV2lkdGgpOwogICAgICAgICQuY2hpbGkud2hpdGVTcGFjZS53cml0aW5nTmV3TGluZSA9ICdcbic7CiAgICAgICAgaWYgKC9cclxuPy8udGVzdChodG1sKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gJyYjMTYwOzxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJC5jaGlsaS53aGl0ZVNwYWNlLndyaXRpbmdOZXdMaW5lID0gL1xyXG4vLnRlc3QoaHRtbCkgCiAgICAgICAgICAgICAgICAgICAgPyAnXHJcbicgCiAgICAgICAgICAgICAgICAgICAgOiAnXHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VBZnRlclJlYWRpbmcoIGh0bWwgKQogICAgewogICAgICAgIHNldFdoaXRlU3BhY2VDb25zdGFudHMoaHRtbCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ld0xpbmVzVG9MaW5lRmVlZHMoaHRtbCk7CiAgICAgICAgaWYgKCAkLmNoaWxpLndoaXRlU3BhY2Uubm8xc3RMaW5lICkgCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxuLywgJycpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHRleHQgYWZ0ZXIgbWFraW5nIG5ldyBsaW5lcyB1bmlmb3JtIGFjcm9zcyAKICAgICAqIGFsbCBicm93c2VycwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeFdoaXRlU3BhY2VCZWZvcmVXcml0aW5nKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgc2NhbihodG1sLCBmdW5jdGlvbiAoKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVzY2FwZVNwYWNlcyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZXNjYXBlVGFicyggdmFsdWUgKTsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZUZlZWRzVG9OZXdMaW5lcyggdmFsdWUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogV3JhcHMgYSBnaXZlbiBsaW5lIGludG8gd2VsbCBmb3JtZWQgb3BlbiBhbmQgY2xvc2UgdGFncywgYmFzZWQgb24gdGhlCiAgICAgKiBnaXZlbiBvcGVuIHN0YWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaW5lCiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcGVuCiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdlbGxfZm9ybSggbGluZSwgb3BlbiApCiAgICB7CiAgICAgICAgdmFyIGNsb3NlID0gW107CiAgICAgICAgdmFyIG9wZW5fc3RhcnQgPSBvcGVuLmpvaW4oJycpOwogICAgICAgIHNjYW4obGluZSwgZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnb3BlbicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wZW4ucHVzaCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ2Nsb3NlJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Blbi5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gb3Blbi5sZW5ndGg7IGkgPCBpVG9wOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFnX29wZW4gID0gb3BlbltpXTsKICAgICAgICAgICAgdmFyIHRhZ19jbG9zZSA9IHRhZ19vcGVuLnJlcGxhY2UoL148KFx3KylbXj5dKj4kLywgJzwvJDE+Jyk7CiAgICAgICAgICAgIGNsb3NlLnVuc2hpZnQodGFnX2Nsb3NlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NlX2VuZCA9IGNsb3NlLmpvaW4oJycpOwogICAgICAgIGxpbmUgPSBvcGVuX3N0YXJ0ICsgbGluZSArIGNsb3NlX2VuZDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsaW5lOiAgbGluZSwKICAgICAgICAgICAgb3BlbjogIG9wZW4KICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENvbnZlcnRzIGxpbmVzIGluc2lkZSB0aGUgZ2l2ZW4gZG9tX2VsZW1lbnQgdG8gbGlzdCBpdGVtcyBpbnRvIGFuCiAgICAgKiBvcmRlcmVkIGxpc3QgZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTGlzdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG9wZW4gID0gW107CiAgICAgICAgdmFyIGV4cHIgPSAvKC4qKVxuL2c7CiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoIGFsbCwgbGluZSApIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdlbGxfZm9ybWVkID0gd2VsbF9mb3JtKGxpbmUsIG9wZW4pOwogICAgICAgICAgICBvcGVuID0gd2VsbF9mb3JtZWQub3BlbjsKICAgICAgICAgICAgbGluZSA9IHdlbGxfZm9ybWVkLmxpbmUgCiAgICAgICAgICAgICAgICA/ICc8bGk+JyArIHdlbGxfZm9ybWVkLmxpbmUgKyAnPC9saT4nIAogICAgICAgICAgICAgICAgOiAnPGxpPiA8L2xpPic7IC8vbGVhdmUgYSBzcGFjZSBpbiBlbXB0eSBsaW5lcwogICAgICAgICAgICByZXR1cm4gbGluZTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSBodG1sLnJlcGxhY2UoZXhwciwgZnVuYyk7CiAgICAgICAgcmVzdWx0ID0gJzxvbD4nICsgcmVzdWx0ICsgJzwvb2w+JzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mIHRoZSBvbCB0YWcgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwU3RhcnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cElkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhcnQKICAgICAqLwogICAgZnVuY3Rpb24gc2V0TGluZU51bWJlcnNTdGFydCggYWxsLCBncm91cFN0YXJ0LCBncm91cElkICkKICAgIHsKICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZUludCggZ3JvdXBTdGFydCwgMTAgKTsKICAgICAgICBpZiAoIGdyb3VwSWQgKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciAkcGllY2VzID0gJCggJy4nICsgYWxsICk7CiAgICAgICAgICAgIHZhciBwb3MgPSAkcGllY2VzLmluZGV4KCB0aGlzICk7CiAgICAgICAgICAgICRwaWVjZXMKICAgICAgICAgICAgICAgIC5zbGljZSggMCwgcG9zICkKICAgICAgICAgICAgICAgIC5lYWNoKCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gJCggdGhpcyApLmZpbmQoICdsaScgKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgOwogICAgICAgIH0KICAgICAgICAkKHRoaXMpLmZpbmQoICdvbCcgKS5hdHRyKCdzdGFydCcsIHN0YXJ0KTsKICAgICAgICAvLyByZWZyZXNoIHRoZSB3aW5kb3cKICAgICAgICAkKCdib2R5JykKICAgICAgICAgICAgLndpZHRoKCAkKCdib2R5Jykud2lkdGgoKSAtIDEgKQogICAgICAgICAgICAud2lkdGgoICQoJ2JvZHknKS53aWR0aCgpICsgMSApCiAgICAgICAgOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1ha2UgbGluZSBudW1iZXJzIGFwcGVhciBpbnRvIHRoZSBnaXZlbiBkb21fZWxlbWVudAogICAgICogCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvbV9lbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApIAogICAgewogICAgICAgIHZhciBodG1sID0gJChkb21fZWxlbWVudCkuaHRtbCgpOwogICAgICAgIGh0bWwgPSBmaXhXaGl0ZVNwYWNlQWZ0ZXJSZWFkaW5nKGh0bWwpOwogICAgICAgIGh0bWwgPSBtYWtlT3JkZXJlZExpc3QoIGh0bWwgKTsKICAgICAgICBodG1sID0gZml4V2hpdGVTcGFjZUJlZm9yZVdyaXRpbmcoaHRtbCk7CiAgICAgICAgZG9tX2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBJZiBuZWVkZWQsIGFkZHMgbGluZSBudW1iZXJzIHdpdGggYSBwcm9wZXIgc3RhcnQgdG8gdGhlIGdpdmVuIAogICAgICogZG9tX2VsZW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHtFbGVtZW50fSBkb21fZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0xpbmVOdW1iZXJzKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgdmFyIGxuID0gJC5jaGlsaS5jb2RlTGluZU51bWJlcnMoZG9tX2VsZW1lbnQpOwogICAgICAgIGlmIChsbikgCiAgICAgICAgewogICAgICAgICAgICBhZGRMaW5lTnVtYmVycyhkb21fZWxlbWVudCk7CiAgICAgICAgICAgIHNldExpbmVOdW1iZXJzU3RhcnQuYXBwbHkoZG9tX2VsZW1lbnQsIGxuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJC5jaGlsaS5kZWNvcmF0aW9uLmxpbmVOdW1iZXJzKSAKICAgICAgICB7CiAgICAgICAgICAgIGFkZExpbmVOdW1iZXJzKGRvbV9lbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICAKICAgIC8qKgogICAgICogTWFrZXMgZmlsdGVycyBmcm9tIHRhZ3MgaW50byB0aGF0LnN1YmplY3QsIGFkZHMgdGhvc2UgZmlsdGVycyB0byB0aGF0IAogICAgICogYW5kIGNsZWFucyB1cCB0aGF0LnN1YmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyc1ByZXBhcmUoIHRoYXQgKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhhdC5zdWJqZWN0OwogICAgICAgIGlmICghIC97Olx3K1woLy50ZXN0KHN1YmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybWF0ID0gMDsKICAgICAgICB2YXIgZXhwciA9IC8oezooXHcrKVwoKHwoPzooWyciXSlbXlw0XG5dKig/OlxcLlteXDRcbl0qKSpcNCkoPzpccyosXHMqKChbJyJdKVteXDZcbl0qKD86XFwuW15cNlxuXSopKlw2KSkqKVwpXFspKCg/Oi58XG4pKj8pKFxdXDI6fSkvZzsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKGFsbCwgdGFnX29wZW4sIGNhbGxiYWNrLCBhcmdzLCBpZ25vcmU0LCBpZ25vcmU1LCBpZ25vcmU2LCB0YXJnZXQsIHRhZ19jbG9zZSwgb2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXZhbCgnYXJncyA9IFsnICsgYXJncyArICddOycpOwogICAgICAgICAgICB2YXIgZmlsdGVyID0gewogICAgICAgICAgICAgICAgb3JpZ2luYWw6IHRhcmdldCwKICAgICAgICAgICAgICAgIHN0YXJ0OiAgICBvZmZzZXQgLSBmb3JtYXQsIAogICAgICAgICAgICAgICAgY291bnQ6ICAgIHRhcmdldC5sZW5ndGgsIAogICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLCAKICAgICAgICAgICAgICAgIGFyZ3M6ICAgICBhcmdzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvcm1hdCArPSB0YWdfb3Blbi5sZW5ndGggKyB0YWdfY2xvc2UubGVuZ3RoOwogICAgICAgICAgICBpZiAoJC5pc0FycmF5KHRoYXQuZmlsdGVycykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoYXQuZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGF0LmZpbHRlcnMgPSBbZmlsdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgIH07CiAgICAgICAgc3ViamVjdCA9IGVzY2FwZUh0bWxTcGVjaWFsQ2hhcnMoc3ViamVjdCk7CiAgICAgICAgc3ViamVjdCA9IHN1YmplY3QucmVwbGFjZShleHByLCBmdW5jKTsKICAgICAgICBzdWJqZWN0ID0gdW5lc2NhcGVIdG1sU3BlY2lhbENoYXJzKHN1YmplY3QpOwogICAgICAgIHRoYXQuc3ViamVjdCA9IHN1YmplY3Q7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFrZXMgdXAgYSB0b2tlbiBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUsIHZhbHVlIGFuZCBzdGFydAogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHN0YXJ0CiAgICAgKiAKICAgICAqIEByZXR1cm4gT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuTWFrZSggdHlwZSwgdmFsdWUsIHN0YXJ0ICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICB0eXBlOiAgdHlwZSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBzdGFydDogc3RhcnQKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU3BsaXRzIHRoZSBnaXZlbiBodG1sIGludG8gaXRzIHRhZ3MgYW5kIHRleHRzCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gQXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TcGxpdCggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHZhciBmb3JtYXQgPSAwOwogICAgICAgIHNjYW4oaHRtbCwgZnVuY3Rpb24oKSAKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gdGhpcy52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgLT0gZm9ybWF0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kID0gdGhpcy5zdGFydCArIHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93ICJubyB0eXBlIGNhc2UgZm9yICciICsgdGhpcy50eXBlICsgIiciOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTdHJpcHMgZW1wdHkgc3BhbiB0YWdzIGZyb20gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwKICAgICAqIAogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBFbXB0aWVzKCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbC5yZXBsYWNlKC88c3BhbltePl0rPjxcL3NwYW4+L2csICcnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIEpvaW5zIHZhbHVlcyBvZiBhbGwgdG9rZW5zCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0b2tlbkpvaW4oIHRva2VucyApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpVG9wID0gdG9rZW5zLmxlbmd0aDsgIGkgPCBpVG9wOyAgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJycpOwogICAgICAgIHJlc3VsdCA9IHN0cmlwRW1wdGllcyhyZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogRmluZHMgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdG9rZW5zIGluIHRoZSBnaXZlbiB0b2tlbnMgdGhhdCBjb250YWluIHRoZQogICAgICogYmVnaW4gYW5kIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgd2hvc2UgCiAgICAgKiBsZW5ndGggaXMgdGhlIGdpdmVuIGNvdW50CiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRmluZCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIHZhciBmaXJzdFBvcyAgICAgPSAtMTsKICAgICAgICB2YXIgbGFzdFBvcyAgICAgID0gLTE7CiAgICAgICAgdmFyIHByZXZpb3VzU3BhbiA9ICcnOwogICAgICAgIHZhciBmaXJzdFNwYW4gICAgPSAnJzsKICAgICAgICB2YXIgbGFzdFNwYW4gICAgID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0b2tlbnMubGVuZ3RoOyAgaSA8IGlUb3A7ICBpKyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICdvcGVuJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJldmlvdXNTcGFuID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAnY2xvc2UnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NwYW4gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHRva2VuLmVuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFuID0gcHJldmlvdXNTcGFuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDw9IGVuZCAmJiBlbmQgPCB0b2tlbi5lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgbGFzdFNwYW4gPSBwcmV2aW91c1NwYW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQb3MgIT0gLTEgJiYgbGFzdFBvcyAhPSAtMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBmaXJzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGZpcnN0UG9zLCAKICAgICAgICAgICAgICAgIHNwYW46IGZpcnN0U3BhbgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbGFzdDogewogICAgICAgICAgICAgICAgcG9zaXRpb246IGxhc3RQb3MsIAogICAgICAgICAgICAgICAgc3BhbjogbGFzdFNwYW4KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbnMgdGhhdCByZXN1bHQgZnJvbSBicmVha2luZyBpbiB0d28gZ2l2ZW4gdG9rZW4gYXQgdGhlIAogICAgICogZ2l2ZW4gcG9zaXRpb247IGlmIHRoZSBnaXZlbiBzcGFuIGlzIG5vdCBlbXB0eSwgdHdvIGFkZGl0aW9uYWwgdG9rZW5zIGFyZSAKICAgICAqIHJldHVybmVkIHRvIGxlYXZlIHRoZSBzZXF1ZW5jZSB3ZWxsIGZvcm1lZAogICAgICogCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9rZW4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcGFuCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5CcmVhayggdG9rZW4sIHBvc2l0aW9uLCBzcGFuICkKICAgIHsKICAgICAgICB2YXIgZmlyc3RUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKDAsIHBvc2l0aW9uKTsKICAgICAgICB2YXIgZmlyc3RUb2tlbiA9IHRva2VuTWFrZSgndGV4dCcsIGZpcnN0VGV4dCwgdG9rZW4uc3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4uZW5kID0gdG9rZW4uc3RhcnQgKyBmaXJzdFRleHQubGVuZ3RoOwogICAgICAgIAogICAgICAgIHZhciBzZWNvbmRUZXh0ID0gdG9rZW4udmFsdWUuc3Vic3RyKHBvc2l0aW9uKTsKICAgICAgICB2YXIgc2Vjb25kVG9rZW4gPSB0b2tlbk1ha2UoJ3RleHQnLCBzZWNvbmRUZXh0LCB0b2tlbi5zdGFydCArIHBvc2l0aW9uKTsKICAgICAgICBzZWNvbmRUb2tlbi5lbmQgPSB0b2tlbi5zdGFydCArIHBvc2l0aW9uICsgc2Vjb25kVGV4dC5sZW5ndGg7CiAgICAgICAgCiAgICAgICAgdmFyIHJlc3VsdCA9IHsgCiAgICAgICAgICAgIGZpcnN0OiAgW2ZpcnN0VG9rZW5dLCAKICAgICAgICAgICAgc2Vjb25kOiBbc2Vjb25kVG9rZW5dIAogICAgICAgIH07CiAgICAgICAgaWYgKHNwYW4pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuZmlyc3QucHVzaCh0b2tlbk1ha2UoJ2Nsb3NlJywgJzwvc3Bhbj4nKSk7CiAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQudW5zaGlmdCh0b2tlbk1ha2UoJ29wZW4nLCBzcGFuKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBodG1sIHRva2VuIG91dCBvZiB0aGUgZ2l2ZW4gdG9rZW5zIGFuZCBpbnNlcnQgaXQgYXQgdGhlIAogICAgICogcmlnaHQgcG9zaXRpb24gaW50byB0aGVtLiBUaGUgdG9rZW4gY29udGFpbnMgYWxsIHRoZSBzdHJpbmcgdGhhdCBzdGFydHMgCiAgICAgKiBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHdob3NlIGxlbmd0aCBpcyB0aGUgZ2l2ZW4gY291bnQuIAogICAgICogUmVzdWx0aW5nIHRva2VucyBhcmUgd2VsbCBmb3JtZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VucwogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzdGFydAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuRXh0cmFjdCggdG9rZW5zLCBzdGFydCwgY291bnQgKQogICAgewogICAgICAgIHZhciBlbmQgPSBzdGFydCArIGNvdW50OwogICAgICAgIAogICAgICAgIHZhciBmb3VuZCA9IHRva2VuRmluZCh0b2tlbnMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgdmFyIGJlZm9yZVRva2VucyA9IHRva2Vucy5zbGljZSgwLCBmb3VuZC5maXJzdC5wb3NpdGlvbik7CiAgICAgICAgdmFyIGZpcnN0VG9rZW4gICA9IHRva2Vuc1tmb3VuZC5maXJzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIG1pZGRsZVRva2VucyA9IHRva2Vucy5zbGljZShmb3VuZC5maXJzdC5wb3NpdGlvbiArIDEsIGZvdW5kLmxhc3QucG9zaXRpb24pOwogICAgICAgIHZhciBsYXN0VG9rZW4gICAgPSB0b2tlbnNbZm91bmQubGFzdC5wb3NpdGlvbl07CiAgICAgICAgdmFyIGFmdGVyVG9rZW5zICA9IHRva2Vucy5zbGljZShmb3VuZC5sYXN0LnBvc2l0aW9uICsgMSk7CiAgICAgICAgCiAgICAgICAgdmFyIGZpcnN0VG9rZW5zID0gdG9rZW5CcmVhayhmaXJzdFRva2VuLCBzdGFydCAtIGZpcnN0VG9rZW4uc3RhcnQsIGZvdW5kLmZpcnN0LnNwYW4pOwogICAgICAgIHZhciBsYXN0VG9rZW5zICA9IHRva2VuQnJlYWsobGFzdFRva2VuLCAgZW5kICAgLSBsYXN0VG9rZW4uc3RhcnQsICBmb3VuZC5sYXN0LnNwYW4pOwogICAgICAgIAogICAgICAgIHZhciBuZXdWYWx1ZSA9IFtdLmNvbmNhdCgKICAgICAgICAgICAgZmlyc3RUb2tlbnMuc2Vjb25kLCAKICAgICAgICAgICAgbWlkZGxlVG9rZW5zLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5maXJzdAogICAgICAgICk7CiAgICAgICAgbmV3VmFsdWUgPSB0b2tlbkpvaW4obmV3VmFsdWUpOwogICAgICAgIHZhciBuZXdUb2tlbiA9IHRva2VuTWFrZSgnaHRtbCcsIG5ld1ZhbHVlLCBzdGFydCk7CiAgICAgICAgCiAgICAgICAgdG9rZW5zID0gW10uY29uY2F0KAogICAgICAgICAgICBiZWZvcmVUb2tlbnMsIAogICAgICAgICAgICBmaXJzdFRva2Vucy5maXJzdCwgCiAgICAgICAgICAgIG5ld1Rva2VuLCAKICAgICAgICAgICAgbGFzdFRva2Vucy5zZWNvbmQsIAogICAgICAgICAgICBhZnRlclRva2VucwogICAgICAgICk7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgdG9rZW5zOiAgIHRva2VucywKICAgICAgICAgICAgcG9zaXRpb246IGJlZm9yZVRva2Vucy5sZW5ndGggKyBmaXJzdFRva2Vucy5maXJzdC5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXBwbGllcyBhbGwgdGhlIGZpbHRlcnMgb2YgdGhlIGdpdmVuIHRoYXQgdG8gdGhlIGdpdmVuIGh0bWwKICAgICAqIAogICAgICogQHBhcmFtIHtPYmplY3R9IHRoYXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sCiAgICAgKiAKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcnNQcm9jZXNzKCB0aGF0LCBodG1sICkKICAgIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaHRtbDsKICAgICAgICBpZiAoISB0aGF0LmZpbHRlcnMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlUb3AgPSB0aGF0LmZpbHRlcnMubGVuZ3RoOyBpIDwgaVRvcDsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGF0LmZpbHRlcnNbaV07CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9ICQuY2hpbGkuZmlsdGVycyAmJiAkLmNoaWxpLmZpbHRlcnNbIGZpbHRlci5jYWxsYmFjayBdOwogICAgICAgICAgICBpZiAoISAoY2FsbGJhY2sgJiYgJC5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwID09IHRva2Vucy5sZW5ndGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuU3BsaXQoaHRtbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV4dHJhY3Rpb24gPSB0b2tlbkV4dHJhY3QodG9rZW5zLCBmaWx0ZXIuc3RhcnQsIGZpbHRlci5jb3VudCk7CiAgICAgICAgICAgIHRva2VucyA9IGV4dHJhY3Rpb24udG9rZW5zOwogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBleHRyYWN0aW9uLnBvc2l0aW9uOwogICAgICAgICAgICB2YXIgZmlsdGVySW5wdXQgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmaWx0ZXIub3JpZ2luYWwsCiAgICAgICAgICAgICAgICBodG1sOiB0b2tlbnNbIHBvc2l0aW9uIF0udmFsdWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBmaWx0ZXIuYXJnczsKICAgICAgICAgICAgdmFyIGZpbHRlck91dHB1dCA9IGNhbGxiYWNrLmFwcGx5KGZpbHRlcklucHV0LCBhcmdzKTsKICAgICAgICAgICAgdG9rZW5zWyBwb3NpdGlvbiBdLnZhbHVlID0gZmlsdGVyT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IHRva2Vucy5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSB0b2tlbkpvaW4odG9rZW5zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgICAgIAogICAgLyoqCiAgICAgKiBDbGVhcnMgYW55dGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKQogICAgewogICAgICAgIGlmICgkLmJyb3dzZXIubXNpZSkgCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50CiAgICAgKiAKICAgICAqIFRoaXMgaXMgbGF0ZXIgdXNlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHNlbGVjdGVkIHRleHQgZnJvbQogICAgICogdGhlIHNhbWUgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZXNldFNlbGVjdGVkVGV4dEVsZW1lbnQoKSAKICAgIHsKICAgICAgICBlbGVtZW50ID0gdGhpczsKICAgICAgICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGV4dCBzZWxlY3RlZCBieSB0aGUgdXNlcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZFRleHQoKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKCQuYnJvd3Nlci5tc2llKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHZhciByYW5nZSAgICAgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHJhbmdlICAgICA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIC8vc2VsZWN0aW9uIHdvcmtzIGZvciBsaW5lIG51bWJlcnMgb24sIHJhbmdlIG90aGVyd2lzZQogICAgICAgICAgICByZXN1bHQgPSAvXG4vLnRlc3Qoc2VsZWN0aW9uKSA/IHNlbGVjdGlvbiA6IHJhbmdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGh0bWwgYWZ0ZXIgcmVwbGFjaW5nIGFueSBIVE1MIGJyZWFrIGFuZCBibG9jayBieSBhIAogICAgICogbmV3IGxpbmUKICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbAogICAgICogCiAgICAgKiBAcmV0dXJuIFN0cmluZyAKICAgICAqLwogICAgZnVuY3Rpb24gcHJlc2VydmVOZXdMaW5lcyggaHRtbCApCiAgICB7CiAgICAgICAgdmFyIG5ld2xpbmVfZmxhZyA9IHVuaXF1ZShodG1sKTsKICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIGlmICgvPGJyXGIvaS50ZXN0KGh0bWwpIHx8IC88bGlcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKC88YnJcYi9pLnRlc3QoaHRtbCkpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCAvXDxicltePl0qP1w+L2lnLCBuZXdsaW5lX2ZsYWcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgvPGxpXGIvaS50ZXN0KGh0bWwpKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSggLzxvbFtePl0qPz58PFwvb2w+fDxsaVtePl0qPz4vaWcsICcnICkucmVwbGFjZSggLzxcL2xpPi9pZywgbmV3bGluZV9mbGFnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsID0gJCggJzxwcmU+JyApLmFwcGVuZFRvKCAnYm9keScgKS5oaWRlKClbMF07CiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgIHRleHQgPSAkKCBlbCApLnRleHQoKS5yZXBsYWNlKCBuZXcgUmVnRXhwKCBuZXdsaW5lX2ZsYWcsICJnIiApLCAnXHJcbicgKTsKICAgICAgICAgICAgJCggZWwgKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gdGV4dCwgYWZ0ZXIgcmVtb3ZpbmcgZ2FyYmFnZSBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVGV4dCggdGV4dCApCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICQuYnJvd3Nlci5tc2llCiAgICAgICAgICAgID8gcHJlc2VydmVOZXdMaW5lcyh0ZXh0KQogICAgICAgICAgICA6IHRleHQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXHIvZywgJycgKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eIyA/L2csICcnICkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvXG4jID8vZywgJ1xuJyApOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvd3MgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGV4dAogICAgICovCiAgICBmdW5jdGlvbiBtYWtlRGlhbG9nKCBzZWxlY3RlZCwgZXZlbnQgKQogICAgewogICAgICAgIHZhciBib3hPcHRpb25zID0gJC5jaGlsaS5zZWxlY3Rpb24uYm94OwogICAgICAgIHZhciBib3hUYWcgPSAkLmJyb3dzZXIubXNpZQogICAgICAgICAgICA/ICgnPHRleHRhcmVhIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpCiAgICAgICAgICAgIDogKCc8cHJlIHN0eWxlPSInICsgYm94T3B0aW9ucy5zdHlsZSArICciPicpOwogICAgICAgICAgICAKICAgICAgICB2YXIgYm94RWxlbWVudCA9ICQoYm94VGFnKQogICAgICAgICAgICAuYXBwZW5kVG8oICdib2R5JyApCiAgICAgICAgICAgIC50ZXh0KCBzZWxlY3RlZCApCiAgICAgICAgICAgIC5hdHRyKCAnaWQnLCAnY2hpbGlfc2VsZWN0aW9uJyApCiAgICAgICAgICAgIC5jbGljayggZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0gKQogICAgICAgIDsKICAgICAgICB2YXIgdG9wICA9IGJveE9wdGlvbnMudG9wKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIHZhciBsZWZ0ID0gYm94T3B0aW9ucy5sZWZ0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSwgCiAgICAgICAgICAgICAgICBib3hFbGVtZW50LndpZHRoKCksIGJveEVsZW1lbnQuaGVpZ2h0KCkpOwogICAgICAgIGJveEVsZW1lbnQuY3NzKCB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH0gKTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGJveEVsZW1lbnQ7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2VsZWN0cyB0aGUgdGV4dCBpbiB0aGUgZ2l2ZW4gJGNvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RUZXh0QWdhaW4oJGNvbnRhaW5lcikKICAgIHsKICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIAogICAgICAgIHsKICAgICAgICAgICAgJGNvbnRhaW5lclswXS5mb2N1cygpOwogICAgICAgICAgICAkY29udGFpbmVyWzBdLnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHMucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoICRjb250YWluZXJbMF0gKTsKICAgICAgICAgICAgcy5hZGRSYW5nZSggciApOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTaG93cyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSB0ZXh0IHNlbGVjdGVkIGJ5IHRoZSB1c2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BsYXlTZWxlY3RlZFRleHREaWFsb2coIGV2ZW50ICkgCiAgICB7CiAgICAgICAgaWYgKCEgKGVsZW1lbnQgJiYgZWxlbWVudCA9PSB0aGlzKSkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsZW1lbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSBnZXRTZWxlY3RlZFRleHQoKTsKICAgICAgICBpZiAoICcnID09IHNlbGVjdGVkVGV4dCApIAogICAgICAgIHsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gY2xlYW5UZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgCiAgICAgICAgdmFyICRjb250YWluZXIgPSBtYWtlRGlhbG9nKHNlbGVjdGVkVGV4dCwgZXZlbnQpOwogICAgICAgIHNlbGVjdFRleHRBZ2FpbigkY29udGFpbmVyKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBXaGVuIGEgdXNlciBzZWxlY3RzIGhpZ2hsaWdodGVkIHRleHQsIElFIGFuZCBGRiByZXR1cm5zIGEgbWVzczogdGhpcwogICAgICogZnVuY3Rpb24gZGlzcGxheXMgYSBtaW5pbWFsIGRpYWxvZyB3aXRoIHRoZSBzZWxlY3RlZCB0ZXh0LCBjbGVhbmVkIHVwIAogICAgICovCiAgICBmdW5jdGlvbiBmaXhUZXh0U2VsZWN0aW9uKCBkb21fZWxlbWVudCApCiAgICB7CiAgICAgICAgLy9jaHJvbWUsIG9wZXJhLCBhbmQgc2FmYXJpIHNlbGVjdCBQUkUgdGV4dCBjb3JyZWN0bHkgCiAgICAgICAgaWYgKCQuY2hpbGkuc2VsZWN0aW9uLmFjdGl2ZSAmJiAoJC5icm93c2VyLm1zaWUgfHwgJC5icm93c2VyLm1vemlsbGEpKSAKICAgICAgICB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgJChkb21fZWxlbWVudCkKICAgICAgICAgICAgICAgIC5wYXJlbnRzKCkKICAgICAgICAgICAgICAgIC5maWx0ZXIoInByZSIpCiAgICAgICAgICAgICAgICAuYmluZCgibW91c2Vkb3duIiwgcmVzZXRTZWxlY3RlZFRleHRFbGVtZW50KQogICAgICAgICAgICAgICAgLmJpbmQoIm1vdXNldXAiLCBkaXNwbGF5U2VsZWN0ZWRUZXh0RGlhbG9nKQogICAgICAgICAgICA7CiAgICAgICAgfQogICAgfQogICAgCiAgICB9CikoalF1ZXJ5KTsK</File> | |
| 56 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.javascript.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLnJlY2lwZXMuamF2YXNjcmlwdCA9CnsKICAgICAgX25hbWU6ICdqcycKICAgICwgX2Nhc2U6IHRydWUKICAgICwgX21haW46IHsKICAgICAgICAgIG1sX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyYXk7JwogICAgICAgIH0KICAgICAgICAsIHNsX2NvbW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9cLy4qLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBncmVlbjsnCiAgICAgICAgfQogICAgICAgICwgc3RyaW5nOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogLyg/OlwnW15cJ1xcXG5dKig/OlxcLlteXCdcXFxuXSopKlwnKXwoPzpcIlteXCJcXFxuXSooPzpcXC5bXlwiXFxcbl0qKSpcIikvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHRlYWw7JwogICAgICAgIH0KICAgICAgICAsIG51bTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYlsrLV0/KD86XGQqXC4/XGQrfFxkK1wuP1xkKikoPzpbZUVdWystXT9cZCspP1xiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7JwogICAgICAgIH0KICAgICAgICAsIHJlZ19ub3Q6IHsgLy90aGlzIHByZXZlbnRzICJhIC8gYiAvIGMiIHRvIGJlIGludGVycHJldGVkIGFzIGEgcmVnX2V4cAogICAgICAgICAgICAgIF9tYXRjaDogLyg/Olx3K1xzKilcL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKig/OlxzKlx3KykvCiAgICAgICAgICAgICwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54KCBhbGwsICcvL251bScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAsIHJlZ19leHA6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXC9bXlwvXFxcbl0qKD86XFwuW15cL1xcXG5dKikqXC9bZ2ltXSovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG1hcm9vbjsnCiAgICAgICAgfQogICAgICAgICwgYnJhY2U6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvW1x7XH1dLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBzdGF0ZW1lbnQ6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIod2l0aHx3aGlsZXx2YXJ8dHJ5fHRocm93fHN3aXRjaHxyZXR1cm58aWZ8Zm9yfGZpbmFsbHl8ZWxzZXxkb3xkZWZhdWx0fGNvbnRpbnVlfGNvbnN0fGNhdGNofGNhc2V8YnJlYWspXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IG5hdnk7IGZvbnQtd2VpZ2h0OiBib2xkOycKICAgICAgICB9CiAgICAgICAgLCBlcnJvcjogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihVUklFcnJvcnxUeXBlRXJyb3J8U3ludGF4RXJyb3J8UmVmZXJlbmNlRXJyb3J8UmFuZ2VFcnJvcnxFdmFsRXJyb3J8RXJyb3IpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IENvcmFsOycKICAgICAgICB9CiAgICAgICAgLCBvYmplY3Q6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoU3RyaW5nfFJlZ0V4cHxPYmplY3R8TnVtYmVyfE1hdGh8RnVuY3Rpb258RGF0ZXxCb29sZWFufEFycmF5KVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBEZWVwUGluazsnCiAgICAgICAgfQogICAgICAgICwgcHJvcGVydHk6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodW5kZWZpbmVkfGFyZ3VtZW50c3xOYU58SW5maW5pdHkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsICdmdW5jdGlvbic6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvXGIocGFyc2VJbnR8cGFyc2VGbG9hdHxpc05hTnxpc0Zpbml0ZXxldmFsfGVuY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogb2xpdmU7JwogICAgICAgIH0KICAgICAgICAsIG9wZXJhdG9yOiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIodm9pZHx0eXBlb2Z8dGhpc3xuZXd8aW5zdGFuY2VvZnxpbnxmdW5jdGlvbnxkZWxldGUpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IFJveWFsQmx1ZTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGxpdmVjb25uZWN0OiB7CiAgICAgICAgICAgICAgX21hdGNoOiAvXGIoc3VufG5ldHNjYXBlfGphdmF8UGFja2FnZXN8SmF2YVBhY2thZ2V8SmF2YU9iamVjdHxKYXZhQ2xhc3N8SmF2YUFycmF5fEpTT2JqZWN0fEpTRXhjZXB0aW9uKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7JwogICAgICAgIH0KICAgIH0KfTs=</File> | |
| 57 | + <File Location="var/httpd/htdocs/js/thirdparty/jquerychili/jquery.chili.recipes.js" Permission="644" Encode="Base64">alF1ZXJ5LmNoaWxpLm9wdGlvbnMuZHluYW1pYy5hY3RpdmUgPSBmYWxzZTsKCgoKLyogdGhpcyByZWNpcGUgdXNlcyBhIGxpdHRsZSB0cmljayBmb3IgaGlnaGxpZ2h0aW5nIHBocCBjb2RlCiAqICAgMTogcmVwbGFjZSBlYWNoIHBocCBzbmlwcGV0IHdpdGggYSBwbGFjZWhvbGRlcgogKiAgIDI6IGhpZ2hsaWdodCBodG1sIHdpdGhvdXQgcGhwIGFuZCBwaHAgc25pcHBldHMgYXBhcnQKICogICAzOiByZXBsYWNlIGVhY2ggcGxhY2Vob2xkZXIgd2l0aCBpdHMgaGlnaGxpZ2h0ZWQgcGhwIHNuaXBwZXQKICogCiAqIHRoZSB0cmljayBpcyBub3QgcGVyZmVjdAogKi8KalF1ZXJ5LmNoaWxpLnJlY2lwZXMucGhwID0gCnsKCSAgX25hbWU6ICJwaHAiCgksIF9jYXNlOiB0cnVlCgksIF9tYWluOiB7CgkJICBhbGw6IHsKCQkJICBfbWF0Y2g6IC9bXHdcV10qLyAKCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKCQkJCXZhciBwbGFjZWhvbGRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CgkJCQl2YXIgYmxvY2tzID0gW107CgkJCQl2YXIgdGhhdCA9IHRoaXM7CgkJCQl2YXIgbm9fcGhwXzEgPSBhbGwucmVwbGFjZSggLzxcP1teP10qXD8rKD86W14+XVteP10qXD8rKSo+L2csIGZ1bmN0aW9uKCBibG9jayApIHsKCQkJCQlibG9ja3MucHVzaCggdGhhdC54KCBibG9jaywgJy9ibG9jay9waHBfMScgKSApOwoJCQkJCXJldHVybiBwbGFjZWhvbGRlcjsKCQkJCX0gKTsKCQkJCXZhciBub19waHBfMiA9IG5vX3BocF8xLnJlcGxhY2UoIC9eW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj58PFw/W1x3XFddKiQvZywgZnVuY3Rpb24oIGJsb2NrICkgewoJCQkJCWJsb2Nrcy5wdXNoKCB0aGF0LngoIGJsb2NrLCAnL2Jsb2NrL3BocF8yJyApICk7CgkJCQkJcmV0dXJuIHBsYWNlaG9sZGVyOwoJCQkJfSApOwoJCQkJaWYoIGJsb2Nrcy5sZW5ndGggKSB7CgkJCQkJdmFyIGh0bWwgPSB0aGlzLngoIG5vX3BocF8yLCAnaHRtbCcgKTsKCQkJCQl2YXIgY291bnQgPSAwOwoJCQkJCXJldHVybiBodG1sLnJlcGxhY2UoIG5ldyBSZWdFeHAoIHBsYWNlaG9sZGVyLCAiZyIgKSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBibG9ja3NbIGNvdW50KysgXTsKCQkJCQl9ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gdGhpcy54KCBhbGwsICcvcGhwJyApOwoJCQkJfQoJCQl9CgkJfQoJfQoJLCBibG9jazogewoJCSAgcGhwXzE6IHsgLy8gLS0tIDw/ICsrKyA/PiAtLS0KCQkJICBfbWF0Y2g6IC8oPFw/KD86cGhwXGIpPykoW14/XSpcPysoPzpbXj5dW14/XSpcPyspKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50ICkgewoJCQkJcmV0dXJuICI8c3BhbiBjbGFzcz0nc3RhcnQnPiIgKyB0aGlzLngoIG9wZW4gKSArICI8L3NwYW4+IgoJCQkJCSsgdGhpcy54KCBjb250ZW50LnJlcGxhY2UoIC9cPz4kLywgJycgKSwgJy9waHAnICkgCgkJCQkJKyAiPHNwYW4gY2xhc3M9J2VuZCc+IiArIHRoaXMueCggJz8+JyApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiB7CgkJCQkJICBzdGFydDogImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkIgoJCQkJCSwgZW5kOiAgICJjb2xvcjogcmVkOyIKCQkJfQoJCX0KCQksIHBocF8yOiB7IC8vICsrKyA/PiAtLS0gPD8gKysrCgkJCSAgX21hdGNoOiAvKFteP10qXD8rKD86W14+XVteP10qXD8rKSo+KXwoPFw/KD86cGhwXGIpPykoW1x3XFddKikvCgkJCSwgX3JlcGxhY2U6IGZ1bmN0aW9uKCBhbGwsIGNvbnRlbnQsIG9wZW4yLCBjb250ZW50MiApIHsKCQkJCWlmKCBvcGVuMiApIHsKCQkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdzdGFydCc+IiArIHRoaXMueCggb3BlbjIgKSArICI8L3NwYW4+IgoJCQkJCQkrIHRoaXMueCggY29udGVudDIsICcvcGhwJyApOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMueCggY29udGVudC5yZXBsYWNlKCAvXD8+JC8sICcnICksICcvcGhwJyApIAoJCQkJCQkrICI8c3BhbiBjbGFzcz0nZW5kJz4iICsgdGhpcy54KCAnPz4nICkgKyAiPC9zcGFuPiI7CgkJCQl9CgkJCX0KCQkJLCBfc3R5bGU6IHsKCQkJCQkgIHN0YXJ0OiAiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQiCgkJCQkJLCBlbmQ6ICAgImNvbG9yOiByZWQ7IgoJCQl9CgkJfQoJfQoJLCBwaHA6IHsKCQkgIG1sY29tOiB7CgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKFteXC9dW14qXSpcKispKlwvLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JheTsiCgkJfQoJCSwgY29tOiB7CgkJCSAgX21hdGNoOiAvKD86XC9cLy4qKXwoPzpbXlxcXVwjLiopLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogZ3JlZW47IgoJCX0KCQksIHN0cmluZzE6IHsKCQkJICBfbWF0Y2g6IC9cJ1teXCdcXF0qKD86XFwuW15cJ1xcXSopKlwnLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcHVycGxlOyIKCQl9CgkJLCBzdHJpbmcyOiB7CgkJCSAgX21hdGNoOiAvXCJbXlwiXFxdKig/OlxcLlteXCJcXF0qKSpcIi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGZ1Y2hzaWE7IgoJCX0KCQksIHZhbHVlOiB7CgkJCSAgX21hdGNoOiAvXGIoPzpbTm5dW1V1XVtMbF1bTGxdfFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgbnVtYmVyOiB7CgkJCSAgX21hdGNoOiAvXGJbKy1dPyhcZCpcLj9cZCt8XGQrXC4/XGQqKShbZUVdWystXT9cZCspP1xiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb25zdDE6IHsKCQkJICBfbWF0Y2g6IC9cYig/OkRFRkFVTFRfSU5DTFVERV9QQVRIfEVfKD86QUxMfENPKD86TVBJTEVfKD86RVJST1J8V0FSTklORyl8UkVfKD86RVJST1J8V0FSTklORykpfEVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXxIUF8oPzpCSU5ESVJ8Q09ORklHX0ZJTEVfKD86UEFUSHxTQ0FOX0RJUil8REFUQURJUnxFKD86T0x8WFRFTlNJT05fRElSKXxJTlRfKD86TUFYfFNJWkUpfEwoPzpJQkRJUnxPQ0FMU1RBVEVESVIpfE8oPzpTfFVUUFVUX0hBTkRMRVJfKD86Q09OVHxFTkR8U1RBUlQpKXxQUkVGSVh8Uyg/OkFQSXxITElCX1NVRkZJWHxZU0NPTkZESVIpfFZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiByZWQ7IgoJCX0KCQksIGNvbnN0MjogewoJCQkgIF9tYXRjaDogL1xiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKSlcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwgZ2xvYmFsOiB7CgkJCSAgX21hdGNoOiAvKD86XCRHTE9CQUxTfFwkX0NPT0tJRXxcJF9FTlZ8XCRfRklMRVN8XCRfR0VUfFwkX1BPU1R8XCRfUkVRVUVTVHxcJF9TRVJWRVJ8XCRfU0VTU0lPTnxcJHBocF9lcnJvcm1zZylcYi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IHJlZDsiCgkJfQoJCSwga2V5d29yZDogewoJCQkgIF9tYXRjaDogL1xiKD86X19DTEFTU19ffF9fRklMRV9ffF9fRlVOQ1RJT05fX3xfX0xJTkVfX3xfX01FVEhPRF9ffGFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNmdW5jdGlvbnxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZXZhbHxleGNlcHRpb258ZXhpdHxleHRlbmRzfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bmV3fG9sZF9mdW5jdGlvbnxvcnxwaHBfdXNlcl9maWx0ZXJ8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzdGF0aWN8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yKVxiLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCQksIHZhcmlhYmxlOiB7CgkJCSAgX21hdGNoOiAvXCQoXHcrKS8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kPC9zcGFuPjxzcGFuIGNsYXNzPSJ2YXJpYWJsZSI+JDE8L3NwYW4+JyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogIzQwNDBjMjsiCgkJfQoJCSwgaGVyZWRvYzogewoJCQkgIF9tYXRjaDogLyhcPFw8XDxccyopKFx3KykoKD86KD8hXDIpLipcbikrKShcMilcYi8KCQkJLCBfcmVwbGFjZTogJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4kMTwvc3Bhbj48c3BhbiBjbGFzcz0ic3RyaW5nMSI+JDI8L3NwYW4+PHNwYW4gY2xhc3M9InN0cmluZzIiPiQzPC9zcGFuPjxzcGFuIGNsYXNzPSJzdHJpbmcxIj4kNDwvc3Bhbj4nIAoJCX0KCX0KfTsKCgoKalF1ZXJ5LmNoaWxpLnJlY2lwZXMuaHRtbCA9IAp7CgkgIF9uYW1lOiAnaHRtbCcKCSwgX2Nhc2U6IGZhbHNlCgksIF9tYWluOiB7CgkJICBkb2N0eXBlOiB7IAoJCQkgIF9tYXRjaDogLzwhRE9DVFlQRVxiW1x3XFddKj8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogI0NDNjYwMDsiCgkJfQoJCSwgaWVfc3R5bGU6IHsKCQkJICBfbWF0Y2g6IC8oPCEtLVxbW15cXV0qXF0+KShbXHdcV10qPykoPCFcW1teXF1dKlxdLS0+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7CgkJCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSdpZV9zdHlsZSc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvL3N0eWxlJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J2llX3N0eWxlJz4iICsgdGhpcy54KCBjbG9zZSApICsgIjwvc3Bhbj4iOwoJCQl9CgkJCSwgX3N0eWxlOiAiY29sb3I6IERhcmtTbGF0ZUdyYXk7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBjb21tZW50OiB7IAoJCQkgIF9tYXRjaDogLzwhLS1bXHdcV10qPy0tPi8gCgkJCSwgX3N0eWxlOiAiY29sb3I6ICM0MDQwYzI7IgoJCX0KCQksIHNjcmlwdDogeyAKCQkJICBfbWF0Y2g6IC8oPHNjcmlwdFxzK1tePl0qPikoW1x3XFddKj8pKDxcL3NjcmlwdFxzKj4pLwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiB0aGlzLngoIG9wZW4sICcvL3RhZ19zdGFydCcgKSAKCQkJCQkgICsgdGhpcy54KCBjb250ZW50LCAnamF2YXNjcmlwdCcgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLCBzdHlsZTogeyAKCQkJICBfbWF0Y2g6IC8oPHN0eWxlXHMrW14+XSo+KShbXHdcV10qPykoPFwvc3R5bGVccyo+KS8KCQkJLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCwgb3BlbiwgY29udGVudCwgY2xvc2UgKSB7IAoJCQkJICByZXR1cm4gdGhpcy54KCBvcGVuLCAnLy90YWdfc3RhcnQnICkgCgkJCQkJICArIHRoaXMueCggY29udGVudCwgJ2NzcycgKSAKCQkJCQkgICsgdGhpcy54KCBjbG9zZSwgJy8vdGFnX2VuZCcgKTsKCQkJfSAKCQl9CgkJLy8gbWF0Y2hlcyBhIHN0YXJ0aW5nIHRhZyBvZiBhbiBlbGVtZW50ICh3aXRoIGF0dHJzKQoJCS8vIGxpa2UgIjxkaXYgLi4uID4iIG9yICI8aW1nIC4uLiAvPiIKCQksIHRhZ19zdGFydDogeyAKCQkJICBfbWF0Y2g6IC8oPFx3KykoKD86Wz8lXT58W1x3XFddKSo/KShcLz58PikvIAoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBvcGVuLCBjb250ZW50LCBjbG9zZSApIHsgCgkJCQkgIHJldHVybiAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggb3BlbiApICsgIjwvc3Bhbj4iIAoJCQkJCSAgKyB0aGlzLngoIGNvbnRlbnQsICcvdGFnX2F0dHJzJyApIAoJCQkJCSAgKyAiPHNwYW4gY2xhc3M9J3RhZ19zdGFydCc+IiArIHRoaXMueCggY2xvc2UgKSArICI8L3NwYW4+IjsKCQkJfQoJCQksIF9zdHlsZTogImNvbG9yOiBuYXZ5OyBmb250LXdlaWdodDogYm9sZDsiCgkJfSAKCQkvLyBtYXRjaGVzIGFuIGVuZGluZyB0YWcKCQkvLyBsaWtlICI8L2Rpdj4iCgkJLCB0YWdfZW5kOiB7IAoJCQkgIF9tYXRjaDogLzxcL1x3K1xzKj58XC8+LyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogbmF2eTsiCgkJfQoJCSwgZW50aXR5OiB7IAoJCQkgIF9tYXRjaDogLyZcdys/Oy8gCgkJCSwgX3N0eWxlOiAiY29sb3I6IGJsdWU7IgoJCX0KCX0KCSwgdGFnX2F0dHJzOiB7CgkJLy8gbWF0Y2hlcyBhIG5hbWUvdmFsdWUgcGFpcgoJCWF0dHI6IHsKCQkJLy8gYmVmb3JlIGluICQxLCBuYW1lIGluICQyLCBiZXR3ZWVuIGluICQzLCB2YWx1ZSBpbiAkNAoJCQkgIF9tYXRjaDogLyhcVyo/KShbXHctXSspKFxzKj1ccyopKCg/OlwnW15cJ10qKD86XFwuW15cJ10qKSpcJyl8KD86XCJbXlwiXSooPzpcXC5bXlwiXSopKlwiKSkvIAoJCQksIF9yZXBsYWNlOiAiJDE8c3BhbiBjbGFzcz0nYXR0cl9uYW1lJz4kMjwvc3Bhbj4kMzxzcGFuIGNsYXNzPSdhdHRyX3ZhbHVlJz4kNDwvc3Bhbj4iCgkJCSwgX3N0eWxlOiB7IGF0dHJfbmFtZTogICJjb2xvcjogZ3JlZW47IiwgYXR0cl92YWx1ZTogImNvbG9yOiBtYXJvb247IiB9CgkJfQoJfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5qYXZhc2NyaXB0ID0KewogICAgICBfbmFtZTogJ2pzJwogICAgLCBfY2FzZTogdHJ1ZQogICAgLCBfbWFpbjogewogICAgICAgICAgbWxfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogZ3JheTsnCiAgICAgICAgfQogICAgICAgICwgc2xfY29tbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1wvLiovCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IGdyZWVuOycKICAgICAgICB9CiAgICAgICAgLCBzdHJpbmc6IHsgCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XCdbXlwnXFxcbl0qKD86XFwuW15cJ1xcXG5dKikqXCcpfCg/OlwiW15cIlxcXG5dKig/OlxcLlteXCJcXFxuXSopKlwiKS8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogdGVhbDsnCiAgICAgICAgfQogICAgICAgICwgbnVtOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSg/OltlRV1bKy1dP1xkKyk/XGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsnCiAgICAgICAgfQogICAgICAgICwgcmVnX25vdDogeyAvL3RoaXMgcHJldmVudHMgImEgLyBiIC8gYyIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdfZXhwCiAgICAgICAgICAgICAgX21hdGNoOiAvKD86XHcrXHMqKVwvW15cL1xcXG5dKig/OlxcLlteXC9cXFxuXSopKlwvW2dpbV0qKD86XHMqXHcrKS8KICAgICAgICAgICAgLCBfcmVwbGFjZTogZnVuY3Rpb24oIGFsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngoIGFsbCwgJy8vbnVtJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICwgcmVnX2V4cDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cL1teXC9cXFxuXSooPzpcXC5bXlwvXFxcbl0qKSpcL1tnaW1dKi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbWFyb29uOycKICAgICAgICB9CiAgICAgICAgLCBicmFjZTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9bXHtcfV0vCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIHN0YXRlbWVudDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih3aXRofHdoaWxlfHZhcnx0cnl8dGhyb3d8c3dpdGNofHJldHVybnxpZnxmb3J8ZmluYWxseXxlbHNlfGRvfGRlZmF1bHR8Y29udGludWV8Y29uc3R8Y2F0Y2h8Y2FzZXxicmVhaylcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogbmF2eTsgZm9udC13ZWlnaHQ6IGJvbGQ7JwogICAgICAgIH0KICAgICAgICAsIGVycm9yOiB7IAogICAgICAgICAgICAgIF9tYXRjaDogL1xiKFVSSUVycm9yfFR5cGVFcnJvcnxTeW50YXhFcnJvcnxSZWZlcmVuY2VFcnJvcnxSYW5nZUVycm9yfEV2YWxFcnJvcnxFcnJvcilcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogQ29yYWw7JwogICAgICAgIH0KICAgICAgICAsIG9iamVjdDogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihTdHJpbmd8UmVnRXhwfE9iamVjdHxOdW1iZXJ8TWF0aHxGdW5jdGlvbnxEYXRlfEJvb2xlYW58QXJyYXkpXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAnY29sb3I6IERlZXBQaW5rOycKICAgICAgICB9CiAgICAgICAgLCBwcm9wZXJ0eTogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih1bmRlZmluZWR8YXJndW1lbnRzfE5hTnxJbmZpbml0eSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUHVycGxlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgJ2Z1bmN0aW9uJzogeyAKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihwYXJzZUludHxwYXJzZUZsb2F0fGlzTmFOfGlzRmluaXRlfGV2YWx8ZW5jb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZGVjb2RlVVJJKVxiLwogICAgICAgICAgICAsIF9zdHlsZTogJ2NvbG9yOiBvbGl2ZTsnCiAgICAgICAgfQogICAgICAgICwgb3BlcmF0b3I6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYih2b2lkfHR5cGVvZnx0aGlzfG5ld3xpbnN0YW5jZW9mfGlufGZ1bmN0aW9ufGRlbGV0ZSlcYi8KICAgICAgICAgICAgLCBfc3R5bGU6ICdjb2xvcjogUm95YWxCbHVlOyBmb250LXdlaWdodDogYm9sZDsnCiAgICAgICAgfQogICAgICAgICwgbGl2ZWNvbm5lY3Q6IHsKICAgICAgICAgICAgICBfbWF0Y2g6IC9cYihzdW58bmV0c2NhcGV8amF2YXxQYWNrYWdlc3xKYXZhUGFja2FnZXxKYXZhT2JqZWN0fEphdmFDbGFzc3xKYXZhQXJyYXl8SlNPYmplY3R8SlNFeGNlcHRpb24pXGIvCiAgICAgICAgICAgICwgX3N0eWxlOiAndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnCiAgICAgICAgfQogICAgfQp9OwoKCgpqUXVlcnkuY2hpbGkucmVjaXBlcy5jc3MgPSAKewoJICBfbmFtZTogJ2NzcycKCSwgX2Nhc2U6IHRydWUKCSwgX21haW46IHsKCQkgIGNvbW1lbnQ6IHsgCgkJCSAgX21hdGNoOiAvXC9cKlteKl0qXCorKD86W15cL11bXipdKlwqKykqXC8vIAoJCQksIF9zdHlsZTogImNvbG9yOiBvbGl2ZTsiCgkJfQoJCSwgZGlyZWN0aXZlOiB7CgkJCSAgX21hdGNoOiAvQFx3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgdXJsOiB7CgkJCSAgX21hdGNoOiAvXGIodXJsXHMqXCgpKFteKV0rKShcKSkvCgkJCSwgX3JlcGxhY2U6ICI8c3BhbiBjbGFzcz0ndXJsJz4kMTwvc3Bhbj4kMjxzcGFuIGNsYXNzPSd1cmwnPiQzPC9zcGFuPiIKCQkJLCBfc3R5bGU6ICJjb2xvcjogZnVjaHNpYTsiCgkJfQoJCSwgYmxvY2s6ICAgewoJCQkgIF9tYXRjaDogL1x7KFtcd1xXXSo/KVx9LwoJCQksIF9yZXBsYWNlOiBmdW5jdGlvbiggYWxsLCBwYWlycyApIHsKCQkJCXJldHVybiAneycgKyB0aGlzLngoIHBhaXJzLCAnL2RlZmluaXRpb24nICkgKyAnfSc7CgkJCX0KCQl9CgkJLCAnY2xhc3MnOiB7CgkJCSAgX21hdGNoOiAvXC5cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzAwNjY7IGZvbnQtd2VpZ2h0OiBib2xkOyIKCQl9CgkJLCBpZDogICAgICB7CgkJCSAgX21hdGNoOiAvI1x3Ky8KCQkJLCBfc3R5bGU6ICJjb2xvcjogSW5kaWFuUmVkOyBmb250LXdlaWdodDogYm9sZDsiCgkJfQoJCSwgcHNldWRvOiAgewoJCQkgIF9tYXRjaDogLzpcdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICNDQzk5MDA7IgoJCX0KCQksIGVsZW1lbnQ6IHsKCQkJICBfbWF0Y2g6IC9cdysvCgkJCSwgX3N0eWxlOiAiY29sb3I6IFB1cnBsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IgoJCX0KCX0KCSwgZGVmaW5pdGlvbjogewoJCSAgY29tbWVudDogeyAKCQkJICBfbWF0Y2g6IC9cL1wqW14qXSpcKisoPzpbXlwvXVteKl0qXCorKSpcLy8KCQl9CgkJLCBwcm9wZXJ0eTogewoJCQkgIF9tYXRjaDogL1xiKD86em9vbXx6LWluZGV4fHdyaXRpbmctbW9kZXx3b3JkLXdyYXB8d29yZC1zcGFjaW5nfHdvcmQtYnJlYWt8d2lkdGh8d2lkb3dzfHdoaXRlLXNwYWNlfHZvbHVtZXx2b2ljZS1mYW1pbHl8dmlzaWJpbGl0eXx2ZXJ0aWNhbC1hbGlnbnx1bmljb2RlLWJpZGl8dG9wfHRleHQtdW5kZXJsaW5lLXBvc2l0aW9ufHRleHQtdHJhbnNmb3JtfHRleHQtc2hhZG93fHRleHQtb3ZlcmZsb3d8dGV4dC1rYXNoaWRhLXNwYWNlfHRleHQtanVzdGlmeXx0ZXh0LWluZGVudHx0ZXh0LWRlY29yYXRpb258dGV4dC1hdXRvc3BhY2V8dGV4dC1hbGlnbi1sYXN0fHRleHQtYWxpZ258dGFibGUtbGF5b3V0fHN0cmVzc3xzcGVlY2gtcmF0ZXxzcGVhay1wdW5jdHVhdGlvbnxzcGVhay1udW1lcmFsfHNwZWFrLWhlYWRlcnxzcGVha3xzaXplfHNjcm9sbGJhci10cmFjay1jb2xvcnxzY3JvbGxiYXItc2hhZG93LWNvbG9yfHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3J8c2Nyb2xsYmFyLWZhY2UtY29sb3J8c2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yfHNjcm9sbGJhci1iYXNlLWNvbG9yfHNjcm9sbGJhci1hcnJvdy1jb2xvcnxzY3JvbGxiYXItM2QtbGlnaHQtY29sb3J8cnVieS1wb3NpdGlvbnxydWJ5LW92ZXJoYW5nfHJ1YnktYWxpZ258cmlnaHR8cmljaG5lc3N8cXVvdGVzfHBvc2l0aW9ufHBsYXktZHVyaW5nfHBpdGNoLXJhbmdlfHBpdGNofHBhdXNlLWJlZm9yZXxwYXVzZS1hZnRlcnxwYXVzZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWFmdGVyfHBhZ2V8cGFkZGluZy10b3B8cGFkZGluZy1yaWdodHxwYWRkaW5nLWxlZnR8cGFkZGluZy1ib3R0b218cGFkZGluZ3xvdmVyZmxvdy1ZfG92ZXJmbG93LVh8b3ZlcmZsb3d8b3V0bGluZS13aWR0aHxvdXRsaW5lLXN0eWxlfG91dGxpbmUtY29sb3J8b3V0bGluZXxvcnBoYW5zfG1pbi13aWR0aHxtaW4taGVpZ2h0fG1heC13aWR0aHxtYXgtaGVpZ2h0fG1hcmtzfG1hcmtlci1vZmZzZXR8bWFyZ2luLXRvcHxtYXJnaW4tcmlnaHR8bWFyZ2luLWxlZnR8bWFyZ2luLWJvdHRvbXxtYXJnaW58bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlfGxpbmUtaGVpZ2h0fGxpbmUtYnJlYWt8bGV0dGVyLXNwYWNpbmd8bGVmdHxsYXlvdXQtZ3JpZC10eXBlfGxheW91dC1ncmlkLW1vZGV8bGF5b3V0LWdyaWQtbGluZXxsYXlvdXQtZ3JpZC1jaGFyLXNwYWNpbmd8bGF5b3V0LWdyaWQtY2hhcnxsYXlvdXQtZ3JpZHxsYXlvdXQtZmxvd3xsYXllci1iYWNrZ3JvdW5kLWltYWdlfGxheWVyLWJhY2tncm91bmQtY29sb3J8aW5jbHVkZS1zb3VyY2V8aW1lLW1vZGV8aGVpZ2h0fGZvbnQtd2VpZ2h0fGZvbnQtdmFyaWFudHxmb250LXN0eWxlfGZvbnQtc3RyZXRjaHxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LWZhbWlseXxmb250fGZsb2F0fGZpbHRlcnxlbXB0eS1jZWxsc3xlbGV2YXRpb258ZGlzcGxheXxkaXJlY3Rpb258Y3Vyc29yfGN1ZS1iZWZvcmV8Y3VlLWFmdGVyfGN1ZXxjb3VudGVyLXJlc2V0fGNvdW50ZXItaW5jcmVtZW50fGNvbnRlbnR8Y29sb3J8Y2xpcHxjbGVhcnxjYXB0aW9uLXNpZGV8Ym90dG9tfGJvcmRlci13aWR0aHxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wfGJvcmRlci1zdHlsZXxib3JkZXItc3BhY2luZ3xib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHR8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnR8Ym9yZGVyLWNvbG9yfGJvcmRlci1jb2xsYXBzZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tfGJvcmRlcnxiZWhhdmlvcnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kLXBvc2l0aW9uLXl8YmFja2dyb3VuZC1wb3NpdGlvbi14fGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kfGF6aW11dGh8YWNjZWxlcmF0b3IpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsiCgkJfQoJCSwgc3BlY2lhbDogewoJCQkgIF9tYXRjaDogL1xiKD86LXVzZS1saW5rLXNvdXJjZXwtc2V0LWxpbmstc291cmNlfC1yZXBsYWNlfC1tb3otdXNlci1zZWxlY3R8LW1vei11c2VyLW1vZGlmeXwtbW96LXVzZXItaW5wdXR8LW1vei11c2VyLWZvY3VzfC1tb3otb3V0bGluZS13aWR0aHwtbW96LW91dGxpbmUtc3R5bGV8LW1vei1vdXRsaW5lLWNvbG9yfC1tb3otb3V0bGluZXwtbW96LW9wYWNpdHl8LW1vei1ib3JkZXItdG9wLWNvbG9yc3wtbW96LWJvcmRlci1yaWdodC1jb2xvcnN8LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0fC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0fC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodHwtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdHwtbW96LWJvcmRlci1yYWRpdXN8LW1vei1ib3JkZXItbGVmdC1jb2xvcnN8LW1vei1ib3JkZXItYm90dG9tLWNvbG9yc3wtbW96LWJpbmRpbmcpXHMqOi8KCQkJLCBfc3R5bGU6ICJjb2xvcjogIzMzMDA2NjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IgoJCX0KCQksIHVybDogewoJCQkgIF9tYXRjaDogL1xiKHVybFxzKlwoKShbXildKykoXCkpLwoJCQksIF9yZXBsYWNlOiAiPHNwYW4gY2xhc3M9J3VybCc+JDE8L3NwYW4+JDI8c3BhbiBjbGFzcz0ndXJsJz4kMzwvc3Bhbj4iCgkJfQoJCSwgdmFsdWU6IHsKCQkJICBfbWF0Y2g6IC9cYig/Onh4LXNtYWxsfHh4LWxhcmdlfHgtc29mdHx4LXNtYWxsfHgtc2xvd3x4LWxvd3x4LWxvdWR8eC1sYXJnZXx4LWhpZ2h8eC1mYXN0fHdpZGVyfHdhaXR8dy1yZXNpemV8dmlzaWJsZXx1cmx8dXBwZXJjYXNlfHVwcGVyLXJvbWFufHVwcGVyLWxhdGlufHVwcGVyLWFscGhhfHVuZGVybGluZXx1bHRyYS1leHBhbmRlZHx1bHRyYS1jb25kZW5zZWR8dHZ8dHR5fHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHQtdG9wfHRleHQtYm90dG9tfHRhYmxlLXJvdy1ncm91cHx0YWJsZS1yb3d8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1jb2x1bW4tZ3JvdXB8dGFibGUtY29sdW1ufHRhYmxlLWNlbGx8dGFibGUtY2FwdGlvbnxzdy1yZXNpemV8c3VwZXJ8c3VifHN0YXR1cy1iYXJ8c3RhdGljfHNxdWFyZXxzcGVsbC1vdXR8c3BlZWNofHNvbGlkfHNvZnR8c21hbGxlcnxzbWFsbC1jYXB0aW9ufHNtYWxsLWNhcHN8c21hbGx8c2xvd2VyfHNsb3d8c2lsZW50fHNob3d8c2VwYXJhdGV8c2VtaS1leHBhbmRlZHxzZW1pLWNvbmRlbnNlZHxzZS1yZXNpemV8c2Nyb2xsfHNjcmVlbnxzLXJlc2l6ZXxydW4taW58cnRsfHJpZ2h0d2FyZHN8cmlnaHQtc2lkZXxyaWdodHxyaWRnZXxyZ2J8cmVwZWF0LXl8cmVwZWF0LXh8cmVwZWF0fHJlbGF0aXZlfHByb2plY3Rpb258cHJpbnR8cHJlfHBvcnRyYWl0fHBvaW50ZXJ8b3ZlcmxpbmV8b3V0c2lkZXxvdXRzZXR8b3Blbi1xdW90ZXxvbmNlfG9ibGlxdWV8bnctcmVzaXplfG5vd3JhcHxub3JtYWx8bm9uZXxuby1yZXBlYXR8bm8tb3Blbi1xdW90ZXxuby1jbG9zZS1xdW90ZXxuZS1yZXNpemV8bmFycm93ZXJ8bi1yZXNpemV8bW92ZXxtaXh8bWlkZGxlfG1lc3NhZ2UtYm94fG1lZGl1bXxtYXJrZXJ8bHRyfGxvd2VyY2FzZXxsb3dlci1yb21hbnxsb3dlci1sYXRpbnxsb3dlci1ncmVla3xsb3dlci1hbHBoYXxsb3dlcnxsb3d8bG91ZHxsb2NhbHxsaXN0LWl0ZW18bGluZS10aHJvdWdofGxpZ2h0ZXJ8bGV2ZWx8bGVmdHdhcmRzfGxlZnQtc2lkZXxsZWZ0fGxhcmdlcnxsYXJnZXxsYW5kc2NhcGV8anVzdGlmeXxpdGFsaWN8aW52ZXJ0fGluc2lkZXxpbnNldHxpbmxpbmUtdGFibGV8aW5saW5lfGljb258aGlnaGVyfGhpZ2h8aGlkZXxoaWRkZW58aGVscHxoZWJyZXd8aGFuZGhlbGR8Z3Jvb3ZlfGZvcm1hdHxmaXhlZHxmYXN0ZXJ8ZmFzdHxmYXItcmlnaHR8ZmFyLWxlZnR8ZmFudGFzeXxleHRyYS1leHBhbmRlZHxleHRyYS1jb25kZW5zZWR8ZXhwYW5kZWR8ZW1ib3NzZWR8ZW1iZWR8ZS1yZXNpemV8ZG91YmxlfGRvdHRlZHxkaXNjfGRpZ2l0c3xkZWZhdWx0fGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGFzaGVkfGN1cnNpdmV8Y3Jvc3NoYWlyfGNyb3NzfGNyb3B8Y291bnRlcnN8Y291bnRlcnxjb250aW51b3VzfGNvbmRlbnNlZHxjb21wYWN0fGNvbGxhcHNlfGNvZGV8Y2xvc2UtcXVvdGV8Y2lyY2xlfGNlbnRlci1yaWdodHxjZW50ZXItbGVmdHxjZW50ZXJ8Y2FwdGlvbnxjYXBpdGFsaXplfGJyYWlsbGV8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8Ymxpbmt8YmlkaS1vdmVycmlkZXxiZWxvd3xiZWhpbmR8YmFzZWxpbmV8YXZvaWR8YXV0b3xhdXJhbHxhdHRyfGFybWVuaWFufGFsd2F5c3xhbGx8YWJzb2x1dGV8YWJvdmUpXGIvCgkJCSwgX3N0eWxlOiAiY29sb3I6ICMzMzY2RkY7IgoJCX0KCQksIHN0cmluZzogeyAKCQkJICBfbWF0Y2g6IC8oPzpcJ1teXCdcXFxuXSooPzpcXC5bXlwnXFxcbl0qKSpcJyl8KD86XCJbXlwiXFxcbl0qKD86XFwuW15cIlxcXG5dKikqXCIpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogdGVhbDsiCgkJfQoJCSwgbnVtYmVyOiB7IAoJCQkgIF9tYXRjaDogLyg/OlxiWystXT8oPzpcZCpcLj9cZCt8XGQrXC4/XGQqKSkoPzolfCg/Oig/OnB4fHB0fGVtfClcYikpLyAKCQkJLCBfc3R5bGU6ICJjb2xvcjogcmVkOyIKCQl9CgkJLCBjb2xvciA6IHsgCgkJCSAgX21hdGNoOiAvKD86XCNbYS1mQS1GMC05XXszLDZ9KXxcYig/OnllbGxvd3x3aGl0ZXx0ZWFsfHNpbHZlcnxyZWR8cHVycGxlfG9saXZlfG5hdnl8bWFyb29ufGxpbWV8Z3JlZW58Z3JheXxmdWNoc2lhfGJsdWV8YmxhY2t8YXF1YXxZZWxsb3dHcmVlbnxZZWxsb3d8V2hpdGVTbW9rZXxXaGl0ZXxXaGVhdHxWaW9sZXR8VHVycXVvaXNlfFRvbWF0b3xUaGlzdGxlfFRlYWx8VGFufFN0ZWVsQmx1ZXxTcHJpbmdHcmVlbnxTbm93fFNsYXRlR3JleXxTbGF0ZUdyYXl8U2xhdGVCbHVlfFNreUJsdWV8U2lsdmVyfFNpZW5uYXxTZWFTaGVsbHxTZWFHcmVlbnxTYW5keUJyb3dufFNhbG1vbnxTYWRkbGVCcm93bnxSb3lhbEJsdWV8Um9zeUJyb3dufFJlZHxQdXJwbGV8UG93ZGVyQmx1ZXxQbHVtfFBpbmt8UGVydXxQZWFjaFB1ZmZ8UGFwYXlhV2hpcHxQYWxlVmlvbGV0UmVkfFBhbGVUdXJxdW9pc2V8UGFsZUdyZWVufFBhbGVHb2xkZW5Sb2R8T3JjaGlkfE9yYW5nZVJlZHxPcmFuZ2V8T2xpdmVEcmFifE9saXZlfE9sZExhY2V8TmF2eXxOYXZham9XaGl0ZXxNb2NjYXNpbnxNaXN0eVJvc2V8TWludENyZWFtfE1pZG5pZ2h0Qmx1ZXxNZWRpdW1WaW9sZXRSZWR8TWVkaXVtVHVycXVvaXNlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1QdXJwbGV8TWVkaXVtT3JjaGlkfE1lZGl1bUJsdWV8TWVkaXVtQXF1YU1hcmluZXxNYXJvb258TWFnZW50YXxMaW5lbnxMaW1lR3JlZW58TGltZXxMaWdodFllbGxvd3xMaWdodFN0ZWVsQmx1ZXxMaWdodFNsYXRlR3JleXxMaWdodFNsYXRlR3JheXxMaWdodFNreUJsdWV8TGlnaHRTZWFHcmVlbnxMaWdodFNhbG1vbnxMaWdodFBpbmt8TGlnaHRHcmV5fExpZ2h0R3JlZW58TGlnaHRHcmF5fExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0Q3lhbnxMaWdodENvcmFsfExpZ2h0Qmx1ZXxMZW1vbkNoaWZmb258TGF3bkdyZWVufExhdmVuZGVyQmx1c2h8TGF2ZW5kZXJ8S2hha2l8SXZvcnl8SW5kaWdvfEluZGlhblJlZHxIb3RQaW5rfEhvbmV5RGV3fEdyZXl8R3JlZW5ZZWxsb3d8R3JlZW58R3JheXxHb2xkZW5Sb2R8R29sZHxHaG9zdFdoaXRlfEdhaW5zYm9yb3xGdWNoc2lhfEZvcmVzdEdyZWVufEZsb3JhbFdoaXRlfEZpcmVCcmlja3xEb2RnZXJCbHVlfERpbUdyZXl8RGltR3JheXxEZWVwU2t5Qmx1ZXxEZWVwUGlua3xEYXJrb3JhbmdlfERhcmtWaW9sZXR8RGFya1R1cnF1b2lzZXxEYXJrU2xhdGVHcmV5fERhcmtTbGF0ZUdyYXl8RGFya1NsYXRlQmx1ZXxEYXJrU2VhR3JlZW58RGFya1NhbG1vbnxEYXJrUmVkfERhcmtPcmNoaWR8RGFya09saXZlR3JlZW58RGFya01hZ2VudGF8RGFya0toYWtpfERhcmtHcmV5fERhcmtHcmVlbnxEYXJrR3JheXxEYXJrR29sZGVuUm9kfERhcmtDeWFufERhcmtCbHVlfEN5YW58Q3JpbXNvbnxDb3Juc2lsa3xDb3JuZmxvd2VyQmx1ZXxDb3JhbHxDaG9jb2xhdGV8Q2hhcnRyZXVzZXxDYWRldEJsdWV8QnVybHlXb29kfEJyb3dufEJsdWVWaW9sZXR8Qmx1ZXxCbGFuY2hlZEFsbW9uZHxCbGFja3xCaXNxdWV8QmVpZ2V8QXp1cmV8QXF1YW1hcmluZXxBcXVhfEFudGlxdWVXaGl0ZXxBbGljZUJsdWUpXGIvIAoJCQksIF9zdHlsZTogImNvbG9yOiBncmVlbjsiCgkJfQoJfQp9OwoKCg==</File> | |
| 58 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-process.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeQogICAgICAgICk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgb3JpZ2luYWxBZGQgPSAkLmJsdWVpbXAuZmlsZXVwbG9hZC5wcm90b3R5cGUub3B0aW9ucy5hZGQ7CgogICAgLy8gVGhlIEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgcGx1Z2luIGV4dGVuZHMgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyB3aXRoIGZpbGUgcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5OgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzUXVldWU6IFsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVidWcnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBdLAogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEFkZC5jYWxsKHRoaXMsIGUsIGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcHJvY2Vzc0FjdGlvbnM6IHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgY29uc29sZVtvcHRpb25zLnR5cGVdKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzaW5nICInICsgZGF0YS5maWxlc1tkYXRhLmluZGV4XS5uYW1lICsgJyInCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfSwKCiAgICAgICAgX3Byb2Nlc3NGaWxlOiBmdW5jdGlvbiAoZGF0YSwgb3JpZ2luYWxEYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICQuZWFjaChkYXRhLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKGksIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW29yaWdpbmFsRGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXS5jYWxsKAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0LAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi50aGVuKGZ1bmMsIHNldHRpbmdzLmFsd2F5cyAmJiBmdW5jKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluCiAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2RvbmUnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NmYWlsJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2Fsd2F5cycsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBjaGFpbjsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXBsYWNlcyB0aGUgc2V0dGluZ3Mgb2YgZWFjaCBwcm9jZXNzUXVldWUgaXRlbSB0aGF0CiAgICAgICAgLy8gYXJlIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCBhbiAiQCIsIHVzaW5nIHRoZSByZW1haW5pbmcKICAgICAgICAvLyBzdWJzdHJpbmcgYXMga2V5IGZvciB0aGUgb3B0aW9uIG1hcCwKICAgICAgICAvLyBlLmcuICJAYXV0b1VwbG9hZCIgaXMgcmVwbGFjZWQgd2l0aCBvcHRpb25zLmF1dG9VcGxvYWQ6CiAgICAgICAgX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHByb2Nlc3NRdWV1ZSA9IFtdOwogICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5wcm9jZXNzUXVldWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4ID09PSB0cnVlID8gYWN0aW9uIDogdGhpcy5wcmVmaXg7CiAgICAgICAgICAgICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMSkgfHwgKHByZWZpeCA/IHByZWZpeCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpIDoga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzUXVldWUucHVzaChzZXR0aW5ncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NRdWV1ZSA9IHByb2Nlc3NRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IGluIHRoZSBwcm9jZXNzc2luZyBxdWV1ZToKICAgICAgICBwcm9jZXNzaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGNhbGxiYWNrczoKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NRdWV1ZSAmJiBvcHRpb25zLnByb2Nlc3NRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2Nlc3NRdWV1ZShvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvY2Vzc3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdHMgPSBpbmRleCA/ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3Byb2Nlc3NGaWxlKG9wdHMsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG9wdHMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnRoZW4oZnVuYywgZnVuYykKICAgICAgICAgICAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NzdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=</File> | |
| 59 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload-ui.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdyAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAndG1wbCcsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWltYWdlJywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQtYXVkaW8nLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZC12aWRlbycsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLXZhbGlkYXRlJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCd0bXBsJykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgJC5ibHVlaW1wLmZpbGV1cGxvYWQucHJvdG90eXBlLl9zcGVjaWFsT3B0aW9ucy5wdXNoKAogICAgICAgICdmaWxlc0NvbnRhaW5lcicsCiAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICdkb3dubG9hZFRlbXBsYXRlSWQnCiAgICApOwoKICAgIC8vIFRoZSBVSSB2ZXJzaW9uIGV4dGVuZHMgdGhlIGZpbGUgdXBsb2FkIHdpZGdldAogICAgLy8gYW5kIGFkZHMgY29tcGxldGUgdXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB0byB0aGUgd2lkZ2V0IGFyZSB1cGxvYWRlZCBhcyBzb29uCiAgICAgICAgICAgIC8vIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3RhcnQgYnV0dG9ucy4gVG8gZW5hYmxlIGF1dG9tYXRpYwogICAgICAgICAgICAvLyB1cGxvYWRzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZToKICAgICAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgdXBsb2FkIHRlbXBsYXRlOgogICAgICAgICAgICB1cGxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtdXBsb2FkJywKICAgICAgICAgICAgLy8gVGhlIElEIG9mIHRoZSBkb3dubG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgZG93bmxvYWRUZW1wbGF0ZUlkOiAndGVtcGxhdGUtZG93bmxvYWQnLAogICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyIGZvciB0aGUgbGlzdCBvZiBmaWxlcy4gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8KICAgICAgICAgICAgLy8gYW4gZWxlbWVudCB3aXRoIGNsYXNzICJmaWxlcyIgaW5zaWRlIG9mIHRoZSB3aWRnZXQgZWxlbWVudDoKICAgICAgICAgICAgZmlsZXNDb250YWluZXI6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlcyBjb250YWluZXIuCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlLCB0byBwcmVwZW5kIGZpbGVzIGluc3RlYWQ6CiAgICAgICAgICAgIHByZXBlbmRGaWxlczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRoZSBleHBlY3RlZCBkYXRhIHR5cGUgb2YgdGhlIHVwbG9hZCByZXNwb25zZSwgc2V0cyB0aGUgZGF0YVR5cGUKICAgICAgICAgICAgLy8gb3B0aW9uIG9mIHRoZSAkLmFqYXggdXBsb2FkIHJlcXVlc3RzOgogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAoKICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBmaWxlcywKICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgbWF4TnVtYmVyT2ZGaWxlcyB2YWxpZGF0aW9uOgogICAgICAgICAgICBnZXROdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc0NvbnRhaW5lci5jaGlsZHJlbigpCiAgICAgICAgICAgICAgICAgICAgLm5vdCgnLnByb2Nlc3NpbmcnKS5sZW5ndGg7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBDYWxsYmFjayB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2U6CiAgICAgICAgICAgIGdldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmICQuaXNBcnJheShkYXRhLnJlc3VsdC5maWxlcykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuZmlsZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wIG9yIGFkZCBBUEkgY2FsbCkuCiAgICAgICAgICAgIC8vIFNlZSB0aGUgYmFzaWMgZmlsZSB1cGxvYWQgd2lkZ2V0IGZvciBtb3JlIGluZm9ybWF0aW9uOgogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgdGhhdCA9ICR0aGlzLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5vcHRpb25zOwogICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoJ2RhdGEnLCBkYXRhKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlc0NvbnRhaW5lclsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICBdKGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgZGF0YS5wcm9jZXNzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpOwogICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuc2l6ZScpLnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JtYXRGaWxlU2l6ZShkYXRhLmZpbGVzW2luZGV4XS5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVuZGVyUHJldmlld3MoZGF0YSk7CiAgICAgICAgICAgICAgICB9KS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZmluZCgnLnN0YXJ0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGF0Ll90cmlnZ2VyKCdhZGRlZCcsIGUsIGRhdGEpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5maWxlc1tpbmRleF0uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5lcnJvcicpLnRleHQoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQgJiYgZGF0YS5kYXRhVHlwZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFUeXBlLnN1YnN0cigwLCA2KSA9PT0gJ2lmcmFtZScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZnJhbWUgVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3Jlc3MgZXZlbnRzLgogICAgICAgICAgICAgICAgICAgIC8vIEluIGxhY2sgb2YgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIsIHdlIHNldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyB0byAxMDAlLCBzaG93aW5nIHRoZSBmdWxsIGFuaW1hdGVkIGJhcjoKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISQuc3VwcG9ydC50cmFuc2l0aW9uICYmICdwcm9ncmVzcy1hbmltYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsIDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkuZmlyc3QoKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fdHJpZ2dlcignc2VudCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9ICQodGhpcykuZGF0YSgnYmx1ZWltcC1maWxldXBsb2FkJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZXNGcm9tUmVzcG9uc2UgPSBkYXRhLmdldEZpbGVzRnJvbVJlc3BvbnNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5nZXRGaWxlc0Zyb21SZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGdldEZpbGVzRnJvbVJlc3BvbnNlKGRhdGEpLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVzW2luZGV4XSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvcjogJ0VtcHR5IGZpbGUgdXBsb2FkIHJlc3VsdCd9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChmaWxlcylbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wcmVwZW5kRmlsZXMgPyAncHJlcGVuZFRvJyA6ICdhcHBlbmRUbycKICAgICAgICAgICAgICAgICAgICBdKHRoYXQub3B0aW9ucy5maWxlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY29tcGxldGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pMThuKCd1bmtub3duRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpWwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucHJlcGVuZEZpbGVzID8gJ3ByZXBlbmRUbycgOiAnYXBwZW5kVG8nCiAgICAgICAgICAgICAgICAgICAgXSh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IE1hdGguZmxvb3IoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzYWxsOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5mbG9vcihkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDApLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZSA9ICR0aGlzLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUgPSBnbG9iYWxQcm9ncmVzc05vZGUKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvZ3Jlc3NOb2RlLmh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fCAkdGhpcy5kYXRhKCdmaWxldXBsb2FkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3MoZGF0YSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBwcm9ncmVzcykKICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5maXJzdCgpLmNzcygKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgKyAnJScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdibHVlaW1wLWZpbGV1cGxvYWQnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICQud2hlbi5hcHBseSgkLCB0aGF0Ll9nZXRGaW5pc2hlZERlZmVycmVkcygpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcHBlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpLmZpbmQoJy5maWxldXBsb2FkLXByb2dyZXNzJykpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS12YWx1ZW5vdycsICcwJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKCd3aWR0aCcsICcwJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5wcm9ncmVzcy1leHRlbmRlZCcpLmh0bWwoJyZuYnNwOycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmaWxldXBsb2FkLXByb2Nlc3NpbmcnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvY2Vzc3N0b3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2JsdWVpbXAtZmlsZXVwbG9hZCcpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnZmlsZXVwbG9hZCcpLAogICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVR5cGUgPSBkYXRhLmRhdGFUeXBlIHx8IHRoYXQub3B0aW9ucy5kYXRhVHlwZTsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSkuZG9uZShyZW1vdmVOb2RlKS5mYWlsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfcmVzZXRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMgPSBbXTsKICAgICAgICB9LAoKICAgICAgICBfYWRkRmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uIChkZWZlcnJlZCkgewogICAgICAgICAgICBpZiAoIWRlZmVycmVkKSB7CiAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maW5pc2hlZFVwbG9hZHMucHVzaChkZWZlcnJlZCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmluaXNoZWREZWZlcnJlZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkVXBsb2FkczsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRGaWxlU2l6ZTogZnVuY3Rpb24gKGJ5dGVzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBHQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzID49IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZXMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNQic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIEtCJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0Qml0cmF0ZTogZnVuY3Rpb24gKGJpdHMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBiaXRzICE9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWJpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwKS50b0ZpeGVkKDIpICsgJyBrYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiaXRzLnRvRml4ZWQoMikgKyAnIGJpdC9zJzsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0VGltZTogZnVuY3Rpb24gKHNlY29uZHMpIHsKICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCksCiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApOwogICAgICAgICAgICBkYXlzID0gZGF5cyA/IGRheXMgKyAnZCAnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBkYXlzICsKICAgICAgICAgICAgICAgICgnMCcgKyBkYXRlLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKSArICc6JyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9LAoKICAgICAgICBfZm9ybWF0UGVyY2VudGFnZTogZnVuY3Rpb24gKGZsb2F0VmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChmbG9hdFZhbHVlICogMTAwKS50b0ZpeGVkKDIpICsgJyAlJzsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyRXh0ZW5kZWRQcm9ncmVzczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdEJpdHJhdGUoZGF0YS5iaXRyYXRlKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgKGRhdGEudG90YWwgLSBkYXRhLmxvYWRlZCkgKiA4IC8gZGF0YS5iaXRyYXRlCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0UGVyY2VudGFnZSgKICAgICAgICAgICAgICAgICAgICBkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwKICAgICAgICAgICAgICAgICkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLmxvYWRlZCkgKyAnIC8gJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRGaWxlU2l6ZShkYXRhLnRvdGFsKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlld3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEuY29udGV4dC5maW5kKCcucHJldmlldycpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbG0pIHsKICAgICAgICAgICAgICAgICQoZWxtKS5hcHBlbmQoZGF0YS5maWxlc1tpbmRleF0ucHJldmlldyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJVcGxvYWQ6IGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGVtcGxhdGUoCiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXBsb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9yZW5kZXJEb3dubG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlLAogICAgICAgICAgICAgICAgZmlsZXMKICAgICAgICAgICAgKS5maW5kKCdhW2Rvd25sb2FkXScpLmVhY2godGhpcy5fZW5hYmxlRHJhZ1RvRGVza3RvcCkuZW5kKCk7CiAgICAgICAgfSwKCiAgICAgICAgX3N0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgYnV0dG9uID0gJChlLmN1cnJlbnRUYXJnZXQpLAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLXVwbG9hZCcpLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXBsYXRlLmRhdGEoJ2RhdGEnKTsKICAgICAgICAgICAgYnV0dG9uLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2NhbmNlbEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gJChlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJy50ZW1wbGF0ZS11cGxvYWQsLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBkYXRhLmNvbnRleHQgPSBkYXRhLmNvbnRleHQgfHwgdGVtcGxhdGU7CiAgICAgICAgICAgIGlmIChkYXRhLmFib3J0KSB7CiAgICAgICAgICAgICAgICBkYXRhLmFib3J0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmVycm9yVGhyb3duID0gJ2Fib3J0JzsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZWxldGVIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Rlc3Ryb3knLCBlLCAkLmV4dGVuZCh7CiAgICAgICAgICAgICAgICBjb250ZXh0OiBidXR0b24uY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnREVMRVRFJwogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykgJiYgbm9kZS5pcygnOnZpc2libGUnKSkgewogICAgICAgICAgICAgICAgbm9kZS5iaW5kKAogICAgICAgICAgICAgICAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVzcG9uZCB0byBvdGhlciB0cmFuc2l0aW9ucyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lciBlbGVtZW50LCBlLmcuIGZyb20gYnV0dG9uIGVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IG5vZGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudW5iaW5kKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLnRvZ2dsZUNsYXNzKCdpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGZkOwogICAgICAgIH0sCgogICAgICAgIF9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmlsZVVwbG9hZEJ1dHRvbkJhciA9IHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKSwKICAgICAgICAgICAgICAgIGZpbGVzTGlzdCA9IHRoaXMub3B0aW9ucy5maWxlc0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuc3RhcnQnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuc3RhcnQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcuY2FuY2VsJyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLmNhbmNlbCcpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcudG9nZ2xlOmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdCgnLnRlbXBsYXRlLWRvd25sb2FkJykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5kZWxldGUnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnRvZ2dsZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fb24oZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJyksIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnRvZ2dsZScpLnByb3AoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmlzKCc6Y2hlY2tlZCcpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lCdXR0b25CYXJFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZigKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZXVwbG9hZC1idXR0b25iYXInKQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc3RhcnQsIC5jYW5jZWwsIC5kZWxldGUnKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0JzogdGhpcy5fc3RhcnRIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5jYW5jZWwnOiB0aGlzLl9jYW5jZWxIYW5kbGVyLAogICAgICAgICAgICAgICAgJ2NsaWNrIC5kZWxldGUnOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZpbGVzQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRUZW1wbGF0ZXMoKTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgaWYgKCEkLnN1cHBvcnQuZmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHdhc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICBpZiAod2FzRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCwgYnV0dG9uJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlSW5wdXRCdXR0b24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK</File> | |
| 60 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKOyhmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICByZXF1aXJlKCdqcXVlcnknKSwKICAgICAgICAgICAgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpCiAgICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvbgogICAgLy8gaHR0cDovL3ZpbGphbWlzLmNvbS9ibG9nLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvCiAgICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShuZXcgUmVnRXhwKAogICAgICAgIC8vIEhhbmRsZSBkZXZpY2VzIHdoaWNoIGdpdmUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgZmVhdHVyZSBkZXRlY3Rpb246CiAgICAgICAgJyhBbmRyb2lkICgxXFwuWzAxNTZdfDJcXC5bMDFdKSknICsKICAgICAgICAgICAgJ3woV2luZG93cyBQaG9uZSAoT1MgN3w4XFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICsKICAgICAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArCiAgICAgICAgICAgICd8KEtpbmRsZS8oMVxcLjB8MlxcLlswNV18M1xcLjApKScKICAgICkudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwKICAgICAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmb3IgYWxsIG90aGVyIGRldmljZXM6CiAgICAgICAgJCgnPGlucHV0IHR5cGU9ImZpbGUiPicpLnByb3AoJ2Rpc2FibGVkJykpOwoKICAgIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLAogICAgLy8gYXMgc29tZSBTYWZhcmkgdmVyc2lvbnMgKDU/KSBzdXBwb3J0IFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy4KICAgIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvcgogICAgLy8gd2luZG93LlByb2dyZXNzRXZlbnQgaW5zdGVhZCB0byBkZXRlY3QgWEhSMiBmaWxlIHVwbG9hZCBjYXBhYmlsaXR5OgogICAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7CiAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7CgogICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6CiAgICAkLnN1cHBvcnQuYmxvYlNsaWNlID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8CiAgICAgICAgQmxvYi5wcm90b3R5cGUud2Via2l0U2xpY2UgfHwgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpOwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZToKICAgIGZ1bmN0aW9uIGdldERyYWdIYW5kbGVyKHR5cGUpIHsKICAgICAgICB2YXIgaXNEcmFnT3ZlciA9IHR5cGUgPT09ICdkcmFnb3Zlcic7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KHR5cGUsIHtkZWxlZ2F0ZWRFdmVudDogZX0pCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmIChpc0RyYWdPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWQKICAgIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLgogICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIGV4cG9zZXMgdGhlICJhZGQiIGFuZCAic2VuZCIgbWV0aG9kcywgdG8gYWRkIG9yIGRpcmVjdGx5IHNlbmQgZmlsZXMgdXNpbmcKICAgIC8vIHRoZSBmaWxldXBsb2FkIEFQSS4KICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yCiAgICAvLyAiYWRkIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIHRoZSAiYWRkIiBjYWxsYmFjayBvcHRpb24gdG8gcXVldWUgZmlsZSB1cGxvYWRzLgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIGRyYWcgJiBkcm9wIHN1cHBvcnQ6CiAgICAgICAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSwKICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuCiAgICAgICAgICAgIC8vIFNldCB0byBhIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgdG8gZW5hYmxlIGZpbGUgcGFzdGluZzoKICAgICAgICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUKICAgICAgICAgICAgLy8gWEhSIHJlcXVlc3QgdG8ga2VlcCB0aGUgcmVxdWVzdCBzaXplIHVuZGVyIG9yIGVxdWFsIHRvIHRoZSBkZWZpbmVkCiAgICAgICAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gTXVsdGlwYXJ0IGZpbGUgdXBsb2FkcyBhZGQgYSBudW1iZXIgb2YgYnl0ZXMgdG8gZWFjaCB1cGxvYWRlZCBmaWxlLAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWQKICAgICAgICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZDogNTEyLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHMKICAgICAgICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOgogICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLAogICAgICAgICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDoKICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGUKICAgICAgICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtCiAgICAgICAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OgogICAgICAgICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LAogICAgICAgICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6CiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczoKICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLAogICAgICAgICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbgogICAgICAgICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGwKICAgICAgICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS4KICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlbgogICAgICAgICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0CiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSAiYWRkIiBvcgogICAgICAgICAgICAvLyAic2VuZCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLgogICAgICAgICAgICB1cGxvYWRlZEJ5dGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHJlY2FsY3VsYXRpbmcgdGhlIGdsb2JhbCBwcm9ncmVzcyBkYXRhOgogICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NJbnRlcnZhbDogMTAwLAogICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6CiAgICAgICAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1cGxvYWRzIGFyZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhZGRpbmcgZmlsZXM6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCgogICAgICAgICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczoKICAgICAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6CiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1ttZXNzYWdlXSB8fCBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIGZpbGUgdXBsb2FkcyBjYW4gYmUgc2V0CiAgICAgICAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZAogICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhCiAgICAgICAgICAgIC8vIG9iamVjdCAoZm9yIFhIUiBmaWxlIHVwbG9hZHMpLCBvciBhIHNpbXBsZSBvYmplY3QuCiAgICAgICAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjoKICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkCiAgICAgICAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKICAgICAgICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlCiAgICAgICAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzCiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheToKICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKSByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgYW5kIGFsbG93cyB0byBhdHRhY2ggYWRkaXRpb25hbAogICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTsKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdXRvVXBsb2FkIHx8IChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIE90aGVyIGNhbGxiYWNrczoKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6CiAgICAgICAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOgogICAgICAgICAgICAvLyBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGFsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIC8vIHByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RhcnQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgLy8gc3RvcDogZnVuY3Rpb24gKGUpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOgogICAgICAgICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHBhc3RlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOgogICAgICAgICAgICAvLyBkcm9wOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmtzZW5kJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2RvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOgogICAgICAgICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2h1bmthbHdheXMnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogMAogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSByZWluaXRpYWxpemluZyBldmVudCBsaXN0ZW5lcnMgYW5kL29yCiAgICAgICAgLy8gc3BlY2lhbCBpbml0aWFsaXphdGlvbiBjb2RlOgogICAgICAgIF9zcGVjaWFsT3B0aW9uczogWwogICAgICAgICAgICAnZmlsZUlucHV0JywKICAgICAgICAgICAgJ2Ryb3Bab25lJywKICAgICAgICAgICAgJ3Bhc3RlWm9uZScsCiAgICAgICAgICAgICdtdWx0aXBhcnQnLAogICAgICAgICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnCiAgICAgICAgXSwKCiAgICAgICAgX2Jsb2JTbGljZTogJC5zdXBwb3J0LmJsb2JTbGljZSAmJiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlOwogICAgICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LAoKICAgICAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDsKICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gMDsKICAgICAgICAgICAgdGhpcy5nZXRCaXRyYXRlID0gZnVuY3Rpb24gKG5vdywgbG9hZGVkLCBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmCiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHwKICAgICAgICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgIGxvYWRlZDogMCwKICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgYml0cmF0ZTogMAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAob2JqLl9wcm9ncmVzcykgewogICAgICAgICAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZXNwb25zZU9iamVjdDogZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqLl9yZXNwb25zZSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgICAgICAgICAgIHZhciBub3cgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fdGltZSAmJiBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGxvYWRlZCA9IE1hdGguZmxvb3IoCiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgLyBlLnRvdGFsICogKGRhdGEuY2h1bmtTaXplIHx8IGRhdGEuX3Byb2dyZXNzLnRvdGFsKQogICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJldmlvdXNseSBsb2FkZWQgc3RhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKAogICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldAogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGEKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHk6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLAogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzYWxsJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzc2FsbCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikgewogICAgICAgICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrCiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmb3JtRGF0YSwKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOgogICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyA/CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbMF0gOiBvcHRpb25zLnBhcmFtTmFtZTsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCB8fCBvcHRpb25zLmJsb2IgfHwgIXRoaXMuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZpbGUubmFtZSkgKyAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBvcHRpb25zLmJsb2IgfHwgZmlsZTsKICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5wb3N0TWVzc2FnZSBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIEZvcm1EYXRhCiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZvcm1EYXRhIGFycmF5IGFuZCBsZXQgdGhlIHBvc3RNZXNzYWdlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgRm9ybURhdGEgb2JqZWN0IG91dCBvZiB0aGlzIGFycmF5OgogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtTmFtZSwgb3B0aW9ucy5ibG9iLCBmaWxlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgYWxsb3dzIHRoZSB0ZXN0cyB0byBydW4gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0Jsb2InLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeToKICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdElmcmFtZVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAnaWZyYW1lICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YToKICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAvLyBBZGQgcmVkaXJlY3QgdXJsIHRvIGZvcm0gZGF0YSBvbiBjcm9zcy1kb21haW4gdXBsb2FkczoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMucmVkaXJlY3RQYXJhbU5hbWUgfHwgJ3JlZGlyZWN0JywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wb3N0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIHBvc3RtZXNzYWdlIGVuYWJsZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGUgPSAncG9zdG1lc3NhZ2UgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBpZiAoIXBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107CiAgICAgICAgICAgICAgICBmaWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOgogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtID0gJChvcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSwKICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06CiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlICJQT1NUIiBvciAiUFVUIjoKICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gKG9wdGlvbnMudHlwZSB8fAogICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHwgJycKICAgICAgICAgICAgICAgICkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiYKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9nZXRBSkFYU2V0dGluZ3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU2V0dGluZ3Mob3B0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgIH0sCgogICAgICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLAogICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKToKICAgICAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5zdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwZW5kaW5nJzsKICAgICAgICB9LAoKICAgICAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudAogICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OgogICAgICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lOwogICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsOwogICAgICAgICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBlbmhhbmNlZCB3aXRoCiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZToKICAgICAgICBfZ2V0WEhSUHJvbWlzZTogZnVuY3Rpb24gKHJlc29sdmVPclJlamVjdCwgY29udGV4dCwgYXJncykgewogICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMub3B0aW9ucy5jb250ZXh0IHx8IHByb21pc2U7CiAgICAgICAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aChjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6CiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRnVuYyB8fCByZWplY3RGdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5fcHJvY2Vzc1F1ZXVlID0gdGhpcy5fcHJvY2Vzc1F1ZXVlID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKFt0aGlzXSkpLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzdWJtaXQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbCcsIG51bGwsIHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLmpxWEhSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuanFYSFIgJiYgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmIHRoYXQKICAgICAgICAgICAgICAgICAgICAuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKSA9PT0gJ3BlbmRpbmcnOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIC8vIFBhcnNlcyB0aGUgUmFuZ2UgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSB1cGxvYWRlZCBieXRlczoKICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLAogICAgICAgICAgICAgICAgcGFydHMgPSByYW5nZSAmJiByYW5nZS5zcGxpdCgnLScpLAogICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYKICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTsKICAgICAgICB9LAoKICAgICAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0cwogICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy4KICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlCiAgICAgICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnkKICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6CiAgICAgICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkgewogICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICBmcyA9IGZpbGUuc2l6ZSwKICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSwKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICB1cGxvYWQ7CiAgICAgICAgICAgIGlmICghKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpICYmIHNsaWNlICYmICh1YiB8fCBtY3MgPCBmcykpIHx8CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRlc3RPbmx5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodWIgPj0gZnMpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB2YXIgbyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGVkID0gby5fcHJvZ3Jlc3MubG9hZGVkOwogICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbCgKICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgIHViLAogICAgICAgICAgICAgICAgICAgIHViICsgbWNzLAogICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXJlZmVyZW5jZWQgYWZ0ZXIgZGF0YSBwcm9jZXNzaW5nOgogICAgICAgICAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTsKICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6CiAgICAgICAgICAgICAgICBvLmNvbnRlbnRSYW5nZSA9ICdieXRlcyAnICsgdWIgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplIC0gMSkgKyAnLycgKyBmczsKICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7CiAgICAgICAgICAgICAgICBqcVhIUiA9ICgodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KSkKICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB1YiA9IHRoYXQuX2dldFVwbG9hZGVkQnl0ZXMoanFYSFIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IHViIC0gby51cGxvYWRlZEJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gby51cGxvYWRlZEJ5dGVzID0gdWI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duXQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzCiAgICAgICAgICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsCiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTsKICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmQKICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZToKICAgICAgICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7CiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLl9hY3RpdmUgKz0gMTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczoKICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkOwogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsLAogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudAogICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsCiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHRvdGFsCiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZG9uZScsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yVGhyb3duID0gb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMgYW5kIGpxWEhSb3JFcnJvciBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrcwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEuc3VibWl0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICBhYm9ydGVkLAogICAgICAgICAgICAgICAgc2xvdCwKICAgICAgICAgICAgICAgIHBpcGUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLAogICAgICAgICAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICBqcVhIUiA9IGpxWEhSIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdzZW5kJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFJvclJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCBxdWV1ZWQgdXBsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbm90IGJlZW4gYWJvcnRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHwKICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkgewogICAgICAgICAgICAgICAgICAgIHNsb3QgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2xvdHMucHVzaChzbG90KTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC50aGVuKHNlbmQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnRoZW4oc2VuZCwgc2VuZCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsCiAgICAgICAgICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpbWl0ID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZHMsCiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSwKICAgICAgICAgICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCwKICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDAsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSwKICAgICAgICAgICAgICAgIGZpbGVTZXQsCiAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgIGlmICghZmlsZXNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtmaWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXRTaXplKSAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UgPSBwYXJhbU5hbWUuc2xpY2UoaSwgaSArIGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBmaWxlc0xlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkKSA+IGxpbWl0U2l6ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShqLCBpICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQoe30sIGRhdGEpOwogICAgICAgICAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdOwogICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFJlc3BvbnNlT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpOwogICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdhZGQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICBuZXdEYXRhCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LAogICAgICAgICAgICAgICAgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpLAogICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIG5ldyBjbG9uZWQgZmlsZSBpbnB1dCB0byB0aGUgZGF0YSBhcmd1bWVudDoKICAgICAgICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTsKICAgICAgICAgICAgLy8gRGV0YWNoaW5nIGFsbG93cyB0byBpbnNlcnQgdGhlIGZpbGVJbnB1dCBvbiBhbm90aGVyIGZvcm0KICAgICAgICAgICAgLy8gd2l0aG91dCBsb29zaW5nIHRoZSBmaWxlIGlucHV0IHZhbHVlOgogICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCwKICAgICAgICAgICAgLy8gcmVzdG9yZSBmb2N1cyB0byB0aGUgaW5wdXRDbG9uZS4KICAgICAgICAgICAgaWYgKHJlc3RvcmVGb2N1cykgewogICAgICAgICAgICAgICAgaW5wdXRDbG9uZS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyLCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnOwogICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkuZmlsZShmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbiBlbXB5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zCiAgICAgICAgICAgICAgICAvLyBvdGhlciB0aGFuIGZpbGVzIG9yIGRpcmVjdG9yaWVzOgogICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyeShlbnRyeSwgcGF0aCk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZGF0YVRyYW5zZmVyLml0ZW1zOwogICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoICYmIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoCiAgICAgICAgICAgICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2Via2l0R2V0QXNFbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgKICAgICAgICAgICAgICAgICQubWFrZUFycmF5KGRhdGFUcmFuc2Zlci5maWxlcykKICAgICAgICAgICAgKS5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7CiAgICAgICAgICAgIGZpbGVJbnB1dCA9ICQoZmlsZUlucHV0KTsKICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnd2Via2l0RW50cmllcycpIHx8CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSwKICAgICAgICAgICAgICAgIGZpbGVzLAogICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpOwogICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlSW5wdXQucHJvcCgndmFsdWUnKTsKICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdAogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDoKICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXC8sICcnKX1dOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkgewogICAgICAgICAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOgogICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUgPSBmaWxlLmZpbGVOYW1lOwogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA9IGZpbGUuZmlsZVNpemU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseSgKICAgICAgICAgICAgICAgICQsCiAgICAgICAgICAgICAgICAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKQogICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSwKICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5yZXBsYWNlRmlsZUlucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcmVwbGFjZUZpbGVJbnB1dChkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnY2hhbmdlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmCiAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsCiAgICAgICAgICAgICAgICBkYXRhID0ge2ZpbGVzOiBbXX07CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMucHVzaChmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAncGFzdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwYXN0ZScsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgICAgICAgICAgZGF0YSA9IHt9OwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ryb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSwKCiAgICAgICAgX29uRHJhZ0VudGVyOiBnZXREcmFnSGFuZGxlcignZHJhZ2VudGVyJyksCgogICAgICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCwKICAgICAgICAgICAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6CiAgICAgICAgICAgICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlciwKICAgICAgICAgICAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczoKICAgICAgICAgICAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsIHsKICAgICAgICAgICAgICAgICAgICBwYXN0ZTogdGhpcy5fb25QYXN0ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX29uQ2hhbmdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlaW5pdCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZUlucHV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPSJmaWxlIl0nKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPSJmaWxlIl0nKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5kcm9wWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnBhc3RlWm9uZSA9ICQob3B0aW9ucy5wYXN0ZVpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAndXJsJyAmJiAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL15cLy4qXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZWxlbWVudC5kYXRhKCk7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5lYWNoKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50WzBdLmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICgvXmRhdGEtLy50ZXN0KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOgogICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9zbG90cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwOwogICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5CiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczoKICAgICAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy4KICAgICAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllcwogICAgICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOgogICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzczsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgYWRkaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOgogICAgICAgIC8vIC5maWxldXBsb2FkKCdhZGQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIGFkZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fb25BZGQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlcwogICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoCiAgICAgICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pOwogICAgICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC4KICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cygKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==</File> | |
| 61 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js" Permission="644" Encode="Base64">LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlLCB3aW5kb3csIGRvY3VtZW50ICovCgo7KGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6CiAgICB2YXIgY291bnRlciA9IDA7CgogICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBmb3VyIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsCiAgICAvLyAgYnkgZGVmYXVsdCBzZXQgdG8gImphdmFzY3JpcHQ6ZmFsc2U7IgogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jKSB7CiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgIC8vIHByZXZlbnRzIHdhcm5pbmcgcG9wdXBzIG9uIEhUVFBTIGluIElFNjoKICAgICAgICAgICAgLypqc2hpbnQgc2NyaXB0dXJsOiB0cnVlICovCiAgICAgICAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsCiAgICAgICAgICAgIC8qanNoaW50IHNjcmlwdHVybDogZmFsc2UgKi8KICAgICAgICAgICAgICAgIGZvcm0sCiAgICAgICAgICAgICAgICBpZnJhbWUsCiAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXI7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9mb3JtPicpOwogICAgICAgICAgICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTsKICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nOwogICAgICAgICAgICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZgogICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOgogICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKAogICAgICAgICAgICAgICAgICAgICAgICAnPGlmcmFtZSBzcmM9IicgKyBpbml0aWFsSWZyYW1lU3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICciIG5hbWU9ImlmcmFtZS10cmFuc3BvcnQtJyArIGNvdW50ZXIgKyAnIj48L2lmcmFtZT4nCiAgICAgICAgICAgICAgICAgICAgKS5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA6IFtvcHRpb25zLnBhcmFtTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBjcm9zcy1kb21haW4gaWZyYW1lIGNvbnRlbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBjYWxsYmFjayByZXR1cm5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz0iJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnIj48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyB0aGUgZm9ybSBpbiBhIHNldFRpbWVvdXQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2FjdGlvbicsIG9wdGlvbnMudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iLz4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZmllbGQudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCAmJiBvcHRpb25zLmZpbGVJbnB1dC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZUlucHV0Q2xvbmVzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9wdGlvbnMuZmlsZUlucHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3R5cGUgbXVzdCBiZSBzZXQgYXMgZW5jb2RpbmcgZm9yIElFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmNvZGluZycsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCduYW1lJywgY2xvbmUucHJvcCgnbmFtZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZm9ybScsIGNsb25lLmF0dHIoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS4KICAgIC8vIFRoZSBmb2xsb3dpbmcgYWRkcyBjb252ZXJ0ZXJzIGZyb20gaWZyYW1lIHRvIHRleHQsIGpzb24sIGh0bWwsIHhtbAogICAgLy8gYW5kIHNjcmlwdC4KICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW4KICAgIC8vIG9yIHRleHQvaHRtbCwgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBpbmNsdWRlIGFwcGxpY2F0aW9uL2pzb24gaW4gdGhlCiAgICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy4KICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5cwogICAgLy8gYXBwbGljYXRpb24veG1sIG9yIHRleHQveG1sLCBzbyBJRSBwcm9wZXJseSBwYXJzZXMgdGhlIFhNTCByZXNwb25zZS4KICAgIC8vIFNlZSBhbHNvCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb24KICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkudGV4dCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQucGFyc2VKU09OKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYyAmJiAkLmlzWE1MRG9jKHhtbERvYykgPyB4bWxEb2MgOgogICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoeG1sRG9jLmJvZHkpLmh0bWwoKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=</File> | |
| 62 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js" Permission="644" Encode="Base64">LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK</File> | |
| 63 | + <File Location="var/httpd/htdocs/js/thirdparty/jqueryjsonview/jquery.jsonview.js" Permission="644" Encode="Base64">Ci8qIQpqUXVlcnkgSlNPTlZpZXcuCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCihmdW5jdGlvbihqUXVlcnkpIHsKICB2YXIgJCwgQ29sbGFwc2VyLCBKU09ORm9ybWF0dGVyLCBKU09OVmlldzsKICBKU09ORm9ybWF0dGVyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gSlNPTkZvcm1hdHRlcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5odG1sRW5jb2RlID0gZnVuY3Rpb24oaHRtbCkgewogICAgICBpZiAoaHRtbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCkucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc1N0cmluZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgcyA9IEpTT04uc3RyaW5naWZ5KHMpLnNsaWNlKDEsIC0xKTsKICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuY29kZShzKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUuZGVjb3JhdGVXaXRoU3BhbiA9IGZ1bmN0aW9uKHZhbHVlLCBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cIiIgKyBjbGFzc05hbWUgKyAiXCI+IiArICh0aGlzLmh0bWxFbmNvZGUodmFsdWUpKSArICI8L3NwYW4+IjsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUudmFsdWVUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSwgbGV2ZWwpIHsKICAgICAgdmFyIHZhbHVlVHlwZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgdmFsdWVUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXHMoLispXS8pWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiB0aGlzWyIiICsgdmFsdWVUeXBlICsgIlRvSFRNTCJdLmNhbGwodGhpcywgdmFsdWUsIGxldmVsKTsKICAgIH07CgogICAgSlNPTkZvcm1hdHRlci5wcm90b3R5cGUubnVsbFRvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlV2l0aFNwYW4oJ251bGwnLCAnbnVsbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5udW1iZXJUb0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnbnVtJyk7CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLnN0cmluZ1RvSFRNTCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtdWx0aWxpbmVDbGFzcywgbmV3TGluZVBhdHRlcm47CiAgICAgIGlmICgvXihodHRwfGh0dHBzfGZpbGUpOlwvXC9bXlxzXSskL2kudGVzdCh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gIjxhIGhyZWY9XCIiICsgKHRoaXMuaHRtbEVuY29kZSh2YWx1ZSkpICsgIlwiPjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPiIgKyAodGhpcy5qc1N0cmluZyh2YWx1ZSkpICsgIjxzcGFuIGNsYXNzPVwicVwiPlwiPC9zcGFuPjwvYT4iOwogICAgICB9IGVsc2UgewogICAgICAgIG11bHRpbGluZUNsYXNzID0gJyc7CiAgICAgICAgdmFsdWUgPSB0aGlzLmpzU3RyaW5nKHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5sMmJyKSB7CiAgICAgICAgICBuZXdMaW5lUGF0dGVybiA9IC8oW14+XFxyXFxuXT8pKFxcclxcbnxcXG5cXHJ8XFxyfFxcbikvZzsKICAgICAgICAgIGlmIChuZXdMaW5lUGF0dGVybi50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICBtdWx0aWxpbmVDbGFzcyA9ICcgbXVsdGlsaW5lJzsKICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyAnJykucmVwbGFjZShuZXdMaW5lUGF0dGVybiwgJyQxJyArICc8YnIgLz4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz1cInN0cmluZyIgKyBtdWx0aWxpbmVDbGFzcyArICJcIj5cIiIgKyB2YWx1ZSArICJcIjwvc3Bhbj4iOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLmJvb2xlYW5Ub0hUTUwgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZVdpdGhTcGFuKHZhbHVlLCAnYm9vbCcpOwogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5hcnJheVRvSFRNTCA9IGZ1bmN0aW9uKGFycmF5LCBsZXZlbCkgewogICAgICB2YXIgY29sbGFwc2libGUsIGhhc0NvbnRlbnRzLCBpbmRleCwgbnVtUHJvcHMsIG91dHB1dCwgdmFsdWUsIF9pLCBfbGVuOwogICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgfQogICAgICBoYXNDb250ZW50cyA9IGZhbHNlOwogICAgICBvdXRwdXQgPSAnJzsKICAgICAgbnVtUHJvcHMgPSBhcnJheS5sZW5ndGg7CiAgICAgIGZvciAoaW5kZXggPSBfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgaW5kZXggPSArK19pKSB7CiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaGFzQ29udGVudHMgPSB0cnVlOwogICAgICAgIG91dHB1dCArPSAnPGxpPicgKyB0aGlzLnZhbHVlVG9IVE1MKHZhbHVlLCBsZXZlbCArIDEpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJbPHVsIGNsYXNzPVwiYXJyYXkgbGV2ZWwiICsgbGV2ZWwgKyBjb2xsYXBzaWJsZSArICJcIj4iICsgb3V0cHV0ICsgIjwvdWw+XSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICdbIF0nOwogICAgICB9CiAgICB9OwoKICAgIEpTT05Gb3JtYXR0ZXIucHJvdG90eXBlLm9iamVjdFRvSFRNTCA9IGZ1bmN0aW9uKG9iamVjdCwgbGV2ZWwpIHsKICAgICAgdmFyIGNvbGxhcHNpYmxlLCBoYXNDb250ZW50cywga2V5LCBudW1Qcm9wcywgb3V0cHV0LCBwcm9wLCB2YWx1ZTsKICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgIH0KICAgICAgaGFzQ29udGVudHMgPSBmYWxzZTsKICAgICAgb3V0cHV0ID0gJyc7CiAgICAgIG51bVByb3BzID0gMDsKICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIG51bVByb3BzKys7CiAgICAgIH0KICAgICAgZm9yIChwcm9wIGluIG9iamVjdCkgewogICAgICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwogICAgICAgIGhhc0NvbnRlbnRzID0gdHJ1ZTsKICAgICAgICBrZXkgPSB0aGlzLm9wdGlvbnMuZXNjYXBlID8gdGhpcy5qc1N0cmluZyhwcm9wKSA6IHByb3A7CiAgICAgICAgb3V0cHV0ICs9ICI8bGk+PHNwYW4gY2xhc3M9XCJwcm9wXCI+PHNwYW4gY2xhc3M9XCJxXCI+XCI8L3NwYW4+IiArIGtleSArICI8c3BhbiBjbGFzcz1cInFcIj5cIjwvc3Bhbj48L3NwYW4+OiAiICsgKHRoaXMudmFsdWVUb0hUTUwodmFsdWUsIGxldmVsICsgMSkpOwogICAgICAgIGlmIChudW1Qcm9wcyA+IDEpIHsKICAgICAgICAgIG91dHB1dCArPSAnLCc7CiAgICAgICAgfQogICAgICAgIG91dHB1dCArPSAnPC9saT4nOwogICAgICAgIG51bVByb3BzLS07CiAgICAgIH0KICAgICAgaWYgKGhhc0NvbnRlbnRzKSB7CiAgICAgICAgY29sbGFwc2libGUgPSBsZXZlbCA9PT0gMCA/ICcnIDogJyBjb2xsYXBzaWJsZSc7CiAgICAgICAgcmV0dXJuICJ7PHVsIGNsYXNzPVwib2JqIGxldmVsIiArIGxldmVsICsgY29sbGFwc2libGUgKyAiXCI+IiArIG91dHB1dCArICI8L3VsPn0iOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAneyB9JzsKICAgICAgfQogICAgfTsKCiAgICBKU09ORm9ybWF0dGVyLnByb3RvdHlwZS5qc29uVG9IVE1MID0gZnVuY3Rpb24oanNvbikgewogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9XCJqc29udmlld1wiPiIgKyAodGhpcy52YWx1ZVRvSFRNTChqc29uKSkgKyAiPC9kaXY+IjsKICAgIH07CgogICAgcmV0dXJuIEpTT05Gb3JtYXR0ZXI7CgogIH0pKCk7CiAgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAhPT0gbnVsbCkgJiYgKG1vZHVsZS5leHBvcnRzID0gSlNPTkZvcm1hdHRlcik7CiAgQ29sbGFwc2VyID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQ29sbGFwc2VyKCkge30KCiAgICBDb2xsYXBzZXIuYmluZEV2ZW50ID0gZnVuY3Rpb24oaXRlbSwgb3B0aW9ucykgewogICAgICB2YXIgY29sbGFwc2VyOwogICAgICBjb2xsYXBzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgY29sbGFwc2VyLmNsYXNzTmFtZSA9ICdjb2xsYXBzZXInOwogICAgICBjb2xsYXBzZXIuaW5uZXJIVE1MID0gb3B0aW9ucy5jb2xsYXBzZWQgPyAnKycgOiAnLSc7CiAgICAgIGNvbGxhcHNlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZShldmVudC50YXJnZXQsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpKTsKICAgICAgaXRlbS5pbnNlcnRCZWZvcmUoY29sbGFwc2VyLCBpdGVtLmZpcnN0Q2hpbGQpOwogICAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZShjb2xsYXBzZXIpOwogICAgICB9CiAgICB9OwoKICAgIENvbGxhcHNlci5leHBhbmQgPSBmdW5jdGlvbihjb2xsYXBzZXIpIHsKICAgICAgdmFyIGVsbGlwc2lzLCB0YXJnZXQ7CiAgICAgIHRhcmdldCA9IHRoaXMuY29sbGFwc2VUYXJnZXQoY29sbGFwc2VyKTsKICAgICAgaWYgKHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbGxpcHNpcyA9IHRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2VsbGlwc2lzJylbMF07CiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsbGlwc2lzKTsKICAgICAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgcmV0dXJuIGNvbGxhcHNlci5pbm5lckhUTUwgPSAnLSc7CiAgICB9OwoKICAgIENvbGxhcHNlci5jb2xsYXBzZSA9IGZ1bmN0aW9uKGNvbGxhcHNlcikgewogICAgICB2YXIgZWxsaXBzaXMsIHRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGhpcy5jb2xsYXBzZVRhcmdldChjb2xsYXBzZXIpOwogICAgICBpZiAodGFyZ2V0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGVsbGlwc2lzLmNsYXNzTmFtZSA9ICdlbGxpcHNpcyc7CiAgICAgIGVsbGlwc2lzLmlubmVySFRNTCA9ICcgJmhlbGxpcDsgJzsKICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsbGlwc2lzLCB0YXJnZXQpOwogICAgICByZXR1cm4gY29sbGFwc2VyLmlubmVySFRNTCA9ICcrJzsKICAgIH07CgogICAgQ29sbGFwc2VyLnRvZ2dsZSA9IGZ1bmN0aW9uKGNvbGxhcHNlciwgb3B0aW9ucykgewogICAgICB2YXIgYWN0aW9uLCBjb2xsYXBzZXJzLCB0YXJnZXQsIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQogICAgICB0YXJnZXQgPSB0aGlzLmNvbGxhcHNlVGFyZ2V0KGNvbGxhcHNlcik7CiAgICAgIGFjdGlvbiA9IHRhcmdldC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnZXhwYW5kJyA6ICdjb2xsYXBzZSc7CiAgICAgIGlmIChvcHRpb25zLnJlY3Vyc2l2ZV9jb2xsYXBzZXIpIHsKICAgICAgICBjb2xsYXBzZXJzID0gY29sbGFwc2VyLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sbGFwc2VyJyk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGNvbGxhcHNlcnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIGNvbGxhcHNlciA9IGNvbGxhcHNlcnNbX2ldOwogICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzW2FjdGlvbl0oY29sbGFwc2VyKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKGNvbGxhcHNlcik7CiAgICAgIH0KICAgIH07CgogICAgQ29sbGFwc2VyLmNvbGxhcHNlVGFyZ2V0ID0gZnVuY3Rpb24oY29sbGFwc2VyKSB7CiAgICAgIHZhciB0YXJnZXQsIHRhcmdldHM7CiAgICAgIHRhcmdldHMgPSBjb2xsYXBzZXIucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQgPSB0YXJnZXRzWzBdOwogICAgfTsKCiAgICByZXR1cm4gQ29sbGFwc2VyOwoKICB9KSgpOwogICQgPSBqUXVlcnk7CiAgSlNPTlZpZXcgPSB7CiAgICBjb2xsYXBzZTogZnVuY3Rpb24oZWwpIHsKICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gJy0nKSB7CiAgICAgICAgcmV0dXJuIENvbGxhcHNlci5jb2xsYXBzZShlbCk7CiAgICAgIH0KICAgIH0sCiAgICBleHBhbmQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmIChlbC5pbm5lckhUTUwgPT09ICcrJykgewogICAgICAgIHJldHVybiBDb2xsYXBzZXIuZXhwYW5kKGVsKTsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZTogZnVuY3Rpb24oZWwpIHsKICAgICAgcmV0dXJuIENvbGxhcHNlci50b2dnbGUoZWwpOwogICAgfQogIH07CiAgcmV0dXJuICQuZm4uSlNPTlZpZXcgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzLCBkZWZhdWx0T3B0aW9ucywgZm9ybWF0dGVyLCBqc29uLCBtZXRob2QsIG9wdGlvbnMsIG91dHB1dERvYzsKICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICBpZiAoSlNPTlZpZXdbYXJnc1swXV0gIT0gbnVsbCkgewogICAgICBtZXRob2QgPSBhcmdzWzBdOwogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAkdGhpcywgbGV2ZWw7CiAgICAgICAgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgIGlmIChhcmdzWzFdICE9IG51bGwpIHsKICAgICAgICAgIGxldmVsID0gYXJnc1sxXTsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCIuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmxldmVsIiArIGxldmVsKS5zaWJsaW5ncygnLmNvbGxhcHNlcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBKU09OVmlld1ttZXRob2RdKHRoaXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAkdGhpcy5maW5kKCcuanNvbnZpZXcgPiB1bCA+IGxpIC5jb2xsYXBzaWJsZScpLnNpYmxpbmdzKCcuY29sbGFwc2VyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEpTT05WaWV3W21ldGhvZF0odGhpcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAganNvbiA9IGFyZ3NbMF07CiAgICAgIG9wdGlvbnMgPSBhcmdzWzFdIHx8IHt9OwogICAgICBkZWZhdWx0T3B0aW9ucyA9IHsKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLAogICAgICAgIG5sMmJyOiBmYWxzZSwKICAgICAgICByZWN1cnNpdmVfY29sbGFwc2VyOiBmYWxzZSwKICAgICAgICBlc2NhcGU6IHRydWUKICAgICAgfTsKICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTsKICAgICAgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIoewogICAgICAgIG5sMmJyOiBvcHRpb25zLm5sMmJyLAogICAgICAgIGVzY2FwZTogb3B0aW9ucy5lc2NhcGUKICAgICAgfSk7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoanNvbikgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgIH0KICAgICAgb3V0cHV0RG9jID0gZm9ybWF0dGVyLmpzb25Ub0hUTUwoanNvbik7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyICR0aGlzLCBpdGVtLCBpdGVtcywgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgICAgICR0aGlzID0gJCh0aGlzKTsKICAgICAgICAkdGhpcy5odG1sKG91dHB1dERvYyk7CiAgICAgICAgaXRlbXMgPSAkdGhpc1swXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xsYXBzaWJsZScpOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBpdGVtcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgaXRlbSA9IGl0ZW1zW19pXTsKICAgICAgICAgIGlmIChpdGVtLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChDb2xsYXBzZXIuYmluZEV2ZW50KGl0ZW0ucGFyZW50Tm9kZSwgb3B0aW9ucykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3Jlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pOwogICAgfQogIH07Cn0pKGpRdWVyeSk7Cg==</File> | |
| 64 | + <File Location="var/httpd/htdocs/js/NewTicketWizard.js" Permission="644" Encode="Base64">LyoqCiAqIFZhcmlhYmxlcwogKi8KdmFyIGZvcm1BbHBhY2E7CnZhciBhY3RpdmVRdWV1ZTsKCgovKioKICogQnVpbGQgdGhlIGZvcm0gb3B0aW9ucyAobGF5b3V0KQogKiBAcGFyYW0gZmllbGRzCiAqIEBwYXJhbSBzZW5kVGV4dAogKiBAcmV0dXJucyB7X19fYW5vbnltb3VzNThfNDIxfQogKi8KZnVuY3Rpb24gYnVpbGRPcHRpb25zKGZpZWxkcywgc2VuZFRleHQsIGFjdGlvbikgewoJcmV0dXJuIHsgICAgCQogICAgCSJyZW5kZXJGb3JtIjogdHJ1ZSwKICAgICAgICAiZmllbGRzIjogZmllbGRzLCAgICAgICAgCiAgICAgICAgImZvcm0iOiB7CiAgICAgICAgCSJhdHRyaWJ1dGVzIiA6IHsKICAgICAgICAJCSJhY3Rpb24iIDogYWN0aW9uLAogICAgICAgIAkJIm1ldGhvZCIgOiAicG9zdCIsCiAgICAgICAgCQkiZW5jdHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIgogICAgICAgIAl9LAogICAgICAgIAkiYnV0dG9ucyI6IHsKICAgICAgICAJCSJzdWJtaXQiOiB7CiAgICAgICAgCQkJInZhbHVlIiA6IHNlbmRUZXh0CiAgICAgICAgCQl9CiAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAidG9nZ2xlU3VibWl0VmFsaWRTdGF0ZSI6IGZhbHNlCiAgICAgICAgCSAKICAgICAgICB9CiAgICB9Owp9CgovKioKICogQnVpbGQgdGhlIGZvcm0gc2NoZW1hCiAqIAogKiBAcGFyYW0gc2NoZW1hCiAqIEByZXR1cm5zIHtfX19hbm9ueW1vdXM1MTBfNTcxfQogKi8KZnVuY3Rpb24gYnVpbGRTY2hlbWEoc2NoZW1hKSB7CglyZXR1cm4gewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgInByb3BlcnRpZXMiOiBzY2hlbWEKICAgIH07Cn0KCnZhciBwb3N0UmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtKSB7Cglmb3JtT3B0aW9ucyA9IGZvcm0ub3B0aW9ucy5maWVsZHM7Cglmb3JtQWxwYWNhID0gZm9ybTsKCQoJaWYgKGZvcm0pIHsKCQkkKCcuc2VsZWN0cGlja2VyJykuc2VsZWN0cGlja2VyKCk7CgkJJCgiW25hbWU9J3NlcnZpY2UnXSIpLnZhbCgkKCIjU2VydmljZUlEIikudmFsKCkpOwoJCSQoIltuYW1lPSdGb3JtSUQnXSIpLnZhbChmb3JtLmRhdGEuRm9ybUlEKTsKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJCQllZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0JCQkKCQl9LCAyMDAwKTsKCX0KCQoJY2FycmVnYUN1c3RvbVByb3BzKGFjdGl2ZVF1ZXVlKTsKfTsKCgp2YXIgcG9zdFJlbmRlckNhbGxiYWNrUHVibGljID0gZnVuY3Rpb24oZm9ybSkgewoJZm9ybU9wdGlvbnMgPSBmb3JtLm9wdGlvbnMuZmllbGRzOwoJZm9ybUFscGFjYSA9IGZvcm07CgkKCWlmIChmb3JtKSB7CgkJJCgnLnNlbGVjdHBpY2tlcicpLnNlbGVjdHBpY2tlcigpOwoJCSQoIltuYW1lPSdzZXJ2aWNlJ10iKS52YWwoJCgiI1NlcnZpY2VJRCIpLnZhbCgpKTsKCQkkKCJbbmFtZT0nRm9ybUlEJ10iKS52YWwoZm9ybS5kYXRhLkZvcm1JRCk7CQkKICAgIAkkKCJbbmFtZT0nc3VibWl0J10iKS5jc3MoImZvbnQtc2l6ZSIsICIxOHB4Iik7CiAgICAJCQkKCQlmb3JtLmZvcm0ucmVnaXN0ZXJTdWJtaXRIYW5kbGVyKGZ1bmN0aW9uKGUsIGZvcm0pIHsKICAgICAgICAJLy8gdmFsaWRhdGUgdGhlIGVudGlyZSBmb3JtICh0b3AgY29udHJvbCArIGFsbCBjaGlsZHJlbikKICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh0cnVlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHZhbGlkYXRpb24gc3RhdGUgKHRvcCBjb250cm9sICsgYWxsIGNoaWxkcmVuKQogICAgICAgICAgICBmb3JtLnJlbmRlclZhbGlkYXRpb25TdGF0ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRpc3BsYXkgc29tZXRoaW5nCiAgICAgICAgICAgIGlmIChmb3JtLmlzRm9ybVZhbGlkKCkpIHsKICAgICAgICAgICAgCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJYWxlcnQoIkRhZG9zIGludsOhbGlkb3MhIik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCX0pOwoJCQoJCS8vIEZpeCBDS0VkaXRvcgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcih2YXIgaSBpbiBDS0VESVRPUi5pbnN0YW5jZXMpIHsKCQkJCXZhciBlZGl0b3IgPSBDS0VESVRPUi5pbnN0YW5jZXNbaV07CgkJICAgICAgICBlZGl0b3IuY29uZmlnLmZpbGVicm93c2VyVXBsb2FkVXJsID0gIi9vdHJzL3B1YmxpYy5wbD9BY3Rpb249UGljdHVyZVVwbG9hZCZGb3JtSUQ9IiArIGZvcm0uZGF0YS5Gb3JtSUQ7CgkJCX0KCQkKCQl9LCAyMDAwKTsJCQoJfQoJCgljYXJyZWdhQ3VzdG9tUHJvcHNQdWJsaWMoYWN0aXZlUXVldWUpOwp9OwoKZnVuY3Rpb24gY2FycmVnYUN1c3RvbVByb3BzUHVibGljKHF1ZXVlKSB7CglpZiAoISBxdWV1ZSkgewoJCXF1ZXVlID0gIiI7Cgl9CgkKCXZhciB1cmwgPSAiL290cnMvcHVibGljLnBsP0FjdGlvbj1OZXdUaWNrZXRXaXphcmRQdWJsaWM7U3ViYWN0aW9uPUdldEZvcm1DdXN0b21Qcm9wcyIgKyBxdWV1ZTsKCQoJdXJsICs9ICI7U2VydmljZUlEPSIgKyAkKCIjU2VydmljZUlEIikudmFsKCk7CgkKCSQuZ2V0U2NyaXB0KHVybCwgZnVuY3Rpb24oZGF0YSkgewkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgYWxlcnQodGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNhcnJlZ2FDdXN0b21Qcm9wcyhxdWV1ZSkgewoJaWYgKCEgcXVldWUpIHsKCQlxdWV1ZSA9ICIiOwoJfQkKCXZhciB1cmwgPSAiL290cnMvY3VzdG9tZXIucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZDtTdWJhY3Rpb249R2V0Rm9ybUN1c3RvbVByb3BzIiArIHF1ZXVlOwoJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCQoJJC5nZXRTY3JpcHQodXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICBhbGVydCh0ZXh0U3RhdHVzKTsKICB9KTsKfQogICAgCmZ1bmN0aW9uIGNhcnJlZ2FGb3JtKGRhdGFGb3JtLCBzZW5kVGV4dCwgYWN0aW9uLCBxdWV1ZSwgZm9ybUlEKSB7CQoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRGb3JtSlNPTiIgKyBxdWV1ZTsKCQoJaWYgKCEodHlwZW9mIGZvcm1BbHBhY2EgPT09ICd1bmRlZmluZWQnKSkgewoJCWZvcm1BbHBhY2EuZGVzdHJveSgpOwoJfSAKCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuYWxwYWNhKHsKICAgICAgIAkJImRhdGEiOiBkYXRhRm9ybSwKICAgICAgICAJInNjaGVtYSI6IGJ1aWxkU2NoZW1hKGRhdGFbMF0pLAogICAgICAgIAkib3B0aW9ucyI6IGJ1aWxkT3B0aW9ucyhkYXRhWzFdLCBzZW5kVGV4dCwgYWN0aW9uKSwJCQkKICAgICAgICAJInBvc3RSZW5kZXIiOiBwb3N0UmVuZGVyQ2FsbGJhY2ssCgkJCSJ2aWV3IjogImJvb3RzdHJhcC1jcmVhdGUiLAoJCQkidWkiOiAiYm9vdHN0cmFwLXVpIgogICAgCX0pOyAKICAgIAkKICAgIH0pLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAJYWxlcnQoIkVycm8gYW8gcmVjdXBlcmFyOiAiICsgdXJsICsgIiA9PiAiICsgdGV4dFN0YXR1cyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbG9hZFNlcnZpY2VzKHNlbmQsIGNnaWhhbmRsZSkgewoJdmFyIHVybCA9ICIvb3Rycy9jdXN0b21lci5wbD9BY3Rpb249TmV3VGlja2V0V2l6YXJkO1N1YmFjdGlvbj1HZXRTZXJ2aWNlcztRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpOwoJCgkkLmdldCh1cmwsIGZ1bmN0aW9uKGRhdGEpIHsJCQoJCSQoIiNzZXJ2aWNlRElWIikuaHRtbChkYXRhKTsKCQkKCQkkKCIjU2VydmljZUlEIikuY2hhbmdlKGZ1bmN0aW9uKCkgewoJICAgCQljYXJyZWdhRm9ybShudWxsLCBzZW5kLGNnaWhhbmRsZSwgIjtRdWV1ZUlEPSIgKyAkKCIjUXVldWVJRCIpLnZhbCgpKTsKCSAgCX0pOwoJCQoJCSQoIiNmb3JtVGlja2V0IikuaHRtbCgiIik7CgkJJCgiI3NlcnZpY2VEZXNjcmlwdGlvbiIpLmhpZGUoKTsKCgkJCiAgICB9KS5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgCWFsZXJ0KHRleHRTdGF0dXMpOwogIH0pOwp9CgpmdW5jdGlvbiBjYXJyZWdhRm9ybVB1YmxpYyhkYXRhRm9ybSwgc2VuZFRleHQsIGFjdGlvbiwgcXVldWUsIGZvcm1JRCkgewoJdmFyIHVybCA9ICIvb3Rycy9wdWJsaWMucGw/QWN0aW9uPU5ld1RpY2tldFdpemFyZFB1YmxpYztTdWJhY3Rpb249R2V0Rm9ybUpTT04iICsgcXVldWU7CgkKCWlmICghKHR5cGVvZiBmb3JtQWxwYWNhID09PSAndW5kZWZpbmVkJykpIHsKCQlmb3JtQWxwYWNhLmRlc3Ryb3koKTsKCX0KCQoJYWN0aXZlUXVldWUgPSBxdWV1ZTsJCgl1cmwgKz0gIjtTZXJ2aWNlSUQ9IiArICQoIiNTZXJ2aWNlSUQiKS52YWwoKTsKCXVybCArPSAiO0Zvcm1JRD0iICsgZm9ybUlEOwoJCgkkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7CQkKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuaHRtbChkYXRhWzJdKTsKCQkkKCIjc2VydmljZURlc2NyaXB0aW9uIikuc2hvdygpOwoJCQoJCXZhciBmb3JtID0gJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoewogICAgICAgCQkiZGF0YSI6IGRhdGFGb3JtLAogICAgICAgIAkic2NoZW1hIjogYnVpbGRTY2hlbWEoZGF0YVswXSksCiAgICAgICAgCSJvcHRpb25zIjogYnVpbGRPcHRpb25zKGRhdGFbMV0sIHNlbmRUZXh0LCBhY3Rpb24pLAkJCQogICAgICAgIAkicG9zdFJlbmRlciI6IHBvc3RSZW5kZXJDYWxsYmFja1B1YmxpYywKCQkJInZpZXciOiAiYm9vdHN0cmFwLWNyZWF0ZSIsCgkJCSJ1aSI6ICJib290c3RyYXAtdWkiCiAgICAJfSk7IAoJCQoJCQogICAgCQogICAgfSkuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgIAlhbGVydCgiRXJybyBhbyByZWN1cGVyYXI6ICIgKyB1cmwgKyAiID0+ICIgKyB0ZXh0U3RhdHVzKTsKICB9KTsKfQoKZnVuY3Rpb24gZGVzdHJ1aXJGb3JtKCkgewoJJCgiI2Zvcm1UaWNrZXQiKS5hbHBhY2EoKS5kZXN0cm95KCk7Cn0KCg==</File> | |
| 65 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/alpaca-icons.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAACWCAYAAADJ0zgXAAAJN0lEQVR4nO3ba0xUZwLG8Sbb/dpuNzbSYEya7Sabdrtt3G2TVhs3di2psdbFVTBFakVtFhVBLLWt2kq9oKPiKrQpKjCAF8pNhssAFUS5OiAochkGyp2BgYEB5iIzZ8757weVlt2soIduaj1P8mRy5rzJLzPnnHeSN+885uPjQ29v7/+9jymwAj/acFJOAdHqczQYWie9n5B7kcizmTML123zQVr8HCx8ljPa7wiNOE6P98vwt9/hXvwc/PVZkrQXCVJ9BYueRVr8HHXbpv4wU8Kjr8xF0MRDegxJBZdYFrKbxoRoxMw4XJlxkHGSpO+KWRryOVw4hTsrntFX5sqH+zw9sAT50vvEbDJ/9SRZv/4Npt960P3UbLqemo3xKQ8yH38SzeNP0vfE7bF9nh7y4YOnEhCBtqFROkdsdI856Bxz0D5ip23ETseona5RO50jNtqGxxCBg6cS5MOqyCgkoMtoxGgyYR4ZoVxXzeCwhUHLCOaREQaGhzGaBug29iEBqsgo+XCE6iiiJGHs62fQPMzq1at54fnnGXcKrPH3x9/fn9W+vpSVV9DXb0KUJCJUR+XD+yNUSJLEwOAgwxYLbe3trF37AQDz578OgCCKjI6NYR4aAmB/xGH5cPj+CACGhy2MjIzicgn4r1kDwLp161i50oe1a9diHhrCbrPjsDsI33dAPvx5+D4ARsfGGLNaEdxu/Pz8+HF8fX2puVZDr7GP9Asaks6elw/v+jwcAIfDjsNux+124+vrS3OzgcDAQEJCQli8+C1iTsVx8nQ8RcWXydHmy4c/2bkbAJfLhdPpRBCEiU9qMBioq6ujsKgYi8WC2TzEzcZG0i9o5MNhn+yagERRRJIkJEma9FXHnI7D2NfHtZpa+vpNnEtOkQ9//MlO7pWS0nKKLl3mxs162traAUg8c04+fPjoMUI//pTg0DC2/qh3jyP/FUVC0lniE5KIVScSp04kIemsfLisrAytVntfzc+fgZvrp6oCK/AvEFaiRImShy+P3lytwAr8aMHH8m6wQV1JQFw566bZgLhyNqgr2a+pfXB4g7oSERgHbk2z44AIbFBXPjgcEF+OTYKIS1102yU0nW40HW6yOidX0+FG0+mm2y4RcakLmwQB8eUy4LhyRt2Q0ykQrjVgEaDQKFJoFCm607vHFgHCtQZyOgVG3RAQJxM2C3C5XySj2cqBghZcQIVJpPxOK0wiLuBAQQsZzVYu94uYhRmAB1wSZSaRigGR2Kp+9ubqAai1iNRaRAD25uqJreqnYkCkzCQy4JLkw/0uCd2gSJVZRAJOlHQSUdA8sSIQUdDMiZJOJKDKLKIbFOmfEdgpcd0iYhchPKcJvU0iIr+ZVV8Vs+qrYiLym9HbJMJzmrCLcN0i0u+cAdgkSFgE2JvbxNelHeitEs1WCYPtdputEnqrxNelHezNbcIigEmYAXhIArWum7IeO+0OiVabRIt1clttEu0OibIeO2pdN0OSzJtro7oSOzAEDEowKMKACKb/6IB4+9ygdHusWYKNciaQ4LOVbLwzZd7tvabKu92oriT4rAw4Pz//vld8prvy8/P8dVJgBVbghwNWokSJkocvj95crcAK/OjBx85XsXJ3wX312PkqefCRxAqWh2WRVz98X10elsWRxIoHh70Ck8msGSTgdBMBp5vwOVjOOzu0LNmmwSswGa/AZJZs0/DODi0+B8snxmXWDOIVmPzg8BtrYnlXVT3RJduzyasfxvtT7cQY70+15NUPs2R79qSxb6yJfXD4syPZzFsexfwdV1i0PQ+vrRlsOdPK8rCsSd1yphWvrRks2p7H/B1XmLc8is+OZMu7ucL2pfPyshN8sP8iWbVmPoxvJqvWPKl33/Pbk89LS48Tti99Zh6niFNX+PhkFe9/08Du9O+p67IiSiBKUNdlZXf697z/TQNhMTqOxJfOzOPU1d3DovVnCFXXE5qkxylM3ucD4BQkQpP0hCXU84/Qqff5TAsuLL3Jyo8yWH38OtEFHf9zz090QQerj1/n3eBvKa/Wy4cPfnORDQcu8taXlfifqMU27v4v1Dbuxv9ELW99WcmHERdRxRTKh5dtjCMgspKFO0tZuLOUgOhaKg3D2G65sd1yU2kYJiC69ofzRyvwDlTLh//0diSvrf+Wl/3PTauvBSTzmvcMbI984c1DvLQ+Y9r984Z0/vJOpHz4Dwv388cPc6fdef/MYd7bKvlw6J5v+f2CL6fdlxYfZLdq6i3PP9/fYwVW4IcPVqJEiZKHL4/eXK3ACvyzgDfHl+AZnMqszSnM2pTCrM0peAansjm+5KeB00obmLUphVWn61FdsRNTKxBzXSCmVkB1xc6q0/XM2pRCWmnDzMFppQ3MCbnATq0Zzc0eTL3FYM5G9cVGJHM2/T3FZNZ185nWzJyQC9PGp4Sf3pxCWLaJCkMzWAtxW4q4ZS7CMViEbaAQu6kAtzmfkqYmPsoy8fTmGViK2KIuYWlULcnXusB+hXe9/Ug7/zWusQps5hLGBi4zZrqMbeASkqWQ81VdLI2qZYt66mt+T3hOSCpB6UYGTVVgu0p1ZSreq9Zy7Wo6bts1HJarWM0V2MwVOC1lDPTrCEo3MickVR48OyiV7RozuK4hWGsQHTeo0WXy9xVrqLmaidtxA8dINbbhKpyj1eCsZrvGzOygGYA3pZuIjd6D21GH01YHbj311/NYtnw1lWUZOG113Bq7gdtRR2z0Hjalm+TDHkGprD/XDegRHY247I0gtOD19gpqqnPBZcBlb8RpbUB0NAJ61p/rxkMuPCc4jRUn9ZhHWkAwIIwbcDtbQGwHdxvCeAtORzOuW80gGDCPtLDipJ45wWny4PciNby6rxRVvgHoAKEN0dmG6GpHdLbjHm/D7WwDoQ3oQJVv4NV9pbwXKfPvgzqdDo+gVN48WkNqdSvQC/TceTVOOk6tbuXNozV4BKWi0+nkTyCHE7PxDM5gwSEdX2TrGbIZgSE0KaeAIYZsRr7I1rPgkA7P4AwOJ957uXjasF6v53BiNs9sTePFXYW8fkDHgkM1E339gI4XdxXyzNY0Didmo9dPvY45LfgurtVq8YvUMDckDc/gHzo3JA2/SA1arXba6LThH1/zvLy8STvV8vLypnVNZcEzWQVW4F8e/G+TYB4OXjygtgAAAABJRU5ErkJggg==</File> | |
| 66 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/date.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOA9V6653AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAsJJREFUSMftlstrVEkUh796XG8EG6LtKyoxaQ0KTlAHBvEPmI2LCC6MARcDMYIQNUgEURFG1GVQmMUwTDY+CLgY3LhLEDFB1AnaMg6SaKIJ0WhsH0n6cR9V5aIDIi5Ursy46LMs6tR3zq/OOVWiubnZdXV18V+b5H+yCrgC/j7A1+79y5XeG7zNFz9a78s+5PL1wa8C689tyHW188ODq4gwRBzuZeT5FNuP/syKmXGMUKgoQHb2MToxwYpfmnDK558N20gf+i0ZePXAFcyxP9FxgFOa4Rc5ppsOUVNdhUWgbARaM/LsJbT/jlUeq0/tYTYpuDDpsL1XKfT8RWoW2iSkU/DMgZs7IDUDe4HJS1DVsoPSpEsu9fnjF+hs3c2bEzNsUhIpJSUE1jocYAVsxuGco2gtSxem+KPxIruTFpeceYcAdDCLF+SZb0MmHj5ggQ1IuZAFLqTKBHhBAa+UR8z5JM7YxCHOObSQeMpj/7593M9mGbybpa2tFQFEYUj7gYNkMhmcc5g4TA62xpQz1gqlBKfPnOHkryfx52lGHj+iv3+A2FoK+TxRFCGFwBqbvI9jaxBCoJVGCsmqlauwJgZg3br17Ny5i7bWVqIoYr5fRbFQJDbRt5DaAKC0QgiBkALrylXb3d0NQEtLC2NPnrKspoZbt++Qqa//NlIDeFqBAwHEcczQ0DDnzp3F931yudf8fTeLuHefNWvq8X0/OTiek1VrD+fKbdPT0wNAR0cHpVKJqVev+XHzRoyxPH/5guGhR8nv2JiyrJ7nobVGKYWbk7qhoYHGxkYej45SLJV4OjbG4kVpgiBInrHgwxSS8tM4+wdusjaTYepVjoXV1SxftpQ4jpODlyxZTOeRY5g4xn0UUHlk1tXWkk4vYmx8HOsc12/0o5RKDt665Semp6e/7q2VMjm4rq6u8vWpgCvgL7L3WdQoxwvecbEAAAAASUVORK5CYII=</File> | |
| 67 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/down.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcDB8SCzJQIyNpAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAHJJREFUKM+VkdEJwCAMRJ+lOzpaZ3AH6Qrdo7bgAIL9SUElVnsQApeQyyVYaxd+wEjOs/3vdAeEQbNriQtIolZGkhoA5f4HEJXJUWqVBwZejKYA4IFb4T7R+qig/WCTHLTL9PY9e35WhcvAPvGXoaoBeACNCR26Tob0nwAAAABJRU5ErkJggg==</File> | |
| 68 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/email.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLNwRFoWswAAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAgRJREFUSMftlb9rU1EUxz/35r007zUhfTVt8xJFJChSEmlsxKIEdAgodNElg0M7CnXxf+jSDukiJVvp4OTWoaV0qB06CJYO0qkp2UwHf4wGQ+51uEErWFuToCDvwFnuPed+7o/zPVeUy2VdqVT42yb5RxaAA/D/B7Z+N/nq3WcOjpsopdDnXFAAUkquDIeZmbzQHfjguEl1ZpIW/BHYBp6u7nV/YqUVXzS8eN3gyW2f/Q9mB0L8HKe1IeYT8PJNg2f3fJRWPbyxhraCXCbJyk6dYgoGw+DaMNhx1zZjxRSs7NTJZZK01dlXdGZxtTREBwS5TJLqdp2iD24IIh13Q1D0obptoNEBQUv3oaqVBktA0nMY82IsbtSYGgUnbHxqFBY3aox5MZKegyVMTu9gwJZgSZgtJIjHHBa2jpgYgokhWNg6Ih5zmC0ksKSJVX3RsYawBeMezK/XKOXToKG8vEt5eRc0lPJp5tdrjHsm9jwSsM6Uh4TLUVjaPGQk7oCGR3cyPL6b+V7RWsNIPMLS5iFzpat8pQ9gKwRrbxvcv3GJ1HCEturIR//QrRDw4OZF3n9qsrbfYLrg9wYOSUlEwPQt3xSMNjz9i6YhgGupCNfTPlqb3K7Brg3PV/doK3XyyU/tWCc37No9nPhh4iNKqa4+ASkl4HcHzmazwX8cgANwAD7VvgGmeI1DFDAMSAAAAABJRU5ErkJggg==</File> | |
| 69 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/left.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAGFJREFUKJGVkNENwCAIBc/u0NkYrEu4gxu1jtDE/mBC2iryEoIfd0GAQERkW2Uz0FbAAlTg9ISiQAVufX+EBBwKVAO1PyGbsbOib30Bu/ZQ+jWGE0aZLp0c0R7AFd5fjecB5g4xXCTsxbwAAAAASUVORK5CYII=</File> | |
| 70 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/phone.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1SrVQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVaG/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/mft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCdKD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscjxx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcAQwLOQTbIka+AAAAInRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFjh6h3QwAAAnhJREFUSMft1tlLVGEYx/HvbGeOM5b7UmYGQgsibdhUtlFEISRBiFMgLdhFZgbe6t8g3UQXKdKd5E2hBIZEmKlDQ06KoXijuTHNOAvjnM7MOWemi0AISc0TBTHP9Y/3w7s972uora1NtrW18bfLyD+qFJyC/z/YvFGg+52XwYnwbw16qiyDmtMFW4e73iwwMBbg3s0TvwU/eTaMpqg4zxdtDe4bmuf+3XM8H/EBsOIPIgXDaHEFTf4GgElMwyRYsGVlkJ6bBcCd68d4/PTtuvC6eyxFonT0z+MPSPgDEhFfgMa6CkTRQmerg85WB6JoobGugogvsJrr6J9HikS3vtRnD+fxamAYcf9BRFXCoij0ekIkVJWGR+OruV5PCE1RkL1+ZLMNefITVWdKtg43OMtR5Dh9Ix72HT/AtapKejxB6m84fsr1eII8uF1J18tRxj+McvlkEQ3Ocn2n+uGto2QX5BBI2Oh2+diTZ6UkR6Bslw2AiXmJwu0mul0+du7I5EjNIZwXd+u/x1oiSd/wAqpgI9duoqW6mPJiG0YDGA1QXmyjpbqYXLsJRDtDY94/00CmZ8PkZNlYDKuU5lsRzIY1GcFsoDTfylxIRdGSzC6t6IfdE1/JzN7GcjjGyFSIaExbk4nGNEamQiyHYxQWZvP+45J+eNC9QEJMR46pzHglmtoncU2HicoaUVnDNR2mqX2SGa+EHFNRBTtDo4v6W+bMXAhfYg4p/mOm7i/gdk39Mv95yQDBiH5YjStEsYBg2dShiRmSGBVFP6ypKgaTddN92mRMklBV/fCVC6W8eO3e/HOXJnD10l79cHO9g+Z6R+oHkoJT8Ib1HRdc/f2dEVFAAAAAAElFTkSuQmCC</File> | |
| 71 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/images/time.png" Permission="644" Encode="Base64">iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wBDAs2DFJh0kMAAAAidEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOHqHdDAAADFUlEQVRIx+3WX2iVZRzA8e/zPn/Ou8lrbnNa503tHFY6ipHmnEsv2oqgOkLUYpRCCHkzBxKGIigoFRsj5o13CefKdrMThKOtRIjoQpmjkaaMyJ3OSraTzu3s39n2/unCoO7S3lNdtB88dz+eD8+/3+8Rra2tYXd3N/92WPxHsQKvwP9YqAdJ7vgyR2Y4T9ELIQQE2Erw+tPrOPbixtLDl0YLvPPJCC9sq+Xd155hjaNBACFMzSwz+MMoT304yNm3NrMzsbo08KXRAu29N2lLNdGwYY6Gyq9ZF5vmozOfc7j9ZfLFh9hcUcvj8Sbae7/hTEvyvvC/POMDPSPse76RVM04ex4bpqrco8gqDh58g/mgHEcXeSU+xEuJW+xtbuRAz0j0y9V5IUfjlhq2x+fZ6eZ49e0ePvviR6QpJxCGAI2PTTGw2fVwlu2PzNO4pYbOC7locGY4TzK+nuZHf4awjBNHUpz79ApXb0xg2+UobSOkActmmTKaN4yRjK8nM5yPBi/5YJRhbUWIF2q21tVw/L09fNB1nu++v4WJ2UhlwNJg2VRX3Mtf8kvwjhc8n/THAwip8QLB1m1P8P6JVk529HLl25+Qytwb2pA+O8CC50c/YwEsLi6zv60FgUIIBaHk8LE0J4+/SUN9LUIoLKEQKPa3tbC4uIyI+py0Jbg7O8udaUPVKp/ABz8QDPR1QBjieQGhUAgFloI705K7s7NoS0RbcdMmyVj+NunLCpRBSY1AEviCwLcQSKTUaKVBGdKXFWP52zRtktHgQ7uryU6M039tgcyQBSqGZQyWNlgmhozFkMaAipEZsui/tkB2YpxDu6ujwa7rcnSH5nouy+mLBU71LTE5J4Eyzvf2A2VMzklO9S1x+mKB67ksR3doXNeNXjJT9UngJl2DOaZm1jBwdTWWVMCzdHZNEPgeM/MFfi1McaRe/Z5fglrtOA6p+iRPrh3l3I0ZvspN4YV/mkDAcxsle3dpEokEjuOUrjs5jkNdXR1VVb+wb3KSMPxDFkJQWVl5X9v7t/ux67oPDKx8fVbg/w/8G2YI/wPle15OAAAAAElFTkSuQmCC</File> | |
| 72 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/alpaca/alpaca.min.css" Permission="644" Encode="Base64">LyoqIEFkZGVkIHRvIG91dGVyIGZpZWxkIGVsZW1lbnRzIHRvIGhpZGUgdGhlbSAqKi8KLmFscGFjYS1oaWRkZW4KewogICAgZGlzcGxheTogbm9uZTsKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGZpZWxkIG91dGVyIGVsZW1lbnQgKiovCi5hbHBhY2EtZmllbGQKewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRhaW5lciBvdXRlciBmaWVsZCBlbGVtZW50ICoqLwouYWxwYWNhLWNvbnRhaW5lcgp7Cgp9CgovKiogQWRkZWQgdG8gdGhlIG9wdGlvbmFsIGxhYmVsIChvciBsZWdlbmQpIGFjY29tcGFueWluZyBhbnkgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1sYWJlbAp7Cgp9CgovKiogQWRkZWQgdG8gZXZlcnkgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZmlyc3QgY29udGFpbmVyIGl0ZW0gZmllbGQgd2l0aGluIGEgY29udGFpbmVyICoqLwouYWxwYWNhLWNvbnRhaW5lci1pdGVtLWZpcnN0CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgbGFzdCBjb250YWluZXIgaXRlbSBmaWVsZCB3aXRoaW4gYSBjb250YWluZXIgKiovCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0tbGFzdAp7Cgp9CgovKiogQWRkZWQgdG8gYSBjb250YWluZXIgdG8gaW5kaWNhdGUgaXQgaXMgZW1wdHkgKiovCi5hbHBhY2EtY29udGFpbmVyLWVtcHR5CnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgZG9tIGVsZW1lbnQgaG9sZGluZyB0aGUgdG9vbGJhciBmb3IgYW4gYXJyYXkgKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhcgp7Cgp9CgovKiogQWRkZWQgdG8gYSBidXR0b24gaW4gdGhlIGFycmF5IHRvb2xiYXIgdGhhdCB0cmlnZ2VycyBhbiBhY3Rpb24gKiovCi5hbHBhY2EtYXJyYXktdG9vbGJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBkb20gZWxlbWVudCBob2xkaW5nIHRoZSBhY3Rpb25iYXIgZm9yIGVhY2ggYXJyYXkgaXRlbSAqKi8KLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewoKfQoKLyoqIEFkZGVkIHRvIGEgYnV0dG9uIGluIGFuIGFycmF5IGl0ZW0gYWN0aW9uYmFyIHRoYXQgdHJpZ2dlcnMgYW4gYWN0aW9uICoqLwouYWxwYWNhLWFycmF5LWFjdGlvbmJhci1hY3Rpb24KewoKfQoKLyoqIEFkZGVkIHRvIGV2ZXJ5IGNvbnRyb2wgb3V0ZXIgZmllbGQgZWxlbWVudCAqKi8KLmFscGFjYS1jb250cm9sCnsKCn0KCi8qKiBBZGRlZCB0byB0aGUgb3B0aW9uYWwgbGFiZWwgYWNjb21wYW55aW5nIGFueSBjb250cm9sICoqLwouYWxwYWNhLWNvbnRyb2wtbGFiZWwKewoKfQoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICBTVEFURSBMQUJFTFMgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGRpc3BsYXkgbW9kZSAqKi8KLmFscGFjYS1kaXNwbGF5CnsKCn0KCi8qKiBBZGRlZCB0byB0b3AtbW9zdCBjb250cm9sIHdoZW4gcmVuZGVyaW5nIGluIGNyZWF0ZSBtb2RlICoqLwouYWxwYWNhLWNyZWF0ZQp7Cgp9CgovKiogQWRkZWQgdG8gdG9wLW1vc3QgY29udHJvbCB3aGVuIHJlbmRlcmluZyBpbiBlZGl0IG1vZGUgKiovCi5hbHBhY2EtZWRpdAp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgb3B0aW9uYWwgKiovCi5hbHBhY2EtcmVxdWlyZWQKewoKfQoKLyoqIEFkZGVkIHRvIGFueSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkICoqLwouYWxwYWNhLW9wdGlvbmFsCnsKCn0KCi8qKiBBZGRlZCB0byBhbnkgZmllbGQgdGhhdCBpcyByZWFkb25seSAqKi8KLmFscGFjYS1yZWFkb25seQp7Cgp9CgovKiogQWRkZWQgdG8gYW55IGZpZWxkIHRoYXQgaXMgZGlzYWJsZWQgKiovCi5hbHBhY2EtZGlzYWJsZWQKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBBbHBhY2EgZmllbGQgaGVscGVyIHRleHQgKiovCi5hbHBhY2EtaGVscGVyCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIGhvcml6b250YWwgbW9kZSAqKi8KLmFscGFjYS1ob3Jpem9udGFsCnsKCn0KCi8qKiBBZGRlZCB0byBmb3JtIGNvbnRhaW5lcnMgdGhhdCBhcmUgcmVuZGVyaW5nIGluIHZlcnRpY2FsIG1vZGUgKiovCi5hbHBhY2EtdmVydGljYWwKewoKfQoKLyoqIEFkZGVkIHRvIHRoZSB0b3AgbW9zdCBjb250YWluZXIgZWxlbWVudCAqKi8KLmFscGFjYS10b3AKewoKfQoKLyoqIEFkZGVkIHRvIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCAqKi8KLmFscGFjYS12YWxpZAp7Cgp9CgovKiogQWRkZWQgdG8gZmllbGRzIHRoYXQgaGF2ZSBydW4gdGhyb3VnaCB2YWxpZGF0aW9uIGFuZCBhcmUgaW52YWxpZCAqKi8KLmFscGFjYS1pbnZhbGlkCnsKCn0KCi8qKiBBZGRlZCB0byBmaWVsZHMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFyZSBpbnZhbGlkIGJ1dCBhcmUgY3VycmVudGx5IGhpZGluZyBpbnZhbGlkYXRpb24gZXJyb3JzICoqLwouYWxwYWNhLWludmFsaWQtaGlkZGVuCnsKCn0KCi8qIEFkZGVkIHRvIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzIHRvIG1hcmsgdmFsaWRhdGlvbiBtZXNzYWdlcyAqLwouYWxwYWNhLW1lc3NhZ2UKewoKfQoKLyoqIEFkZGVkIHRvIG1lc3NhZ2VzIHRoYXQgYXJlIGZvciBpbnZhbGlkYXRpb24gc3RhdGVzIHRoYXQgYXJlIGN1cnJlbnQgaGlkZGVuIChoaWRlSW5pdFZhbGlkYXRpb25FcnJvcikgKiovCi5hbHBhY2EtbWVzc2FnZS1oaWRkZW4KewoKfQoKLyoqIEFkZGVkIHRvIGJ1dHRvbnMgdGhhdCBhcmUgbWFya2VkIGRpc2FibGVkICovCi5hbHBhY2EtYnV0dG9uLWRpc2FibGVkCnsKCn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09OUyAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtaWNvbi1oZWxwZXIKewoKfQoKLmFscGFjYS1pY29uLXJlcXVpcmVkCnsKCn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1hdXRvY29tcGxldGUKewp9CgoKCi8qKiBBZGRlZCB0byBpbmRpY2F0ZSBob3ZlciBzdGF0ZSAqKi8KLmFscGFjYS1ob3Zlcgp7Cn0KCi8qKiBHZW5lcmFsIHB1cnBvc2UgSFRNTCBjbGVhciAqKi8KLmFscGFjYS1jbGVhcgp7CiAgICBjbGVhcjogYm90aDsKfQoKLmFscGFjYS1mbG9hdC1yaWdodAp7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCgovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCi8qKiBUV0lUVEVSIFRZUEVBSEVBRCAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnR3aXR0ZXItdHlwZWFoZWFkIC50dC1kcm9wZG93bi1tZW51IFAKewogICAgZm9udC1zaXplOiAxZW07Cn0KCi50dC1zdWdnZXN0aW9uLnR0LWlzLXVuZGVyLWN1cnNvcgp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwogICAgY29sb3I6ICMzMzM7Cn0KCi50dC1kcm9wZG93bi1tZW51CnsKICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOwogICAgd2lkdGg6IDEwMCU7Cn0KCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEVESVRPUiBGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWNvbnRyb2xmaWVsZC1lZGl0b3IKewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwMHB4OwogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKfQoKLmFscGFjYS1jb250cm9sZmllbGQtZWRpdG9yIC5jb250cm9sLWZpZWxkLWVkaXRvci1lbAp7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6MAp9CgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIERBVEVQSUNLRVIgKGpRdWVyeVVJKSAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgojdWktZGF0ZXBpY2tlci1kaXYKewogICAgZGlzcGxheTogbm9uZTsKICAgIGJhY2tncm91bmQtY29sb3I6d2hpdGU7CiAgICB6LWluZGV4OiA5OTk5OTk5ICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMjJlbSAhaW1wb3J0YW50Owp9CgovKiBGaXggZm9yIENocm9tZSBpc3N1ZSB3aXRoIEJ1dHRvbiB0ZXh0ICovCi51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi51aS1kYXRlcGlja2VyCnsKICAgIHotaW5kZXg6IDEwMDsKfQoKCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEZJTEUgVVBMT0FEIChqUXVlcnlVSSkgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyCnsKICAgIGJvcmRlcjogMXB4ICNjY2Mgc29saWQ7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4Owp9CgouYWxwYWNhLWZpbGV1cGxvYWQtY29udGFpbmVyIC5yb3cKewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwKewogICAgLypib3JkZXI6IDFweCAjY2NjIHNvbGlkOyovCiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgbWluLWhlaWdodDogMTAwcHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC1jb250YWluZXIgdGFibGUKewogICAgYm9yZGVyOiAxcHggI2NjYyBzb2xpZDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi5hbHBhY2EtZmlsZXVwbG9hZC13ZWxsIHAKewogICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICBjb2xvcjogIzg4ODsKfQoKLmFscGFjYS1maWxldXBsb2FkLXdlbGwgdGFibGUgdGJvZHkuZmlsZXMgdHIgdGQubmFtZQp7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCgoKCgoKCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KLyoqIEFDRSBFRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwovKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovCgouYWNlX2VkaXRvcgp7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogQ0sgRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwoKLmFscGFjYS1maWVsZC1ja2VkaXRvci5hbHBhY2EtaW52YWxpZCA+IC5ja2UKewogICAgYm9yZGVyLWNvbG9yOiAjZjA0MTI0Owp9CgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogT1BUSU9OVFJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZSB7Cgp9CgouYWxwYWNhLWZpZWxkLW9wdGlvbnRyZWUgLm9wdGlvbnRyZWUgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlIC5vcHRpb250cmVlIC5vcHRpb250cmVlLXNlbGVjdG9yIHsKCn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgewoKfQoKLmFscGFjYS1maWVsZC1vcHRpb250cmVlLm9wdGlvbnRyZWUtaG9yaXpvbnRhbCAub3B0aW9udHJlZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgLm9wdGlvbnRyZWUgLm9wdGlvbnRyZWUtc2VsZWN0b3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZy1sZWZ0OiA0cHg7Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgaW5wdXQgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtb3B0aW9udHJlZS5vcHRpb250cmVlLWhvcml6b250YWwgbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCgoKLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLwovKiogVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS1maWVsZC10YWJsZXJvdyBsYWJlbC5jb250cm9sLWxhYmVsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtZmllbGQtdGFibGVyb3cgbGFiZWwuY29udHJvbC1sYWJlbAp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hY3Rpb25iYXIsIC50YWJsZSAuYWN0aW9uYmFyCnsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgdGFibGUgdHIgdGQgLmFscGFjYS1maWVsZCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkCnsKICAgIHdpZHRoOiAxMDAlOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIHRhYmxlIHRyIHRkIC5hbHBhY2EtZmllbGQgLmZvcm0tY29udHJvbCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCB0ciB0ZCAuYWxwYWNhLWZpZWxkIC5mb3JtLWNvbnRyb2wKewogICAgd2lkdGg6IDEwMCU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmZvcm0tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmZvcm0tZ3JvdXAKewogICAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5mb3JtLWdyb3VwLmFscGFjYS1maWVsZC1jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuZm9ybS1ncm91cC5hbHBhY2EtZmllbGQtY2hlY2tib3gKewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtY29udHJvbC5jaGVja2JveCwKdGFibGUuZHQtcm93UmVvcmRlci1mbG9hdCAuYWxwYWNhLWNvbnRyb2wuY2hlY2tib3gKewogICAgcGFkZGluZy10b3A6IDZweDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSB0YWJsZSB0ciB0ZC5hY3Rpb25iYXIgLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgdHIgdGQuYWN0aW9uYmFyIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFjdGlvbmJhciAuYWxwYWNhLWFycmF5LWFjdGlvbmJhci5idG4tZ3JvdXAKewogICAgd2lkdGg6IGF1dG87Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1jb2x1bW4taGlkZGVuLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtY29sdW1uLWhpZGRlbgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWluZGV4LWhlYWRlcgp7CiAgICBkaXNwbGF5OiBub25lOwp9CgouYWxwYWNhLWZpZWxkLXRhYmxlIC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsLAp0YWJsZS5kdC1yb3dSZW9yZGVyLWZsb2F0IC5hbHBhY2EtdGFibGUtcmVvcmRlci1pbmRleC1jZWxsCnsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5hbHBhY2EtZmllbGQtdGFibGUgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1oZWFkZXIKewoKfQoKLmFscGFjYS1maWVsZC10YWJsZSAuYWxwYWNhLXRhYmxlLXJlb3JkZXItZHJhZ2dhYmxlLWNlbGwsCnRhYmxlLmR0LXJvd1Jlb3JkZXItZmxvYXQgLmFscGFjYS10YWJsZS1yZW9yZGVyLWRyYWdnYWJsZS1jZWxsCnsKICAgIGNvbG9yOiAjYmJiOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIHBhZGRpbmctdG9wOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKCgoKCi5hbHBhY2EtZmllbGQtcmFkaW8uZGlzYWJsZWQgLmFscGFjYS1jb250cm9sLnJhZGlvCnsKICAgIGNvbG9yOiBncmV5Owp9CgouYWxwYWNhLWZpZWxkLXJhZGlvLmRpc2FibGVkIC5hbHBhY2EtY29udHJvbC5yYWRpbyBsYWJlbAp7CiAgICBjdXJzb3I6IGluaGVyaXQ7Cn0KCgouYWxwYWNhLWNvbnRyb2wucmFkaW8KewogICAgbWluLWhlaWdodDogaW5oZXJpdDsKICAgIGhlaWdodDogaW5oZXJpdDsKICAgIHBhZGRpbmctdG9wOiAwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OwogICAgcGFkZGluZy1sZWZ0OiAwcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKfQoKLmFscGFjYS1jb250cm9sLnJhZGlvIGxhYmVsCnsKICAgIGxpbmUtaGVpZ2h0OiAyMHB4Owp9CgovKiogbXVsdGlzZWxlY3QgKiovCgouaGFzLWVycm9yIC5tdWx0aXNlbGVjdAp7CiAgICBib3JkZXItY29sb3I6ICNhOTQ0NDI7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Cn0KCi5idG4ubXVsdGlzZWxlY3QKewogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLmFscGFjYS1maWVsZC10YWJsZSA+IGxlZ2VuZAp7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCmxlZ2VuZC5hbHBhY2EtY29udGFpbmVyLWxhYmVsCnsKICAgIG1hcmdpbi10b3A6IDBweDsKfQoKLmFscGFjYS1hcnJheS10b29sYmFyLmFscGFjYS1hcnJheS10b29sYmFyLXBvc2l0aW9uLXRvcAp7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LXRvb2xiYXIuYWxwYWNhLWFycmF5LXRvb2xiYXItcG9zaXRpb24tYm90dG9tCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyCnsKICAgIC8qaGVpZ2h0OiA0MHB4OyovCn0KCi5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmFscGFjYS1hcnJheS1hY3Rpb25iYXItdG9wCnsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4Owp9CgouYWxwYWNhLWFycmF5LWFjdGlvbmJhci5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLWJvdHRvbQp7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIsIC5hbHBhY2EtYXJyYXktYWN0aW9uYmFyLmJ0bi1ncm91cAp7CiAgICB3aWR0aDogMTAwJTsKfQoKLmFscGFjYS1hcnJheS1hY3Rpb25iYXIKewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5hbHBhY2EtZGlzcGxheSBoMwp7CiAgICBtYXJnaW4tdG9wOiAwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtb2JqZWN0ID4gLmFscGFjYS1jb250YWluZXIuYWxwYWNhLWNvbnRhaW5lci1oYXMtaXRlbXMKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KKi8KCi5hbHBhY2EtZmllbGQtYXJyYXkKewogICAgYm9yZGVyOiAxcHggI2VlZSBzb2xpZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi8qCi5hbHBhY2EtZmllbGQtYXJyYXkgPiAuYWxwYWNhLWNvbnRhaW5lci5hbHBhY2EtY29udGFpbmVyLWhhcy1pdGVtcwp7CiAgICBib3JkZXI6IDFweCAjZWVlIHNvbGlkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTBweDsKfQoqLwoKLmFscGFjYS1jb250cm9sLWJ1dHRvbnMtY29udGFpbmVyCnsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW0gPiAuYWxwYWNhLWNvbnRhaW5lciA+IC5hbHBhY2EtZmllbGQtb2JqZWN0CnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZvcm0tYnV0dG9ucy1jb250YWluZXIKewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouYWxwYWNhLWNvbnRhaW5lciA+IC5mb3JtLWdyb3VwCnsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDBweDsKfQoKLmFscGFjYS1maWVsZC1oaWRkZW4KewogICAgZGlzcGxheTpub25lOwp9CgouYWxwYWNhLWZpZWxkLW9iamVjdC5hbHBhY2EtdG9wCnsKICAgIGJvcmRlcjogMHB4Owp9CgouYWxwYWNhLWZpZWxkLWFycmF5LmFscGFjYS10b3AKewogICAgYm9yZGVyOiAwcHg7Cn0KCi5hbHBhY2EtY29udGFpbmVyLWl0ZW06bm90KDpmaXJzdC1jaGlsZCkKewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmFscGFjYS1jb250YWluZXIgLmFscGFjYS1jb250YWluZXItaXRlbTpsYXN0LWNoaWxkCnsKICAgIG1hcmdpbi1ib3R0b206IDBweDsKfQoKLmFscGFjYS1maWVsZC1vYmplY3QuYWxwYWNhLXRvcCAuYWxwYWNhLWNvbnRhaW5lcgp7CiAgICBib3JkZXI6IDBweDsKfQoKLmFscGFjYS1maWVsZC1zZWxlY3QgLmJ0bi1ncm91cAp7CiAgICBkaXNwbGF5OmJsb2NrOwp9CgouYWxwYWNhLWZpZWxkLXNlbGVjdCAuYnRuLWdyb3VwIGJ1dHRvbi5tdWx0aXNlbGVjdAp7CiAgICBmbG9hdDogbm9uZTsKfQoKLyoKLmJvb3RzdHJhcC10aW1lcGlja2VyLXdpZGdldCB0YWJsZSB0ZCBpbnB1dAp7CiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CiovCgoKCgovKiogRklFbERTICoqLwouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLmZpbGV1cGxvYWQtYWN0aXZlLXpvbmUKewogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtdXBsb2FkIC50ZW1wbGF0ZS1kb3dubG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtZG93bmxvYWQgVEQuZXJyb3IgLmxhYmVsCnsKICAgIGNvbG9yOiByZWQ7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgouYWxwYWNhLWZpZWxkLmFscGFjYS1maWVsZC11cGxvYWQgLnRlbXBsYXRlLXVwbG9hZCBURC5lcnJvcgp7CiAgICBjb2xvcjogcmVkOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9Ci5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLXVwbG9hZCAudGVtcGxhdGUtdXBsb2FkIFRELmVycm9yIC5sYWJlbAp7CiAgICBjb2xvcjogcmVkOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmFscGFjYS1maWVsZC5hbHBhY2EtZmllbGQtYWRkcmVzcyAuYWxwYWNhLWZpZWxkLWFkZHJlc3MtbWFwY2FudmFzCnsKICAgIGhlaWdodDogMjUwcHg7Cn0KCi5hbHBhY2EtZmllbGQuYWxwYWNhLWZpZWxkLWltYWdlIC5hbHBhY2EtaW1hZ2UtZGlzcGxheQp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWZpZWxkLXRleHQtbWF4LWxlbmd0aC1pbmRpY2F0b3IKewogICAgY29sb3I6ICNhYWE7Cn0KCi5hbHBhY2EtZmllbGQtdGV4dC1tYXgtbGVuZ3RoLWluZGljYXRvci5lcnIKewogICAgY29sb3I6ICNhYTAwMDA7Cn0KCgoKLyoqIFdJWkFSRCAqKi8KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbgp7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogLTE0cHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNkNGQ0ZDQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSAuY2hldnJvbjpiZWZvcmUKewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMjdweDsKICAgIHJpZ2h0OiAxcHg7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlcjogMjdweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiAxNHB4IHNvbGlkICNmY2ZjZmM7CiAgICBjb250ZW50OiAiIjsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpIGRpdi5ob2xkZXIKewogICAgcGFkZGluZy1sZWZ0OiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmctdG9wOiA2cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4Owp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGk6Zmlyc3QtY2hpbGQgZGl2LmhvbGRlcgp7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaSBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogI2FhYTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmNvbXBsZXRlZCBkaXYuaG9sZGVyIGRpdi5kZXNjcmlwdGlvbgp7CiAgICBjb2xvcjogIzMzMzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLnZpc2l0ZWQ6aG92ZXIKewogICAgY3Vyc29yOiBwb2ludGVyOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgbGkudmlzaXRlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS52aXNpdGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmFjdGl2ZTpob3Zlcgp7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYudGl0bGUKewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5hY3RpdmUgZGl2LmhvbGRlciBkaXYuZGVzY3JpcHRpb24KewogICAgY29sb3I6ICMyMDYxOTk7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLW5hdiBsaS5kaXNhYmxlZCBkaXYuaG9sZGVyIGRpdi50aXRsZQp7CiAgICBjb2xvcjogI2NjYzsKfQoKLmFscGFjYS13aXphcmQgLmFscGFjYS13aXphcmQtbmF2IGxpLmRpc2FibGVkIGRpdi5ob2xkZXIgZGl2LmRlc2NyaXB0aW9uCnsKICAgIGNvbG9yOiAjY2NjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1uYXYgLmFscGFjYS13aXphcmQtYmFjawp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZjOwp9CgouYWxwYWNhLXdpemFyZCAuYWxwYWNhLXdpemFyZC1idXR0b25zCnsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5hbHBhY2Etd2l6YXJkIC5hbHBhY2Etd2l6YXJkLXByb2dyZXNzLWJhcgp7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgouYWxwYWNhLWNvbnRyb2wuZGlzYWJsZWQgbGFiZWwKewogICAgY29sb3I6ICNhYWE7Cn0K</File> | |
| 73 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload-ui.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVJIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxldXBsb2FkLWJ1dHRvbmJhciAuYnRuLAouZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSB7CiAgbWFyZ2luLWJvdHRvbTogNXB4Owp9Ci5wcm9ncmVzcy1hbmltYXRlZCAucHJvZ3Jlc3MtYmFyLAoucHJvZ3Jlc3MtYW5pbWF0ZWQgLmJhciB7CiAgYmFja2dyb3VuZDogdXJsKCIuLi9pbWcvcHJvZ3Jlc3NiYXIuZ2lmIikgIWltcG9ydGFudDsKICBmaWx0ZXI6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2VzcyB7CiAgZmxvYXQ6IHJpZ2h0OwogIGRpc3BsYXk6IG5vbmU7Cn0KLmZpbGV1cGxvYWQtcHJvY2Vzc2luZyAuZmlsZXVwbG9hZC1wcm9jZXNzLAouZmlsZXMgLnByb2Nlc3NpbmcgLnByZXZpZXcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAzMnB4OwogIGhlaWdodDogMzJweDsKICBiYWNrZ3JvdW5kOiB1cmwoIi4uL2ltZy9sb2FkaW5nLmdpZiIpIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5maWxlcyBhdWRpbywKLmZpbGVzIHZpZGVvIHsKICBtYXgtd2lkdGg6IDMwMHB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsKICAuZmlsZXVwbG9hZC1idXR0b25iYXIgLnRvZ2dsZSwKICAuZmlsZXMgLnRvZ2dsZSwKICAuZmlsZXMgLmJ0biBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIC5maWxlcyAubmFtZSB7CiAgICB3aWR0aDogODBweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICB9CiAgLmZpbGVzIGF1ZGlvLAogIC5maWxlcyB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDgwcHg7CiAgfQogIC5maWxlcyBpbWcsCiAgLmZpbGVzIGNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Cg==</File> | |
| 74 | + <File Location="var/httpd/htdocs/skins/Customer/default/css/jqueryfileupload/jquery.fileupload.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiBDU1MKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEzLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi5maWxlaW5wdXQtYnV0dG9uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZpbGVpbnB1dC1idXR0b24gaW5wdXQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDA7CiAgLW1zLWZpbHRlcjogJ2FscGhhKG9wYWNpdHk9MCknOwogIGZvbnQtc2l6ZTogMjAwcHggIWltcG9ydGFudDsKICBkaXJlY3Rpb246IGx0cjsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIEZpeGVzIGZvciBJRSA8IDggKi8KQG1lZGlhIHNjcmVlblw5IHsKICAuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgfQp9Cg==</File> | |
| 75 | + <File Location="var/httpd/htdocs/skins/Agent/default/css/jquery.jsonview.css" Permission="644" Encode="Base64">QGNoYXJzZXQgIlVURi04IjsKLmpzb252aWV3IHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMS4xZW07CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB9CiAgLmpzb252aWV3IC5wcm9wIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLmpzb252aWV3IC5udWxsIHsKICAgIGNvbG9yOiByZWQ7IH0KICAuanNvbnZpZXcgLmJvb2wgewogICAgY29sb3I6IGJsdWU7IH0KICAuanNvbnZpZXcgLm51bSB7CiAgICBjb2xvcjogYmx1ZTsgfQogIC5qc29udmlldyAuc3RyaW5nIHsKICAgIGNvbG9yOiBncmVlbjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgfQogICAgLmpzb252aWV3IC5zdHJpbmcubXVsdGlsaW5lIHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMWVtOwogICAgY3Vyc29yOiBwb2ludGVyOyB9CiAgLmpzb252aWV3IC5jb2xsYXBzaWJsZSB7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMS4yczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDEuMnM7IH0KICAuanNvbnZpZXcgLmNvbGxhcHNpYmxlLmNvbGxhcHNlZCB7CiAgICBoZWlnaHQ6IC44ZW07CiAgICB3aWR0aDogMWVtOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMDsgfQogIC5qc29udmlldyAuY29sbGFwc2libGUuY29sbGFwc2VkOmJlZm9yZSB7CiAgICBjb250ZW50OiAi4oCmIjsKICAgIHdpZHRoOiAxZW07CiAgICBtYXJnaW4tbGVmdDogLjJlbTsgfQogIC5qc29udmlldyAuY29sbGFwc2VyLmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogIC5qc29udmlldyAucSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMHB4OwogICAgY29sb3I6IHRyYW5zcGFyZW50OyB9CiAgLmpzb252aWV3IGxpIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIC5qc29udmlldyB1bCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwIDAgMCAyZW07CiAgICBwYWRkaW5nOiAwOyB9CiAgLmpzb252aWV3IGgxIHsKICAgIGZvbnQtc2l6ZTogMS4yZW07IH0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5qc29udmlldy5jc3MubWFwICovCg==</File> | |
| 76 | + </Filelist> | |
| 77 | + <DatabaseInstall> | |
| 78 | + <TableCreate Type="post" Name="service_form"> | |
| 79 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 80 | + <Column Name="introduction" Required="true" Type="text"></Column> | |
| 81 | + <Column Name="form" Required="true" Type="text"></Column> | |
| 82 | + <Column Name="form_schema" Required="true" Type="text"></Column> | |
| 83 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 84 | + <ForeignKey ForeignTable="service"> | |
| 85 | + <Reference Foreign="id" Local="service_id"> | |
| 86 | + </Reference> | |
| 87 | + </ForeignKey> | |
| 88 | + <ForeignKey ForeignTable="queue"> | |
| 89 | + <Reference Foreign="id" Local="queue_id"> | |
| 90 | + </Reference> | |
| 91 | + </ForeignKey> | |
| 92 | + </TableCreate> | |
| 93 | + </DatabaseInstall> | |
| 94 | + <DatabaseUpgrade Version="1.6.2"> | |
| 95 | + <TableCreate Type="post" Name="service_form"> | |
| 96 | + <Column Name="queue_id" Required="false" Type="int"></Column> | |
| 97 | + <ForeignKey ForeignTable="queue"> | |
| 98 | + <Reference Foreign="id" Local="queue_id"> | |
| 99 | + </Reference> | |
| 100 | + </ForeignKey> | |
| 101 | + </TableCreate> | |
| 102 | + <TableCreate Type="post" Name="restricted_service"> | |
| 103 | + <Column Name="service_id" PrimaryKey="true" Required="true" Type="int"></Column> | |
| 104 | + </TableCreate> | |
| 105 | + </DatabaseUpgrade> | |
| 106 | +</otrs_package> | |
| 0 | 107 | \ No newline at end of file | ... | ... |
NewTicketWizard.sopm
| 1 | 1 | <?xml version="1.0" encoding="utf-8" ?> |
| 2 | 2 | <otrs_package version="1.0"> |
| 3 | 3 | <Name>NewTicketWizard</Name> |
| 4 | - <Version>3.0.10</Version> | |
| 4 | + <Version>3.0.15</Version> | |
| 5 | 5 | <Framework>5.0.x</Framework> |
| 6 | 6 | <Vendor>SeTIC</Vendor> |
| 7 | 7 | <URL>http://www.setic.ufsc.br</URL> |
| ... | ... | @@ -31,7 +31,7 @@ |
| 31 | 31 | <ChangeLog version="2.1.8">Support for CKEditor</ChangeLog> |
| 32 | 32 | <ChangeLog version="2.2.0">Support for Image Upload direct on the CKEditor</ChangeLog> |
| 33 | 33 | <ChangeLog version="2.2.1">Fixes for AlpacaJS (dropdown)</ChangeLog> |
| 34 | - <ChangeLog version="3.0.10">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 34 | + <ChangeLog version="3.0.15">Conversion to Bootstrap, support for images and multiple file upload</ChangeLog> | |
| 35 | 35 | <IntroInstall Type="post" Title="Thank you">New Ticket Wizard module installed successfully!</IntroInstall> |
| 36 | 36 | <BuildDate>?</BuildDate> |
| 37 | 37 | <BuildHost>?</BuildHost> | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>2.0.0</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="2.0.0">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-06-20 17:39:39</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJmb290ZXJGIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm90dG9tOiAxMHB4OyB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMThweDsgbWFyZ2luLWJvdHRvbTogOHB4OyIgY2xhc3M9Im5vUHJpbnQiPgoKPGRpdiBzdHlsZT0iZm9udC1zaXplOiAwcHg7Ij4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAycHg7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NlcGFyYWRvci5naWYnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjwvZGl2Pgo8L2Rpdj4KCQk8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5zZXRpYy51ZnNjLmJyIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJCTxicj4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNCQkJCQkI7Ij7CqSBTZVRJQyAtIFN1cGVyaW50ZW5kw6puY2lhIGRlIEdvdmVybmFuw6dhIEVsZXRyw7RuaWNhIGUgVGVjbm9sb2dpYSBkYSBJbmZvcm1hw6fDo28gZSBDb211bmljYcOnw6NvPC9zcGFuPgoJCTwvZGl2PgoJCTxkaXYgaWQ9IkZvb3RlciIgY2xhc3M9IkFSSUFSb2xlQ29udGVudGluZm8iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYW5uZXIiKSAlXQogICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vdHJzLmNvbS8iIHRpdGxlPSJbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIFRyYW5zbGF0ZSgiUG93ZXJlZCBieSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKS5yZW1vdmUoJ1wuMFwuLionKSAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJhbm5lciIpICVdCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCgoKClslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lckZvb3RlckpTLnR0IikgJV0KCjwvYm9keT4KPC9odG1sPgo=</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+ClslIEluc2VydFRlbXBsYXRlKCJDb3B5cmlnaHQudHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJIVE1MSGVhZE5UV1NlVElDLnR0IikgJV0KCjxib2R5IGNsYXNzPSJOb0phdmFTY3JpcHQiIFslIERhdGEuQm9keUNsYXNzIHwgaHRtbCAlXT4KCQoJCgk8ZGl2IGNsYXNzPSJjb250YWluZXIiPgkJCgkJPGRpdiBjbGFzcz0icGFuZWwiPgoJCQk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICIgaWQ9ImhlYWRlciIvPgkJCQoJCTwvZGl2PgkJCgkJCQoJCQk8ZGl2IGNsYXNzPSJidG4tZ3JvdXAtdmVydGljYWwgcHVsbC1yaWdodCI+CgkgCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJCSAgCQkJPGEgdGFyZ2V0PSJfbmV3IiBocmVmPSJodHRwOi8vdGkudWZzYy5ici8iPkNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2E+CgkgCQkJPC9idXR0b24+IAoJIAkJPC9kaXY+CgkJPGRpdiBjbGFzcz0icGFuZWwiPgoJCQkJCQk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICI+CgkgCQk8aDE+U2VUSUMgLSBQb3J0YWwgZGUgQ2hhbWFkb3M8L2gxPgoJIAkJCgkgCQkKCSAJCTwvZGl2PgoJCTwvZGl2PgoJCgo8IS0tIGVuZCBoZWFkZXIgLS0+Cg==</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIElOQ0xVREUgIkhUTUxIZWFkUmVmcmVzaC50dCIgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFIdHRwRXF1aXZSZWZyZXNoIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJbJSBEYXRhLlJlbCB8IGh0bWwgJV0iIHR5cGU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5IcmVmICVdIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL3Byb2R1Y3QuaWNvIiB0eXBlPSJpbWFnZS9pY28iIC8+CiAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OkltYWdlUGF0aCIpICVdaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi5wbmciIC8+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb21tb25DU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbW1vbkNTUyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNb2R1bGVDU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1vZHVsZUNTUyIpICVdCgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS91aS10aGVtZS9qcXVlcnktdWkuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS9qc3RyZWUtdGhlbWUvZGVmYXVsdC9zdHlsZS5jc3MiIC8+CgogICAgPHRpdGxlPlslIERhdGEuVGl0bGVBcmVhIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3ROYW1lIikgJV08L3RpdGxlPgoKWyUgSU5DTFVERSAiSFRNTEhlYWRCbG9ja0V2ZW50cy50dCIgJV0KCgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCSNoZWFkZXIgewoJCQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL2NhYmVjYWxob1VGU0MuanBnIik7CgkJCWhlaWdodDogOTBweDsKCQkJZGlzcGxheTogYmxvY2s7CgkJfQoJPC9zdHlsZT4KCTwhLS0gQ3VzdG9taXphY29lcyBTZVRJQyAtLT4KPC9oZWFkPgo=</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.0</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.0">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-06-20 17:42:59</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJmb290ZXJGIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm90dG9tOiAxMHB4OyB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMThweDsgbWFyZ2luLWJvdHRvbTogOHB4OyIgY2xhc3M9Im5vUHJpbnQiPgoKPGRpdiBzdHlsZT0iZm9udC1zaXplOiAwcHg7Ij4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAycHg7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NlcGFyYWRvci5naWYnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjwvZGl2Pgo8L2Rpdj4KCQk8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5zZXRpYy51ZnNjLmJyIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJCTxicj4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNCQkJCQkI7Ij7CqSBTZVRJQyAtIFN1cGVyaW50ZW5kw6puY2lhIGRlIEdvdmVybmFuw6dhIEVsZXRyw7RuaWNhIGUgVGVjbm9sb2dpYSBkYSBJbmZvcm1hw6fDo28gZSBDb211bmljYcOnw6NvPC9zcGFuPgoJCTwvZGl2PgoJCTxkaXYgaWQ9IkZvb3RlciIgY2xhc3M9IkFSSUFSb2xlQ29udGVudGluZm8iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYW5uZXIiKSAlXQogICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vdHJzLmNvbS8iIHRpdGxlPSJbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIFRyYW5zbGF0ZSgiUG93ZXJlZCBieSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKS5yZW1vdmUoJ1wuMFwuLionKSAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJhbm5lciIpICVdCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCgoKClslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lckZvb3RlckpTLnR0IikgJV0KCjwvYm9keT4KPC9odG1sPgo=</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+ClslIEluc2VydFRlbXBsYXRlKCJDb3B5cmlnaHQudHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJIVE1MSGVhZE5UV1NlVElDLnR0IikgJV0KCjxib2R5IGNsYXNzPSJOb0phdmFTY3JpcHQiIFslIERhdGEuQm9keUNsYXNzIHwgaHRtbCAlXT4KCQoJCgk8ZGl2IGNsYXNzPSJjb250YWluZXIiPgkJCgkJPGRpdiBjbGFzcz0icGFuZWwiPgoJCQk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICIgaWQ9ImhlYWRlciIvPgkJCQoJCTwvZGl2PgkJCgkJCQoJCQk8ZGl2IGNsYXNzPSJidG4tZ3JvdXAtdmVydGljYWwgcHVsbC1yaWdodCI+CgkgCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJCSAgCQkJPGEgdGFyZ2V0PSJfbmV3IiBocmVmPSJodHRwOi8vdGkudWZzYy5ici8iPkNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2E+CgkgCQkJPC9idXR0b24+IAoJIAkJPC9kaXY+CgkJPGRpdiBjbGFzcz0icGFuZWwiPgoJCQkJCQk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICI+CgkgCQk8aDE+U2VUSUMgLSBQb3J0YWwgZGUgQ2hhbWFkb3M8L2gxPgoJIAkJCgkgCQkKCSAJCTwvZGl2PgoJCTwvZGl2PgoJCgo8IS0tIGVuZCBoZWFkZXIgLS0+Cg==</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIElOQ0xVREUgIkhUTUxIZWFkUmVmcmVzaC50dCIgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFIdHRwRXF1aXZSZWZyZXNoIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJbJSBEYXRhLlJlbCB8IGh0bWwgJV0iIHR5cGU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5IcmVmICVdIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL3Byb2R1Y3QuaWNvIiB0eXBlPSJpbWFnZS9pY28iIC8+CiAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OkltYWdlUGF0aCIpICVdaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi5wbmciIC8+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb21tb25DU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbW1vbkNTUyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNb2R1bGVDU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1vZHVsZUNTUyIpICVdCgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS91aS10aGVtZS9qcXVlcnktdWkuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS9qc3RyZWUtdGhlbWUvZGVmYXVsdC9zdHlsZS5jc3MiIC8+CgogICAgPHRpdGxlPlslIERhdGEuVGl0bGVBcmVhIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3ROYW1lIikgJV08L3RpdGxlPgoKWyUgSU5DTFVERSAiSFRNTEhlYWRCbG9ja0V2ZW50cy50dCIgJV0KCgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCSNoZWFkZXIgewoJCQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL2NhYmVjYWxob1VGU0MuanBnIik7CgkJCWhlaWdodDogOTBweDsKCQkJZGlzcGxheTogYmxvY2s7CgkJfQoJPC9zdHlsZT4KCTwhLS0gQ3VzdG9taXphY29lcyBTZVRJQyAtLT4KPC9oZWFkPgo=</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.3</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.3">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-06-20 19:16:57</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJmb290ZXJGIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm90dG9tOiAxMHB4OyB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMThweDsgbWFyZ2luLWJvdHRvbTogOHB4OyIgY2xhc3M9Im5vUHJpbnQiPgoKPGRpdiBzdHlsZT0iZm9udC1zaXplOiAwcHg7Ij4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAycHg7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NlcGFyYWRvci5naWYnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjwvZGl2Pgo8L2Rpdj4KCQk8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5zZXRpYy51ZnNjLmJyIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJCTxicj4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNCQkJCQkI7Ij7CqSBTZVRJQyAtIFN1cGVyaW50ZW5kw6puY2lhIGRlIEdvdmVybmFuw6dhIEVsZXRyw7RuaWNhIGUgVGVjbm9sb2dpYSBkYSBJbmZvcm1hw6fDo28gZSBDb211bmljYcOnw6NvPC9zcGFuPgoJCTwvZGl2PgoJCTxkaXYgaWQ9IkZvb3RlciIgY2xhc3M9IkFSSUFSb2xlQ29udGVudGluZm8iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYW5uZXIiKSAlXQogICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vdHJzLmNvbS8iIHRpdGxlPSJbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIFRyYW5zbGF0ZSgiUG93ZXJlZCBieSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKS5yZW1vdmUoJ1wuMFwuLionKSAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJhbm5lciIpICVdCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCgoKClslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lckZvb3RlckpTLnR0IikgJV0KCjwvYm9keT4KPC9odG1sPgo=</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+ClslIEluc2VydFRlbXBsYXRlKCJDb3B5cmlnaHQudHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJIVE1MSGVhZE5UV1NlVElDLnR0IikgJV0KCjxib2R5IGNsYXNzPSJOb0phdmFTY3JpcHQiIFslIERhdGEuQm9keUNsYXNzIHwgaHRtbCAlXT4KCQoJCgk8ZGl2IGNsYXNzPSJjb250YWluZXIiPgkJCgkJPGRpdiBjbGFzcz0icGFuZWwiPgoJCQk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICIgaWQ9ImhlYWRlciIvPgkJCQoJCTwvZGl2PgkJCgkJCQoJCQk8ZGl2IGNsYXNzPSJidG4tZ3JvdXAtdmVydGljYWwgcHVsbC1yaWdodCI+CgkgCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgoJCSAgCQkJPGEgdGFyZ2V0PSJfbmV3IiBocmVmPSJodHRwOi8vdGkudWZzYy5ici8iPkNhdMOhbG9nbyBkZSBzZXJ2acOnb3M8L2E+CgkgCQkJPC9idXR0b24+IAoJIAkJPC9kaXY+CgkJPGRpdiBjbGFzcz0icGFuZWwiPgoJCQkJCQk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICI+CgkgCQk8aDE+U2VUSUMgLSBQb3J0YWwgZGUgQ2hhbWFkb3M8L2gxPgoJIAkJCgkgCQkKCSAJCTwvZGl2PgoJCTwvZGl2PgoJCgo8IS0tIGVuZCBoZWFkZXIgLS0+Cg==</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIElOQ0xVREUgIkhUTUxIZWFkUmVmcmVzaC50dCIgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFIdHRwRXF1aXZSZWZyZXNoIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJbJSBEYXRhLlJlbCB8IGh0bWwgJV0iIHR5cGU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5IcmVmICVdIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL3Byb2R1Y3QuaWNvIiB0eXBlPSJpbWFnZS9pY28iIC8+CiAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OkltYWdlUGF0aCIpICVdaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi5wbmciIC8+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb21tb25DU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbW1vbkNTUyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNb2R1bGVDU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1vZHVsZUNTUyIpICVdCgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS91aS10aGVtZS9qcXVlcnktdWkuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS9qc3RyZWUtdGhlbWUvZGVmYXVsdC9zdHlsZS5jc3MiIC8+CgogICAgPHRpdGxlPlslIERhdGEuVGl0bGVBcmVhIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3ROYW1lIikgJV08L3RpdGxlPgoKWyUgSU5DTFVERSAiSFRNTEhlYWRCbG9ja0V2ZW50cy50dCIgJV0KCgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCSNoZWFkZXIgewoJCQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL2NhYmVjYWxob1VGU0MuanBnIik7CgkJCWhlaWdodDogOTBweDsKCQkJZGlzcGxheTogYmxvY2s7CgkJfQoJCQoJCWlucHV0W3R5cGU9dGV4dF0sIGlucHV0W3R5cGU9ZW1haWxdLCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CgkJICAgd2lkdGg6IDEwMCU7CgkJfQoJCQoJCWxhYmVsIHsKCQkJZm9udC1zaXplOiAxMDAlOwoJCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCX0KCQkKCTwvc3R5bGU+Cgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CjwvaGVhZD4K</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.4</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.4">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-06-21 17:47:57</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJmb290ZXJGIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm90dG9tOiAxMHB4OyB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMThweDsgbWFyZ2luLWJvdHRvbTogOHB4OyIgY2xhc3M9Im5vUHJpbnQiPgoKPGRpdiBzdHlsZT0iZm9udC1zaXplOiAwcHg7Ij4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAycHg7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NlcGFyYWRvci5naWYnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjwvZGl2Pgo8L2Rpdj4KCQk8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5zZXRpYy51ZnNjLmJyIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJCTxicj4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNCQkJCQkI7Ij7CqSBTZVRJQyAtIFN1cGVyaW50ZW5kw6puY2lhIGRlIEdvdmVybmFuw6dhIEVsZXRyw7RuaWNhIGUgVGVjbm9sb2dpYSBkYSBJbmZvcm1hw6fDo28gZSBDb211bmljYcOnw6NvPC9zcGFuPgoJCTwvZGl2PgoJCTxkaXYgaWQ9IkZvb3RlciIgY2xhc3M9IkFSSUFSb2xlQ29udGVudGluZm8iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYW5uZXIiKSAlXQogICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vdHJzLmNvbS8iIHRpdGxlPSJbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIFRyYW5zbGF0ZSgiUG93ZXJlZCBieSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKS5yZW1vdmUoJ1wuMFwuLionKSAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJhbm5lciIpICVdCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCgoKClslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lckZvb3RlckpTLnR0IikgJV0KCjwvYm9keT4KPC9odG1sPgo=</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+ClslIEluc2VydFRlbXBsYXRlKCJDb3B5cmlnaHQudHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJIVE1MSGVhZE5UV1NlVElDLnR0IikgJV0KCjxib2R5IGNsYXNzPSJOb0phdmFTY3JpcHQiIFslIERhdGEuQm9keUNsYXNzIHwgaHRtbCAlXT4KCQoJCgk8ZGl2IGNsYXNzPSJjb250YWluZXIiPgkJCgkJPGRpdiBjbGFzcz0icGFuZWwiPgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICIgaWQ9ImhlYWRlciIvPjwvZGl2PgoJCgo8IS0tIGVuZCBoZWFkZXIgLS0+Cg==</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIElOQ0xVREUgIkhUTUxIZWFkUmVmcmVzaC50dCIgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFIdHRwRXF1aXZSZWZyZXNoIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJbJSBEYXRhLlJlbCB8IGh0bWwgJV0iIHR5cGU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5IcmVmICVdIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL3Byb2R1Y3QuaWNvIiB0eXBlPSJpbWFnZS9pY28iIC8+CiAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OkltYWdlUGF0aCIpICVdaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi5wbmciIC8+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb21tb25DU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbW1vbkNTUyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNb2R1bGVDU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1vZHVsZUNTUyIpICVdCgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS91aS10aGVtZS9qcXVlcnktdWkuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS9qc3RyZWUtdGhlbWUvZGVmYXVsdC9zdHlsZS5jc3MiIC8+CgogICAgPHRpdGxlPlslIERhdGEuVGl0bGVBcmVhIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3ROYW1lIikgJV08L3RpdGxlPgoKWyUgSU5DTFVERSAiSFRNTEhlYWRCbG9ja0V2ZW50cy50dCIgJV0KCgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCSNoZWFkZXIgewoJCQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL2NhYmVjYWxob1VGU0MuanBnIik7CgkJCWhlaWdodDogOTBweDsKCQkJZGlzcGxheTogYmxvY2s7CgkJfQoJCQoJCWlucHV0W3R5cGU9dGV4dF0sIGlucHV0W3R5cGU9ZW1haWxdLCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CgkJICAgd2lkdGg6IDEwMCU7CgkJfQoJCQoJCWxhYmVsIHsKCQkJZm9udC1zaXplOiAxMDAlOwoJCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJCWZsb2F0OiBub25lOwoJCX0KCQkKCTwvc3R5bGU+Cgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CjwvaGVhZD4K</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.5</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.5">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-06-21 18:27:39</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJmb290ZXJGIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm90dG9tOiAxMHB4OyB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMThweDsgbWFyZ2luLWJvdHRvbTogOHB4OyIgY2xhc3M9Im5vUHJpbnQiPgoKPGRpdiBzdHlsZT0iZm9udC1zaXplOiAwcHg7Ij4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAycHg7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NlcGFyYWRvci5naWYnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjwvZGl2Pgo8L2Rpdj4KCQk8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5zZXRpYy51ZnNjLmJyIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJCTxicj4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNCQkJCQkI7Ij7CqSBTZVRJQyAtIFN1cGVyaW50ZW5kw6puY2lhIGRlIEdvdmVybmFuw6dhIEVsZXRyw7RuaWNhIGUgVGVjbm9sb2dpYSBkYSBJbmZvcm1hw6fDo28gZSBDb211bmljYcOnw6NvPC9zcGFuPgoJCTwvZGl2PgoJCTxkaXYgaWQ9IkZvb3RlciIgY2xhc3M9IkFSSUFSb2xlQ29udGVudGluZm8iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYW5uZXIiKSAlXQogICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vdHJzLmNvbS8iIHRpdGxlPSJbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIFRyYW5zbGF0ZSgiUG93ZXJlZCBieSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKS5yZW1vdmUoJ1wuMFwuLionKSAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJhbm5lciIpICVdCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCgoKClslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lckZvb3RlckpTLnR0IikgJV0KCjwvYm9keT4KPC9odG1sPgo=</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+ClslIEluc2VydFRlbXBsYXRlKCJDb3B5cmlnaHQudHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJIVE1MSGVhZE5UV1NlVElDLnR0IikgJV0KCjxib2R5IGNsYXNzPSJOb0phdmFTY3JpcHQiIFslIERhdGEuQm9keUNsYXNzIHwgaHRtbCAlXT4KCQoJCgk8ZGl2IGNsYXNzPSJjb250YWluZXIiPgkJCgkJPGRpdiBjbGFzcz0icGFuZWwiPgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICIgaWQ9ImhlYWRlciIvPjwvZGl2PgoJCgo8IS0tIGVuZCBoZWFkZXIgLS0+Cg==</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIElOQ0xVREUgIkhUTUxIZWFkUmVmcmVzaC50dCIgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFIdHRwRXF1aXZSZWZyZXNoIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJbJSBEYXRhLlJlbCB8IGh0bWwgJV0iIHR5cGU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5IcmVmICVdIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUxpbmsiKSAlXQogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL3Byb2R1Y3QuaWNvIiB0eXBlPSJpbWFnZS9pY28iIC8+CiAgICA8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OkltYWdlUGF0aCIpICVdaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi5wbmciIC8+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb21tb25DU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbW1vbkNTUyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNb2R1bGVDU1MiKSAlXQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvWyUgRGF0YS5Ta2luIHwgdXJpICVdL1slIERhdGEuQ1NTRGlyZWN0b3J5IHwgaHRtbCAlXS9bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1vZHVsZUNTUyIpICVdCgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS91aS10aGVtZS9qcXVlcnktdWkuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6V2ViUGF0aCIpICVdc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9jc3MvdGhpcmRwYXJ0eS9qc3RyZWUtdGhlbWUvZGVmYXVsdC9zdHlsZS5jc3MiIC8+CgogICAgPHRpdGxlPlslIERhdGEuVGl0bGVBcmVhIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3ROYW1lIikgJV08L3RpdGxlPgoKWyUgSU5DTFVERSAiSFRNTEhlYWRCbG9ja0V2ZW50cy50dCIgJV0KCgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCSNoZWFkZXIgewoJCQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoIi9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL2NhYmVjYWxob1VGU0MuanBnIik7CgkJCWhlaWdodDogOTBweDsKCQkJZGlzcGxheTogYmxvY2s7CgkJfQoJCQoJCWlucHV0W3R5cGU9dGV4dF0sIGlucHV0W3R5cGU9ZW1haWxdLCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CgkJICAgd2lkdGg6IDEwMCU7CgkJfQoJCQoJCWxhYmVsIHsKCQkJZm9udC1zaXplOiAxMDAlOwoJCQl0ZXh0LWFsaWduOiBsZWZ0OwoJCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJCWZsb2F0OiBub25lOwoJCX0KCQkKCTwvc3R5bGU+Cgk8IS0tIEN1c3RvbWl6YWNvZXMgU2VUSUMgLS0+CjwvaGVhZD4K</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.6</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.6">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-06-21 19:01:23</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJmb290ZXJGIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm90dG9tOiAxMHB4OyB3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMThweDsgbWFyZ2luLWJvdHRvbTogOHB4OyIgY2xhc3M9Im5vUHJpbnQiPgoKPGRpdiBzdHlsZT0iZm9udC1zaXplOiAwcHg7Ij4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAycHg7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NlcGFyYWRvci5naWYnKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjwvZGl2Pgo8L2Rpdj4KCQk8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5zZXRpYy51ZnNjLmJyIiB0YXJnZXQ9Il9ibGFuayI+PGltZyBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJCTxicj4KCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA0cHg7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNCQkJCQkI7Ij7CqSBTZVRJQyAtIFN1cGVyaW50ZW5kw6puY2lhIGRlIEdvdmVybmFuw6dhIEVsZXRyw7RuaWNhIGUgVGVjbm9sb2dpYSBkYSBJbmZvcm1hw6fDo28gZSBDb211bmljYcOnw6NvPC9zcGFuPgoJCTwvZGl2PgoJCTxkaXYgaWQ9IkZvb3RlciIgY2xhc3M9IkFSSUFSb2xlQ29udGVudGluZm8iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYW5uZXIiKSAlXQogICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vdHJzLmNvbS8iIHRpdGxlPSJbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIFRyYW5zbGF0ZSgiUG93ZXJlZCBieSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKS5yZW1vdmUoJ1wuMFwuLionKSAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJhbm5lciIpICVdCiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8L2Rpdj4KCgoKClslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lckZvb3RlckpTLnR0IikgJV0KCjwvYm9keT4KPC9odG1sPgo=</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+ClslIEluc2VydFRlbXBsYXRlKCJDb3B5cmlnaHQudHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiQ3VzdG9tZXJIVE1MSGVhZE5UV1NlVElDLnR0IikgJV0KCjxib2R5IGNsYXNzPSJOb0phdmFTY3JpcHQiIFslIERhdGEuQm9keUNsYXNzIHwgaHRtbCAlXT4KCQoJCgk8ZGl2IGNsYXNzPSJjb250YWluZXIiPgkJCgkJPGRpdiBjbGFzcz0icGFuZWwiPgk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nICIgaWQ9ImhlYWRlciIvPjwvZGl2PgoJCgo8IS0tIGVuZCBoZWFkZXIgLS0+Cg==</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUh0dHBFcXVpdlJlZnJlc2giKSAlXQpbJSBJTkNMVURFICJIVE1MSGVhZFJlZnJlc2gudHQiICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGFMaW5rIikgJV0KICAgIDxsaW5rIHJlbD0iWyUgRGF0YS5SZWwgfCBodG1sICVdIiB0eXBlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuSHJlZiAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFMaW5rIikgJV0KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6SW1hZ2VQYXRoIikgJV1pY29ucy9wcm9kdWN0LmljbyIgdHlwZT0iaW1hZ2UvaWNvIiAvPgogICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL2FwcGxlLXRvdWNoLWljb24ucG5nIiAvPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29tbW9uQ1NTIikgJV0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL1slIERhdGEuU2tpbiB8IHVyaSAlXS9bJSBEYXRhLkNTU0RpcmVjdG9yeSB8IGh0bWwgJV0vWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrRW5kKCJDb21tb25DU1MiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTW9kdWxlQ1NTIikgJV0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL1slIERhdGEuU2tpbiB8IHVyaSAlXS9bJSBEYXRhLkNTU0RpcmVjdG9yeSB8IGh0bWwgJV0vWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrRW5kKCJNb2R1bGVDU1MiKSAlXQoKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL3RoaXJkcGFydHkvdWktdGhlbWUvanF1ZXJ5LXVpLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL3RoaXJkcGFydHkvanN0cmVlLXRoZW1lL2RlZmF1bHQvc3R5bGUuY3NzIiAvPgoKICAgIDx0aXRsZT5bJSBEYXRhLlRpdGxlQXJlYSB8IGh0bWwgJV0gWyUgQ29uZmlnKCJQcm9kdWN0TmFtZSIpICVdPC90aXRsZT4KClslIElOQ0xVREUgIkhUTUxIZWFkQmxvY2tFdmVudHMudHQiICVdCgoJPCEtLSBDdXN0b21pemFjb2VzIFNlVElDIC0tPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCQkjaGVhZGVyIHsKCQkJYmFja2dyb3VuZC1pbWFnZTogdXJsKCIvb3Rycy13ZWIvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9pbWFnZXMvdWZzYy9jYWJlY2FsaG9VRlNDLmpwZyIpOwoJCQloZWlnaHQ6IDkwcHg7CgkJCWRpc3BsYXk6IGJsb2NrOwoJCX0KCQkKCQlpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPWVtYWlsXSwgaW5wdXRbdHlwZT1wYXNzd29yZF0gewoJCSAgIHdpZHRoOiAxMDAlOwoJCX0KCQkKCQlsYWJlbCB7CgkJCWZvbnQtc2l6ZTogMTAwJTsKCQkJdGV4dC1hbGlnbjogbGVmdDsKCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQlmbG9hdDogbm9uZTsKCQl9CgkJCgk8L3N0eWxlPgoJPCEtLSBDdXN0b21pemFjb2VzIFNlVElDIC0tPgo8L2hlYWQ+Cg==</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.7</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.7">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-07-06 18:53:51</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8L2Rpdj4KCjxkaXYgaWQ9ImZvb3RlckYiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJib3R0b206IDEwcHg7IHdpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7IiBjbGFzcz0ibm9QcmludCI+Cgk8ZGl2IHN0eWxlPSJmb250LXNpemU6IDBweDsiPgoJCTxkaXYgc3R5bGU9ImhlaWdodDogMnB4OyB3aWR0aDogMTAwJTsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcvb3Rycy13ZWIvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9pbWFnZXMvdWZzYy9zZXBhcmFkb3IuZ2lmJyk7IGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7Ij48L2Rpdj4KCTwvZGl2PgoJPGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cuc2V0aWMudWZzYy5iciIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgYWx0PSJMb2dvIFNlVElDIiBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJPGJyPgoJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogNHB4OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjQkJCQkJCOyI+wqkgU2VUSUMgLSBTdXBlcmludGVuZMOqbmNpYSBkZSBHb3Zlcm5hbsOnYSBFbGV0csO0bmljYSBlIFRlY25vbG9naWEgZGEgSW5mb3JtYcOnw6NvIGUgQ29tdW5pY2HDp8Ojbzwvc3Bhbj48L2Rpdj4KPC9kaXY+CgoKWyUgSW5zZXJ0VGVtcGxhdGUoIkN1c3RvbWVyRm9vdGVySlMudHQiKSAlXQoKPC9ib2R5Pgo8L2h0bWw+Cg==</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KPGh0bWwgbGFuZz0iYnIiPgpbJSBJbnNlcnRUZW1wbGF0ZSgiQ29weXJpZ2h0LnR0IikgJV0KWyUgSW5zZXJ0VGVtcGxhdGUoIkN1c3RvbWVySFRNTEhlYWROVFdTZVRJQy50dCIpICVdCgo8Ym9keSBsYW5nPSJiciIgY2xhc3M9Ik5vSmF2YVNjcmlwdCIgWyUgRGF0YS5Cb2R5Q2xhc3MgfCBodG1sICVdPgoJCgk8ZGl2IGNsYXNzPSJwYW5lbCI+CTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmcgIiBpZD0iaGVhZGVyIi8+PC9kaXY+CgkKCTxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CQkKCQkKCQoKPCEtLSBlbmQgaGVhZGVyIC0tPgo=</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUh0dHBFcXVpdlJlZnJlc2giKSAlXQpbJSBJTkNMVURFICJIVE1MSGVhZFJlZnJlc2gudHQiICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGFMaW5rIikgJV0KICAgIDxsaW5rIHJlbD0iWyUgRGF0YS5SZWwgfCBodG1sICVdIiB0eXBlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuSHJlZiAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFMaW5rIikgJV0KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6SW1hZ2VQYXRoIikgJV1pY29ucy9wcm9kdWN0LmljbyIgdHlwZT0iaW1hZ2UvaWNvIiAvPgogICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL2FwcGxlLXRvdWNoLWljb24ucG5nIiAvPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29tbW9uQ1NTIikgJV0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL1slIERhdGEuU2tpbiB8IHVyaSAlXS9bJSBEYXRhLkNTU0RpcmVjdG9yeSB8IGh0bWwgJV0vWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrRW5kKCJDb21tb25DU1MiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTW9kdWxlQ1NTIikgJV0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL1slIERhdGEuU2tpbiB8IHVyaSAlXS9bJSBEYXRhLkNTU0RpcmVjdG9yeSB8IGh0bWwgJV0vWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrRW5kKCJNb2R1bGVDU1MiKSAlXQoKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL3RoaXJkcGFydHkvdWktdGhlbWUvanF1ZXJ5LXVpLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL3RoaXJkcGFydHkvanN0cmVlLXRoZW1lL2RlZmF1bHQvc3R5bGUuY3NzIiAvPgoKICAgIDx0aXRsZT5bJSBEYXRhLlRpdGxlQXJlYSB8IGh0bWwgJV0gWyUgQ29uZmlnKCJQcm9kdWN0TmFtZSIpICVdPC90aXRsZT4KClslIElOQ0xVREUgIkhUTUxIZWFkQmxvY2tFdmVudHMudHQiICVdCgoJPCEtLSBDdXN0b21pemFjb2VzIFNlVElDIC0tPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCQkjaGVhZGVyIHsKCQkJYmFja2dyb3VuZC1pbWFnZTogdXJsKCIvb3Rycy13ZWIvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9pbWFnZXMvdWZzYy9jYWJlY2FsaG9VRlNDLmpwZyIpOwoJCQlkaXNwbGF5OiBibG9jazsKCQkJaGVpZ2h0OiA5MHB4OwoJCX0KCQkKCQlpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPWVtYWlsXSwgaW5wdXRbdHlwZT1wYXNzd29yZF0gewoJCSAgIHdpZHRoOiAxMDAlOwoJCX0KCQkKCQlsYWJlbCB7CgkJCWZvbnQtc2l6ZTogMTAwJTsKCQkJdGV4dC1hbGlnbjogbGVmdDsKCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQlmbG9hdDogbm9uZTsKCQkJd2lkdGg6IGF1dG87CgkJfQoJCQoJPC9zdHlsZT4KCTwhLS0gQ3VzdG9taXphY29lcyBTZVRJQyAtLT4KPC9oZWFkPgo=</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | |
| 2 | +<otrs_package version="1.1"> | |
| 3 | + <Name>NewTicketWizardSeTIC</Name> | |
| 4 | + <Version>3.0.8</Version> | |
| 5 | + <Vendor>SeTIC</Vendor> | |
| 6 | + <URL>http://www.setic.ufsc.br</URL> | |
| 7 | + <License>GPLv2</License> | |
| 8 | + <ChangeLog version="1.0.0">First version</ChangeLog> | |
| 9 | + <ChangeLog version="1.0.1">Media separation</ChangeLog> | |
| 10 | + <ChangeLog version="3.0.8">Support for bootstrap</ChangeLog> | |
| 11 | + <Description>NewTicket Wizard Module Template for SeTIC</Description> | |
| 12 | + <Framework>5.0.x</Framework> | |
| 13 | + <IntroInstall Title="Thank you" Type="post">New Ticket Wizard SeTIC Template module installed successfully!</IntroInstall> | |
| 14 | + <BuildDate>2017-07-06 18:55:53</BuildDate> | |
| 15 | + <BuildHost>yourhost.example.com</BuildHost> | |
| 16 | + <Filelist> | |
| 17 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerFooterNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVyRm9vdGVyUVBVRlNDLnR0IC0gRm9vdGVyIHBhcmEgUXVldWVzIFBhbmVsIG5hIFVGU0MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8L2Rpdj4KCjxkaXYgaWQ9ImZvb3RlckYiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJib3R0b206IDEwcHg7IHdpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7IiBjbGFzcz0ibm9QcmludCI+Cgk8ZGl2IHN0eWxlPSJmb250LXNpemU6IDBweDsiPgoJCTxkaXYgc3R5bGU9ImhlaWdodDogMnB4OyB3aWR0aDogMTAwJTsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcvb3Rycy13ZWIvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9pbWFnZXMvdWZzYy9zZXBhcmFkb3IuZ2lmJyk7IGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7Ij48L2Rpdj4KCTwvZGl2PgoJPGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cuc2V0aWMudWZzYy5iciIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgYWx0PSJMb2dvIFNlVElDIiBzcmM9Ii9vdHJzLXdlYi9za2lucy9DdXN0b21lci9kZWZhdWx0L2ltYWdlcy91ZnNjL3NldGljLnBuZyIgc3R5bGU9ImJvcmRlci1zdHlsZTogbm9uZSI+PC9hPgoJPGJyPgoJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogNHB4OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjQkJCQkJCOyI+wqkgU2VUSUMgLSBTdXBlcmludGVuZMOqbmNpYSBkZSBHb3Zlcm5hbsOnYSBFbGV0csO0bmljYSBlIFRlY25vbG9naWEgZGEgSW5mb3JtYcOnw6NvIGUgQ29tdW5pY2HDp8Ojbzwvc3Bhbj48L2Rpdj4KPC9kaXY+CgoKWyUgSW5zZXJ0VGVtcGxhdGUoIkN1c3RvbWVyRm9vdGVySlMudHQiKSAlXQoKPC9ib2R5Pgo8L2h0bWw+Cg==</File> | |
| 18 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHeaderNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIEN1c3RvbWVySGVhZGVyUVBVRlNDLnR0IC0gcHJvdmlkZXMgZ2xvYmFsIEhUTUwgaGVhZGVyIGZvciBVRlNDCiMgQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNyBTZVRJQyAtIFVGU0MgLSBodHRwOi8vc2V0aWMudWZzYy5ici8KIwojIFZlcnNpb24gMjAxNy0wNi0xNiAtIFN1cHBvcnQgZm9yIGJvb3RzdHJhcAojCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslLSBJTkNMVURFICJIVFRQSGVhZGVycy50dCIgLSVdCgo8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KPGh0bWwgbGFuZz0iYnIiPgpbJSBJbnNlcnRUZW1wbGF0ZSgiQ29weXJpZ2h0LnR0IikgJV0KWyUgSW5zZXJ0VGVtcGxhdGUoIkN1c3RvbWVySFRNTEhlYWROVFdTZVRJQy50dCIpICVdCgo8Ym9keSBsYW5nPSJiciIgY2xhc3M9Ik5vSmF2YVNjcmlwdCIgWyUgRGF0YS5Cb2R5Q2xhc3MgfCBodG1sICVdPgoJCgk8ZGl2IGNsYXNzPSJwYW5lbCI+CTxkaXYgY2xhc3M9InBhbmVsLWhlYWRpbmcgIiBpZD0iaGVhZGVyIi8+PC9kaXY+CgkKCTxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CQkKCQkKCQoKPCEtLSBlbmQgaGVhZGVyIC0tPgo=</File> | |
| 19 | + <File Location="Kernel/Output/HTML/Templates/Standard/CustomerHTMLHeadNTWSeTIC.tt" Permission="644" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUh0dHBFcXVpdlJlZnJlc2giKSAlXQpbJSBJTkNMVURFICJIVE1MSGVhZFJlZnJlc2gudHQiICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSHR0cEVxdWl2UmVmcmVzaCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGFMaW5rIikgJV0KICAgIDxsaW5rIHJlbD0iWyUgRGF0YS5SZWwgfCBodG1sICVdIiB0eXBlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuSHJlZiAlXSIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFMaW5rIikgJV0KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iWyUgQ29uZmlnKCJGcm9udGVuZDo6SW1hZ2VQYXRoIikgJV1pY29ucy9wcm9kdWN0LmljbyIgdHlwZT0iaW1hZ2UvaWNvIiAvPgogICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJbJSBDb25maWcoIkZyb250ZW5kOjpJbWFnZVBhdGgiKSAlXWljb25zL2FwcGxlLXRvdWNoLWljb24ucG5nIiAvPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29tbW9uQ1NTIikgJV0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL1slIERhdGEuU2tpbiB8IHVyaSAlXS9bJSBEYXRhLkNTU0RpcmVjdG9yeSB8IGh0bWwgJV0vWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrRW5kKCJDb21tb25DU1MiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTW9kdWxlQ1NTIikgJV0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL1slIERhdGEuU2tpbiB8IHVyaSAlXS9bJSBEYXRhLkNTU0RpcmVjdG9yeSB8IGh0bWwgJV0vWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrRW5kKCJNb2R1bGVDU1MiKSAlXQoKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL3RoaXJkcGFydHkvdWktdGhlbWUvanF1ZXJ5LXVpLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXXNraW5zL0N1c3RvbWVyL2RlZmF1bHQvY3NzL3RoaXJkcGFydHkvanN0cmVlLXRoZW1lL2RlZmF1bHQvc3R5bGUuY3NzIiAvPgoKICAgIDx0aXRsZT5bJSBEYXRhLlRpdGxlQXJlYSB8IGh0bWwgJV0gWyUgQ29uZmlnKCJQcm9kdWN0TmFtZSIpICVdPC90aXRsZT4KClslIElOQ0xVREUgIkhUTUxIZWFkQmxvY2tFdmVudHMudHQiICVdCgoJPCEtLSBDdXN0b21pemFjb2VzIFNlVElDIC0tPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCQkjaGVhZGVyIHsKCQkJYmFja2dyb3VuZC1pbWFnZTogdXJsKCIvb3Rycy13ZWIvc2tpbnMvQ3VzdG9tZXIvZGVmYXVsdC9pbWFnZXMvdWZzYy9jYWJlY2FsaG9VRlNDLmpwZyIpOwoJCQlkaXNwbGF5OiBibG9jazsKCQkJaGVpZ2h0OiA5MHB4OwoJCX0KCQkKCQlpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPWVtYWlsXSwgaW5wdXRbdHlwZT1wYXNzd29yZF0gewoJCSAgIHdpZHRoOiAxMDAlOwoJCX0KCQkKCQlsYWJlbCB7CgkJCWZvbnQtc2l6ZTogMTAwJTsKCQkJdGV4dC1hbGlnbjogbGVmdDsKCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQlmbG9hdDogbm9uZTsKCQkJd2lkdGg6IGF1dG87CgkJfQoJCQoJPC9zdHlsZT4KCTwhLS0gQ3VzdG9taXphY29lcyBTZVRJQyAtLT4KPC9oZWFkPgo=</File> | |
| 20 | + </Filelist> | |
| 21 | +</otrs_package> | |
| 0 | 22 | \ No newline at end of file | ... | ... |
var/httpd/htdocs/js/NewTicketWizard.js
| ... | ... | @@ -51,7 +51,8 @@ var postRenderCallback = function(form) { |
| 51 | 51 | |
| 52 | 52 | if (form) { |
| 53 | 53 | $('.selectpicker').selectpicker(); |
| 54 | - $("[name='service']").val($("#ServiceID").val()); | |
| 54 | + $('.selectpicker').selectpicker('val', $("#ServiceID").val()); | |
| 55 | + //$("[name='service']").val(); | |
| 55 | 56 | $("[name='FormID']").val(form.data.FormID); |
| 56 | 57 | $("[name='submit']").css("font-size", "18px"); |
| 57 | 58 | |
| ... | ... | @@ -93,7 +94,7 @@ var postRenderCallbackPublic = function(form) { |
| 93 | 94 | |
| 94 | 95 | if (form) { |
| 95 | 96 | $('.selectpicker').selectpicker(); |
| 96 | - $("[name='service']").val($("#ServiceID").val()); | |
| 97 | + //$("[name='service']").val($("#ServiceID").val()); | |
| 97 | 98 | $("[name='FormID']").val(form.data.FormID); |
| 98 | 99 | $("[name='submit']").css("font-size", "18px"); |
| 99 | 100 | ... | ... |
var/httpd/htdocs/js/thirdparty/alpaca/alpaca.min.js
| ... | ... | @@ -1124,7 +1124,7 @@ this["HandlebarsPrecompiled"]["web-edit"]["control-select"] = Handlebars.templat |
| 1124 | 1124 | },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { |
| 1125 | 1125 | var stack1, helper, alias1=depth0 != null ? depth0 : {}; |
| 1126 | 1126 | |
| 1127 | - return "<script type=\"text/x-handlebars-template\">\n\n <select data-live-search-normalize=\"true\" data-live-search=\"true\" class=\"selectpicker\" id=\"" | |
| 1127 | + return "<script type=\"text/x-handlebars-template\">\n\n <select id=\"" | |
| 1128 | 1128 | + container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"id","hash":{},"data":data}) : helper))) |
| 1129 | 1129 | + "\" " |
| 1130 | 1130 | + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.options : depth0)) != null ? stack1.readonly : stack1),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") |
| ... | ... | @@ -32040,7 +32040,8 @@ this["HandlebarsPrecompiled"]["bootstrap-edit"]["message"] = Handlebars.template |
| 32040 | 32040 | "chooseFiles": "Escolher arquivos...", |
| 32041 | 32041 | "dropZoneSingle": "Clique em Escolher ou arraste um arquivo aqui...", |
| 32042 | 32042 | "dropZoneMultiple": "Clique em Escolher ou arraste arquivos aqui...", |
| 32043 | - "fileTooBig": "Arquivo muito grande: " | |
| 32043 | + "fileTooBig": "Arquivo muito grande: ", | |
| 32044 | + "nonSelectedText": "-" | |
| 32044 | 32045 | } |
| 32045 | 32046 | } |
| 32046 | 32047 | }); | ... | ... |
var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.fileupload.js
100644 → 100755
var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.iframe-transport.js
100644 → 100755
var/httpd/htdocs/js/thirdparty/jqueryfileupload/jquery.ui.widget.js
100644 → 100755